在使用 stack='identity'
绘制堆积条形图时,我注意到每个条形图中堆栈的顺序是不同的,看似随机 . 这是使用 stat='bin'
的图,也就是说,ggplot在绘图之前动态计算每个类别中的元素数量( data.table
稍后会出现):
library(ggplot2)
library(data.table)
diamonds <- data.table(diamonds)
ggplot(diamonds, aes(clarity, fill = cut)) + geom_bar(position="fill")
在每个条形图中,'cut'的顺序遵循因子顺序 . 但是,如果我在绘图前总结,并使用 stat=identity
,则此订单将丢失:
diamonds_sum <- diamonds[, list(.N), by=list(cut, clarity)]
ggplot(diamonds_sum, aes(clarity, y=N, fill = cut)) + geom_bar(stat="identity", position="fill")
尽管两个表中的级别顺序相同,但仍会发生这种情况:
levels(diamonds_sum$cut) == levels(diamonds$cut)
[1] TRUE TRUE TRUE TRUE TRUE
所以问题是2倍:(i)为什么堆栈的顺序不一样? (ii)如何解决这个问题?
简单的解决方案当然一直使用 stat='bin'
,但是我的真实数据集有几个百万条目,总结然后绘图更快 .
1 回答
原因是在汇总后,新订单中的订单会混淆.
ggplot2
将行的顺序作为输入 . 比较例如以下两种方法的输出(只显示前10行,因为它们说明差异足够好):如您所见,原始代码导致混合行,而第二种方法导致行顺序 . 所以,当你这样做时:
然后用:
你得到了理想的结果:
此外
dplyr
会给你相同的行为 . 然后,您需要arrange
才能获得正确的订单 . 比较以下两个的输出:用基数R汇总不会导致您描述的问题 . 当你这样做时:
然后用:
你得到了正确的结果: