擅长:python、mysql、java
<p>这是一个没有刻面的解决方案。首先,创建数据帧。我使用了从1到20的值来确保所有值都不是负的(对于人口金字塔,您不会得到负的计数/年龄)。</p>
<pre><code>test <- data.frame(v=sample(1:20,1000,replace=T), g=c('M','F'))
</code></pre>
<p>然后分别为每个<code>g</code>值组合两个<code>geom_bar()</code>调用。对于<code>F</code>计数按原样计算,但是对于<code>M</code>计数乘以-1得到相反方向的bar。然后使用<code>scale_y_continuous()</code>获取轴的漂亮值。</p>
<pre><code>require(ggplot2)
require(plyr)
ggplot(data=test,aes(x=as.factor(v),fill=g)) +
geom_bar(subset=.(g=="F")) +
geom_bar(subset=.(g=="M"),aes(y=..count..*(-1))) +
scale_y_continuous(breaks=seq(-40,40,10),labels=abs(seq(-40,40,10))) +
coord_flip()
</code></pre>
<h2>更新</h2>
<p>由于参数<code>subset=.</code>在最新的<code>ggplot2</code>版本中被弃用,因此可以用函数<code>subset()</code>匹配相同的结果。</p>
<pre><code>ggplot(data=test,aes(x=as.factor(v),fill=g)) +
geom_bar(data=subset(test,g=="F")) +
geom_bar(data=subset(test,g=="M"),aes(y=..count..*(-1))) +
scale_y_continuous(breaks=seq(-40,40,10),labels=abs(seq(-40,40,10))) +
coord_flip()
</code></pre>
<p><img src="https://i.stack.imgur.com/Cl6wL.jpg" alt="enter image description here"/></p>