我正在努力在使用R中的ggplot2制作的图形中获得正确的变量排序。
假设我有一个数据框如下:
set.seed(1234)
my_df<- data.frame(matrix(0,8,4))
names(my_df) <- c("year", "variable", "value", "vartype")
my_df$year <- rep(2006:2007)
my_df$variable <- c(rep("VX",2),rep("VB",2),rep("VZ",2),rep("VD",2))
my_df$value <- runif(8, 5,10)
my_df$vartype<- c(rep("TA",4), rep("TB",4))
生成以下表格:
year variable value vartype
1 2006 VX 5.568517 TA
2 2007 VX 8.111497 TA
3 2006 VB 8.046374 TA
4 2007 VB 8.116897 TA
5 2006 VZ 9.304577 TB
6 2007 VZ 8.201553 TB
7 2006 VD 5.047479 TB
8 2007 VD 6.162753 TB
有四个变量(VX, VB, VZ和VD),属于两种不同的变量类型组(TA和TB)。
我想画出这些值作为水平条形图,首先按照变量组再按照变量名称垂直排序,分面显示年份,将值放在x轴上,填充颜色对应变量组。(即在这个简化的例子中,顺序应为VB、VX、VD、VZ)
1) 我的第一次尝试是尝试以下方法:
ggplot(my_df,
aes(x=variable, y=value, fill=vartype, order=vartype)) +
# adding or removing the aesthetic "order=vartype" doesn't change anything
geom_bar() +
facet_grid(. ~ year) +
coord_flip()
然而,变量按照字母顺序相反的顺序列出,而不是按照 vartype 排序:
order=vartype
美学效果被忽略。
2)根据我昨天发布的类似问题的答案,我尝试了以下操作,基于Order Bars in ggplot2 bar graph帖子:
my_df$variable <- factor(
my_df$variable,
levels=rev(sort(unique(my_df$variable))),
ordered=TRUE
)
这种方法确实可以按字母顺序垂直排列绘图中的变量,但忽略了变量应该首先按变量组进行排序(TA变量在顶部,TB变量在底部)。
3) 下面的代码与2相同(见上文):
my_df$vartype <- factor(
my_df$vartype,
levels=sort(unique(my_df$vartype)),
ordered=TRUE
)
...这与第一种方法存在相同的问题(变量按反向字母顺序列出,组被忽略)
4)另一种方法基于对Order Bars in ggplot2 bar graph的原始答案,也会得到与上述第2种方法相同的结果
my_df <- within(my_df,
vartype <- factor(vartype,
levels=names(sort(table(vartype),
decreasing=TRUE)))
)
我对这个事实感到困惑,尽管有几种方法,美学order=vartype
仍被忽略。不过,它似乎在一个无关的问题中起作用:http://learnr.wordpress.com/2010/03/23/ggplot2-changing-the-default-order-of-legend-labels-and-stacking-of-data/
希望问题清楚,并欢迎任何建议。
Matteo
我昨天发布了一个类似的问题,但不幸的是,我在描述问题和提供可复制的示例时犯了几个错误。 自那以来,我听取了几个建议,并在stakoverflow上彻底搜索了类似的问题并应用了我所知道的每种建议组合,但都没有成功。 我再次发布问题,希望能够解决我的问题,并希望对其他人有所帮助。