将 ggplot2 中的所有面板按升序重新排序,同时保留第一个面板的彩虹色序列

Reorder all panels in ggplot2 in ascending value, while preserving rainbow colour sequence for the first panel

更新:与 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. 对于左上角的第一个面板,将颜色固定为每种类型,使其看起来像是从色谱的一端到另一端的平滑过渡。

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

在 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))

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