gpt4 book ai didi

r - 使用 coord_flip() 的 ggplot2 条形图中的图例条目顺序

转载 作者:行者123 更新时间:2023-12-04 01:04:34 26 4
gpt4 key购买 nike

我正在努力在我用 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)。

我想将值绘制为 y 轴上的水平条, 首先按变量组垂直排序,然后按变量名称 ,按年份分面,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审美被忽略了。

enter image description here

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 变量)。

enter image description here

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/

我希望问题很清楚,欢迎任何建议。

马泰奥

我昨天发布了一个类似的问题,但不幸的是,在描述问题并提供可重现的示例时,我犯了几个错误。
从那以后,我听取了一些建议,并且 彻底搜索了 stakoverflow 的类似问题,并据我所知,应用了每个建议的解决方案组合,但无济于事。
我再次发布问题,希望能够解决我的问题,并希望对其他人有所帮助。

最佳答案

这与关系不大ggplot ,而是一个关于生成变量排序以用于重新排序因子水平的问题。这是您的数据,使用各种功能实现以获得更好的效果:

set.seed(1234)
df2 <- data.frame(year = rep(2006:2007),
variable = rep(c("VX","VB","VZ","VD"), each = 2),
value = runif(8, 5,10),
vartype = rep(c("TA","TB"), each = 4))

注意这种方式 variablevartype是因素。如果不是因素, ggplot()将强制他们,然后你会得到按字母顺序排列。我以前说过这句话,毫无疑问会再说一遍;将您的数据转换成正确的格式 第一 在开始绘图/进行数据分析之前。

您需要以下顺序:
> with(df2, order(vartype, variable))
[1] 3 4 1 2 7 8 5 6

您应该注意到,我们通过 vartype 获得订单首先,然后才由 variablevartype 的级别内.如果我们使用它来重新排序 variable 的级别我们得到:
> with(df2, reorder(variable, order(vartype, variable)))
[1] VX VX VB VB VZ VZ VD VD
attr(,"scores")
VB VD VX VZ
1.5 5.5 3.5 7.5
Levels: VB VX VD VZ

(忽略 attr(,"scores") 位并专注于级别)。这有正确的顺序,但 ggplot()将它们从下到上绘制,你想要从上到下。我对 ggplot() 不够熟悉要知道这是否可以控制,因此我们还需要使用 decreasing = TRUE 来颠倒顺序在调用 order() .

把这一切放在一起,我们有:
## reorder `variable` on `variable` within `vartype`
df3 <- transform(df2, variable = reorder(variable, order(vartype, variable,
decreasing = TRUE)))

当与您的绘图代码一起使用时:
ggplot(df3, aes(x=variable, y=value, fill=vartype)) +
geom_bar() +
facet_grid(. ~ year) +
coord_flip()

产生这个:

reordered barplot

关于r - 使用 coord_flip() 的 ggplot2 条形图中的图例条目顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7299440/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com