【问题标题】:Reorder all panels in ggplot2 in ascending value, while preserving rainbow colour sequence for the first panel以升序对 ggplot2 中的所有面板重新排序,同时保留第一个面板的彩虹色序列
【发布时间】:2016-03-04 21:19:34
【问题描述】:

更新:与Order Bars in ggplot2 bar graph 中回答的问题相比,我不直观的主要区别是根据 ggplot2 计算的中位数分别重新排序每个面板的类型,同时保留配色方案。

在下面的数据集中,不同的处理在计算它们的中值时可能会沿 x 轴显示不同的类型排列。

我正在尝试绘制一个图表,显示类型的中值在以升序中值排列时如何交换位置

首先,我将所有不同的处理方法绘制到带有箱线图的单独面板中,此外,我让 ggplot2 为这些类型分配调色板。

这将生成我拥有的数据集的模型。

df = data.frame(
  type = rep(c
             (
             "piece", 
             "work",
             "man",
             "noble",
             "reason",
             "infinite",
             "faculty",
             "form",
             "moving",
             "express",
             "admirable",
             "action",
             "apprehension",
             "god",
             "beauty",
             "world",
             "paragon",
             "animals"
             ), 52),
  treatment = sample(x=c("alpha", "beta", "charlie", "delta"), 234, replace = T),
  value = abs(rnorm(936, 0.5, 1))
)

这段代码将生成我正在寻找的图表

ggplot(
  data=df,
  aes(x = type, y = value, fill = type)) +
  geom_boxplot() +
  xlab("Soliloquy of Man") +
  ylab("Value")+
  facet_wrap(~treatment, ncol = 2) +
  theme(axis.text.x = element_blank(),
        panel.background = element_blank(),
        panel.border = element_rect(colour = "black", fill=NA))

我想做的是

  1. 对每个单独面板中的所有性状重新排序,使中值沿 x 轴增加,
  2. 为每种特定类型使用相同的调色板,
  3. 对于左上角的第一个面板,将颜色固定为每种类型,使其看起来像是从色谱的一端到另一端的平滑过渡。

这将允许我检查并直观地显示类型是否参考第一个面板交换了位置,然后我将运行非参数等级测试。

【问题讨论】:

  • 你只需要reorder你的因素。这是一个 r-faq。参见,例如,Alex 在此处的回答:stackoverflow.com/a/9231857/903061。代替长度,您可以使用中值作为排序函数。
  • 我试过了,但我无法为我的具体情况找到正确的语法。
  • @Gregor 但是aes(x = reorder(type, value, median)... 不会考虑这些方面,不是吗?
  • 嗯,我太仓促了。我错过了方面部分的不同轴顺序。我的猜测是这不可能使用刻面,但您可以单独构建每个图并将它们与grid.arrange 粘贴在一起。
  • @Gregor。是的,我确实这样做了,尽管 ggplot2 的选项和功能的深度还没有让我失望,我真的不想使用笨拙的解决方案,即单独子集和绘制数据。希望有一个其他人可能想到的优雅的解决方案。

标签: r ggplot2 facet


【解决方案1】:

在 ggplot2 中,您可以利用将框在 x 轴上的每个位置视为从 1 到类别数的数字。

使用您的数据集,但最初将列类型保留为字符。

library("ggplot2")
library("dplyr")

set.seed(12345)

df = data.frame(
  type = rep(c
  (
  "piece", 
  "work",
  "man",
  "noble",
  "reason",
  "infinite",
  "faculty",
  "form",
  "moving",
  "express",
  "admirable",
  "action",
  "apprehension",
  "god",
  "beauty",
  "world",
  "paragon",
  "animals"
  ), 52),
 treatment = sample(x=c("alpha", "beta", "charlie", "delta"), 234, replace = TRUE),
 value = abs(rnorm(936, 0.5, 1)), stringsAsFactors = FALSE)

为了获得每种类型的位置,请为每种类型和处理的组合获取数据框中列值的中值,然后对它们进行排名以获得每个面板中的绘图顺序。

df2 <- df %>% group_by(treatment, type) %>% 
  summarise(med = median(value)) %>% mutate(plot_order = rank(med))

将绘图顺序数据加入原始数据集。

df3 <- df %>% left_join(df2) %>% arrange(treatment, plot_order)

在第一个面板中提取type 的顺序,并使用它们对因子的水平进行排序。

treatment_a_order <- unique(df3[df3$treatment == "alpha", "type"])

根据这些重新排序的因素重新编码type 的级别

df4 <- mutate(df3, ftype = factor(type, levels = treatment_a_order))

ggplot(df4, aes(x = plot_order, y=value, fill=ftype)) + 
  geom_boxplot() +
  facet_wrap(~treatment) + 
  xlab("Soliloquy of Man") +
  ylab("Value")+
  theme(axis.text.x = element_blank(),
  panel.background = element_blank(),
  panel.border = element_rect(colour = "black", fill=NA))

这种方法的一个警告是,类型列的所有级别都必须出现在第一个面板中。

【讨论】:

  • 感谢您的帮助。我的实际数据集在 4 种类型中的 3 种中具有 NA 值,正如您所建议的,我将图表基于幸运的是所有类型都有值的处理,因此 df2 将 NA 投入到数据集中。我如何告诉 dplyr 忽略 NA 值?
  • 想通了。只需要用median 命令找出将na.rm = T 放在哪里。
猜你喜欢
  • 1970-01-01
  • 2012-06-06
  • 2019-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-19
  • 1970-01-01
  • 2011-03-12
相关资源
最近更新 更多