如何在R的ggplot中绘制类似geom_bar的计数型棒棒糖图?
嘿,我来帮你搞定这个棒棒糖图的问题!你遇到的核心问题是**geom_segment默认没有启用计数统计**,所以它识别不了..count..这个临时变量——而你用geom_point(stat="count")的时候,已经触发了计数计算,所以能正常工作。
下面给你两种可行的解决方案,选哪个看你习惯:
方案1:给geom_segment也加上stat="count"
你只需要让geom_segment也执行计数统计,这样它就能访问到..count..变量了。注意把固定值y=0放在aes()外面,因为它不需要映射数据:
data %>% ggplot(aes(x = x)) + # 先画线段,这样点会显示在线段上方,更符合棒棒糖图逻辑 geom_segment(stat = "count", aes(xend = x, yend = ..count..), y = 0) + geom_point(stat = "count", aes(y = ..count..))
这里我特意把geom_segment放在前面,让点叠加在线段上;另外给geom_point明确写上y=..count..,虽然之前可能隐含这个映射,但这样代码更清晰,不容易踩坑。
方案2:提前统计数据(更推荐)
其实用ggplot的stat虽然方便,但提前用dplyr统计好数据,代码可读性会更高,也更容易调试:
library(dplyr) # 先统计每个x的出现次数,结果会生成一个名为n的计数列 data %>% count(x) %>% ggplot(aes(x = x, y = n)) + geom_segment(aes(xend = x, yend = 0)) + geom_point()
这种方式你能直接看到统计后的数据集,明确知道每个x对应的计数是多少,后续如果要调整样式、添加数值标签之类的操作,也会更顺手。
为什么原来的代码不行?
再给你理清楚逻辑:geom_point(stat="count")会告诉ggplot“帮我计算每个x的出现次数”,这时候ggplot会生成一个临时的..count..变量供这个图层使用。但geom_segment默认用的是stat="identity"(也就是直接使用原始数据),它不会生成..count..变量,所以你写yend=..count..的时候,它找不到这个值,自然就无法正常渲染啦。
内容的提问来源于stack exchange,提问作者Ruan Coelho
相关产品推荐
相关产品推荐

