【问题标题】:Control fill colour order in graph and legend for ggplot::geom_bar position_stack with positive and negative values用正值和负值控制 ggplot::geom_bar position_stack 图形和图例中的填充颜色顺序
【发布时间】:2020-05-19 23:23:11
【问题描述】:

我有一个包含三列的df:

-"sample" ~包含样本名称 -“组”~包含组(第一个向上,第二个向上,保持向上,保持向下,第二个向下,第一个向下) -"value" ~包含每组中的数字。

我在sorder 中按我想要的顺序订购的样本,并作为因子在 x 轴上对刻度进行排序。 以类似的方式,我对gorder 中的组进行了排序,并将它们作为因子应用于图中的堆栈排序。

我对图例中组的顺序(及其颜色)感到满意,并希望堆栈的顺序相同。我尝试重新排序因子,但由于没有手动挑选颜色,我没有设法按照与图例相同的顺序获得堆栈。你有什么建议吗?

require(dplyr)
require(ggplot2)

gorder<-c("first up", "second up", "remain up", "remain down", "second down", "first down")

sorder<-c("55_NST", "40_NST","25_NST","ad_NST", "RH_NST", "FT_ST",  "55_ST", "25_ST")

set.seed(1)
df<-data.frame(
  "sample" =rep(sorder, each=6),
  "group"=rep(gorder, times=8),
  "value"=c(abs(rnorm(48,mean=3000, sd=500))))
df<-df%>%mutate(value =case_when(group %in% c("remain down", "second down", "first down") ~ value *(-1),
                                 !group %in% c("remain down", "second down", "first down") ~ value))


df$sample<-factor(df$sample, levels = sorder)
df$group<-factor(df$group, levels = gorder)

ggplot(df, aes(fill=group, y=value, x=sample)) + 
    geom_bar(position="stack", stat="identity") +
 theme_bw()+
  scale_x_discrete(breaks=sorder, labels=c("55", "40", "25", "AD", "RH", "FT (ST)", "55 (ST)", "25 (ST)"))+
  scale_y_continuous(breaks = seq(from = -12000,to = 12000, by = 2000))+
  labs(y="number of genes", x="RWC")+
  scale_fill_brewer(type = "div", palette = "RdYlGn",direction = -1)

Example graph, I would like the stacks in the same order as the legend colors

【问题讨论】:

  • 您能否通过包含对象形式的最小数据集来使您的问题可重现,例如,如果数据框为 df
  • 是的,当然,我把它放在了编辑里
  • scale_x_discrete(breaks = sorder... 中有一个未定义的变量,sorder 分配在哪里?如果是拼写错误,应该是gorder,还是有问题:Error: breaks` 和labels 必须有相同的长度`。查看此链接以提出可重复的问题:speakerdeck.com/jennybc/reprex-help-me-help-you?slide=5
  • 您是否也可以使用set.seed("a_number") 来确保输出一致?
  • 好吧,现在肯定可以重现了

标签: r ggplot2 bar-chart


【解决方案1】:

困难似乎在于使用因子和 ggplot 处理position_stack 中的负值的方式之间的冲突。

来自文档:“正值和负值的堆叠是分开执行的,因此正值从 x 轴向上堆叠,负值向下堆叠。”似乎堆叠胜过因素。

所以需要一点人工干预:

1) 重新排序gorder 以处理负值的堆叠反转

2) 使用scale_fill_manual 和colorBrewer 调色板的重构版本以正确顺序在图表中获取填充颜色。按要求的顺序添加标签。

3) 覆盖图例指南,使颜色与原始标签顺序匹配。

可能有更有效的方法来实现这一点......

library(ggplot2)
library(dplyr)
library(forcats)
library(RColorBrewer)

gorder<-c("first up", "second up", "remain up", "remain down", "second down", "first down")

gorder_col <- c("first up", "second up", "remain up", rev(c("remain down", "second down", "first down")))

sorder<-c("55_NST", "40_NST","25_NST","ad_NST", "RH_NST", "FT_ST",  "55_ST", "25_ST")

set.seed(1)

df<-data.frame(
  "sample" = rep(sorder, each=6),
  "group" = rep(gorder, times=8),
  "value" = c(abs(rnorm(48,mean=3000, sd=500))))

df<-
  df %>%
  mutate(value = case_when(group %in% c("remain down", "second down", "first down") ~ value * (-1),
                           !group %in% c("remain down", "second down", "first down") ~ value),
         sample = factor(sample, levels = sorder),
         group = factor(group, levels = gorder_col))


ggplot(df, aes(fill = group, y = value, x = sample)) + 
  geom_bar(position="stack", stat="identity") +
  theme_bw()+
  scale_x_discrete(breaks = sorder, labels = c("55", "40", "25", "AD", "RH", "FT (ST)", "55 (ST)", "25 (ST)"))+
  scale_y_continuous(breaks = seq(from = -12000,to = 12000, by = 2000))+
  labs(y="number of genes", x="RWC")+
  scale_fill_manual(values = c(brewer.pal(name = "RdYlGn", n = 6)[6:4], brewer.pal(name = "RdYlGn", n = 6)[1:3]),
                    labels = gorder)+
  guides(fill = guide_legend(override.aes = list(fill = brewer.pal(name = "RdYlGn", n = 6)[6:1])))

【讨论】:

  • 谢谢!我没有意识到我可以像这样子集托盘。
猜你喜欢
  • 2022-11-22
  • 2012-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-19
  • 2021-06-15
  • 1970-01-01
  • 2018-12-21
相关资源
最近更新 更多