我正在调用ggplot函数
ggplot(data,aes(x,y,fill=category)+geom_bar(stat="identity")
结果是一个条形图,条形图由对应于类别的各种颜色填充。但是,从条到条的颜色排序并不一致。说有粉红色,绿色和蓝色。有些酒吧从下到上呈粉红色,绿色,蓝色,有些则呈绿色,粉红色,蓝色。我没有看到任何明显的模式。
如何选择这些排序?我该怎么改变它?至少,我如何让ggplot选择一致的排序?
(x,y和category)的类分别是(整数,数字和因子)。如果我将类别设为有序因子,则不会更改此行为。
任何人都知道如何解决这个问题?
可重复的例子:
dput(data)
structure(list(mon = c(9L, 10L, 11L, 10L, 8L, 7L, 7L, 11L, 9L,
10L, 12L, 11L, 7L, 12L, 8L, 12L, 9L, 7L, 9L, 10L, 10L, 8L, 12L,
7L, 11L, 10L, 8L, 7L, 11L, 12L, 12L, 9L, 9L, 7L, 7L, 12L, 12L,
9L, 9L, 8L), gclass = structure(c(9L, 1L, 8L, 6L, 4L, 4L, 3L,
6L, 2L, 4L, 1L, 1L, 5L, 7L, 1L, 6L, 8L, 6L, 4L, 7L, 8L, 7L, 9L,
8L, 3L, 5L, 9L, 2L, 7L, 3L, 5L, 5L, 7L, 7L, 9L, 2L, 4L, 1L, 3L,
8L), .Label = c("Down-Down", "Down-Stable", "Down-Up", "Stable-Down",
"Stable-Stable", "Stable-Up", "Up-Down", "Up-Stable", "Up-Up"
), class = c("ordered", "factor")), NG = c(222614.67, 9998.17,
351162.2, 37357.95, 4140.48, 1878.57, 553.86, 40012.25, 766.52,
15733.36, 90676.2, 45000.29, 0, 375699.84, 2424.21, 93094.21,
120547.69, 291.33, 1536.38, 167352.21, 160347.01, 26851.47, 725689.06,
4500.55, 10644.54, 75132.98, 42676.41, 267.65, 392277.64, 33854.26,
384754.67, 7195.93, 88974.2, 20665.79, 7185.69, 45059.64, 60576.96,
3564.53, 1262.39, 9394.15)), .Names = c("mon", "gclass", "NG"
), row.names = c(NA, -40L), class = "data.frame")
ggplot(data,aes(mon,NG,fill=gclass))+geom_bar(stat="identity")
答案 0 :(得分:46)
从ggplot2_2.0.0开始,order
美学不再可用。要获得按填充颜色排序的堆栈图表,您只需按要排序的分组变量对数据集进行排序。
我经常使用 dplyr 中的arrange
。在这里,我按照fill
调用中的ggplot
因素对数据集进行排序,而不是创建有序数据集,但两者都可以正常工作。
library(dplyr)
ggplot(arrange(data, gclass), aes(mon, NG, fill = gclass)) +
geom_bar(stat = "identity")
这很容易在基数R中完成,当然,使用带有提取括号的经典order
:
ggplot(data[order(data$gclass), ], aes(mon, NG, fill = gclass)) +
geom_bar(stat = "identity")
ggplot2_2.2.0更新
在ggplot_2.2.0中,填充顺序基于因子级别的顺序。默认顺序将绘制堆栈 top 的第一个级别而不是底部。
如果您希望第一级位于堆栈底部,则可以在reverse = TRUE
中使用position_stack
。请注意,您还可以使用geom_col
作为geom_bar(stat = "identity")
的快捷方式。
ggplot(data, aes(mon, NG, fill = gclass)) +
geom_col(position = position_stack(reverse = TRUE))
答案 1 :(得分:23)
您还需要指定order
美学。
ggplot(data,aes(mon,NG,fill=gclass,order=gclass))+
geom_bar(stat="identity")
这可能是也可能不是bug。
答案 2 :(得分:5)
要订购,您必须使用levels
参数并通知订单。像这样:
data$gclass
(data$gclass2 <- factor(data$gclass,levels=sample(levels(data$gclass)))) # Look the difference in the factors order
ggplot(data,aes(mon,NG,fill=gclass2))+geom_bar(stat="identity")
答案 3 :(得分:4)
您可以使用scale_fill_
功能更改颜色。例如:
ggplot(dd,aes(mon,NG,fill=gclass)) +
geom_bar(stat="identity") +
scale_fill_brewer(palette="blues")
要在bars
中获得一致的排序,您需要订购数据框:
dd = dd[with(dd, order(gclass, -NG)), ]
要更改图例的顺序,请更改gclass
因子。如下所示:
dd$gclass= factor(dd$gclass,levels=sort(levels(dd$gclass), TRUE))
答案 4 :(得分:0)
在@aosmith的答案的基础上,我发现更直观的另一种订购酒吧的方式是:
{07e7c579-5eef-43c7-8560-ec7682868344}
基本统计数据包中的重排序功能的美丽之处在于,您可以将其应用在ggplot(data, aes(x=mon, y=reorder(NG,gclass), fill = gclass)) +
geom_bar(stat = "identity")
中,其中y是基于sum_on_dimension排序的,具有求和,均值等功能。
答案 5 :(得分:0)
由于此交换首先显示为“因子填充顺序”,所以我将添加一个解决方案,我认为这会更加简单一些,并且不需要更改基础数据。
ggplot(data,aes(x,y,fill=factor(category, levels = c("Down-Down", "Down-Stable", "Down-Up", "Stable-Down", "Stable-Stable", "Stable-Down", "Up-Down", "Up-Stable", "Up-Up"))) +
geom_col(position = position_stack(reverse = FALSE))
或者,根据我的喜好,我首先创建一个变量向量,以简化编码并使其更易于编辑:
v_factor_levels <- c("Down-Down", "Down-Stable", "Down-Up", "Stable-Down", "Stable-Stable", "Stable-Down", "Up-Down", "Up-Stable", "Up-Up")
ggplot(data,aes(x,y,fill=factor(category, levels = v_factor_levels)) +
geom_col(position = position_stack(reverse = FALSE))
您不需要在geom_col()中使用position元素,在需要反转时我会提醒您,但您可以通过消除它来进一步简化。