R ggplot水平闪避条形图顺序

Aki*_*Aki 1 r ggplot2

我想创建一个简单的带有条形图的水平条形图,但是我在(水平)条形图的排序中苦苦挣扎。当我进行普通条形图(堆积或躲避)时,可以通过设置有用的因子水平并根据相应变量对数据框进行排序来轻松控制条形图的顺序。但是,对数据框进行排序似乎对水平图中的条形顺序没有任何影响。我发现了一些类似的问题,但是我不确定它们是否与我的问题相对应(情节看起来有些不同)。

df1 <- data.frame (year = as.factor(c(rep(2015,3),rep(2016,3),rep(2017,3))),
value = c(50,30,20,60,70,40,20,50,80),
set = rep(c("A","B","C"),3) )

ggplot() + geom_bar(data= df1, aes(y=value, x=set, fill=year), 
stat="identity", position="dodge" ) +
coord_flip()
Run Code Online (Sandbox Code Playgroud)

我想要的是一个水平图,顶部显示2015年柱形图,底部显示2017年柱形图。有趣的是,当我省略coord_flip()时,条形图的排序方式如此,但我需要使图线水平。以这种方式对数据进行排序不会更改绘图:

df1 <- df1[rev(order(df1$year)),]
Run Code Online (Sandbox Code Playgroud)

我很感谢任何提示:)

zli*_*ipp 5

您碰到了ggplot2的特质之一-条形图的排序coord_flip有点不直观。要更改它,您必须颠倒因子级别在中的顺序df1$year,而不仅仅是值本身。见下文:

library(ggplot2)

df1 <- data.frame (year = as.factor(c(rep(2015,3),rep(2016,3),rep(2017,3))),
                   value = c(50,30,20,60,70,40,20,50,80),
                   set = rep(c("A","B","C"),3) )

levels(df1$year)
#> [1] "2015" "2016" "2017"

df1$year <- factor(df1$year, levels = rev(levels(df1$year)))

ggplot(df1) +
  geom_bar(aes(y=value, x=set, fill=year), 
           stat="identity", position="dodge" ) +
  coord_flip()
Run Code Online (Sandbox Code Playgroud)

如果您想保持图例的原始顺序,可以使用进行访问guide_legend

ggplot(df1) +
  geom_bar(aes(y=value, x=set, fill=year), 
           stat="identity", position="dodge" ) +
  guides(fill = guide_legend(reverse = TRUE)) +
  coord_flip()
Run Code Online (Sandbox Code Playgroud)