关于 r:重新排序箱线图中的列 ggplot2

Reorder columns in boxplots ggplot2

我有这个箱线图,我想重新排列列。我想要 MCAR、MAR、MNAR 而不是 MAR、MCAR、MNAR。传说也是错误的,橙色是ymiss,蓝色是yobs,但我无法改变它。你能帮助我吗?谢谢!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
library(ggplot2)
logistic <- function(x) exp(x) / (1 + exp(x))
set.seed(80122)
n <- 300
dt <- MASS::mvrnorm(n = n, mu = c(0, 0),
                   Sigma = matrix(c(1, 0.5, 0.5, 1), nrow = 2));dt

r2.mcar <- 1 - rbinom(n, 1, 0.5);r2.mcar
r2.mar <- 1 - rbinom(n, 1, logistic(dt[, 1]));r2.mar
r2.mnar <- 1 - rbinom(n, 1, logistic(dt[, 2]));r2.mnar

yobs1<-dt
yobs1[r2.mcar==0,2]<-NA;yobs1
yobs2<-dt
yobs2[r2.mar==0,2]<-NA;yobs2
yobs3<-dt
yobs3[r2.mnar==0,2]<-NA;yobs3

dados<-matrix(cbind(yobs1[,1],yobs2[,1],yobs3[,1],yobs1[,2],yobs2[,2],yobs3[,2]),ncol=1)

v<-c(rep("yobs",900),rep("ymiss",900))
m<-c(rep("MCAR",300),rep("MAR",300),rep("MNAR",300))
dados<-data.frame(v,m,dados)
names(dados)<-c("y","mecanismo","valores")

p <- ggplot(dados, aes(x =valores, y = mecanismo)) +
  geom_boxplot(aes(fill = y), position = position_dodge(0.9)) +
  scale_fill_manual(values = c("lightskyblue","lightsalmon"))
p + facet_grid(~mecanismo)

boxplot


你的一个问题实际上是两个问题:

  • 改变刻面的顺序。 ggplot2 首先将 dados$mecanismo 中的数据更改为一个因子。方面的顺序与该因素的水平顺序有关,默认情况下,通常是它们在数据集中出现的顺序。要更改顺序,您需要将 dados$mecanismo 定义为数据框中的一个因素,然后还按特定顺序定义级别。

  • 将图例中的特定颜色分配给一个因素。在您的 scale_fill_manual 命令中,您正在分配 values=。默认情况下,值的顺序是根据因子水平的顺序应用的(在本例中为 dados$y)。您可以重新指定该因素的级别,但要专门分配颜色,您不需要。您需要做的就是提供一个 list(.. 或一个命名向量 c('name'='color', 'name2'='color2',..values= 来代替颜色向量。顺便说一句...您可以更改 ymissyobs 在图例中出现的顺序,方法是设置上面 #1 中所示的因子...

  • 这是代码和情节:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # relevel factor for right order of facets
    dados$mecanismo <- factor(dados$mecanismo, levels=c('MCAR','MAR','MNAR'))

    p <- ggplot(dados, aes(x =valores, y = mecanismo)) +
      geom_boxplot(aes(fill = y), position = position_dodge(0.9)) +

      # set colors with named vector
      scale_fill_manual(values = c('yobs'="lightskyblue",'ymiss'="lightsalmon"))
    p + facet_grid(~mecanismo)

    enter image description here

    编辑:更改图例键的顺序

    经过一些评论,很明显 OP 不仅打算根据 ymissyobs 的特定值重新着色数据,还打算更改图例中框的位置以匹配的情节。我的意思是,在上面的图中,yobs 的箱线图位于顶部,ymiss 位于下方,但在右侧的图例中,顺序颠倒了。解决此问题的方法是通过 scale_fill_manualbreaks= 参数显式指定标签的顺序。这解决并修复了该问题:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    dados$mecanismo <- factor(dados$mecanismo, levels=c('MCAR','MAR','MNAR'))

    ggplot(dados, aes(x =valores, y = mecanismo)) +
      geom_boxplot(aes(fill = y), position = position_dodge(0.9)) +
     
      # set colors with named vector
      scale_fill_manual(
        values = c('yobs'="lightskyblue",'ymiss'="lightsalmon"),
        breaks = c('yobs', 'ymiss')
      )

    enter image description here


    添加此代码,它将起作用:

    1
    2
    3
    4
    5
    6
    7
    #Reorder var
    dados$mecanismo <- factor(dados$mecanismo,levels = c("MCAR","MAR","MNAR"),ordered = T)

    p <- ggplot(dados, aes(x =valores, y = mecanismo)) +
      geom_boxplot(aes(fill = y), position = position_dodge(0.9)) +
      scale_fill_manual(values = c("lightsalmon","lightskyblue"))
    p + facet_grid(~mecanismo)

    enter image description here