【问题标题】:User defined parameters for ggplot2 geom_boxplotggplot2 geom_boxplot 的用户定义参数
【发布时间】:2014-03-09 16:25:53
【问题描述】:

我有以下data.frame:

df = data.frame(ymin = c(0.35,0.4,0.25,0.3,0.55,0.6), lower = c(0.45,0.5,0.35,0.4,0.65,0.7), middle = c(0.5,0.55,0.4,0.45,0.7,0.75), upper = c(0.55,0.6,0.45,0.5,0.75,0.8), ymax = c(0.65,0.7,0.55,0.6,0.85,0.9), factor = c("parental","parental","cross","cross","sex","sex"), factor.label = c("paternal","maternal","F1i","F1R","M","F"), posterior.probability = c(0.92,0.92,0.97,0.97,0.99,0.99), x = c(1,1,2,2,3,3), colors = c("blue","red","gray30","gray70","lightskyblue","pink"))

我想生成一个 ggplot2 箱线图,其中 df$x 定义框的 x 轴位置,df$lower、df$upper、df$middle、df$ymin、df$ymax 定义框,df$颜色定义框的颜色。正如你所看到的,每对盒子都应该放在同一个 x 轴位置。使用 alpha 参数,我将使框透明,因此重叠部分可见。

我目前拥有的是这段代码:

p = ggplot(beta.df, aes(x = x, color = colors))
p = p + geom_boxplot(aes(lower = lower,upper = upper, middle = middle, ymin = ymin, ymax = ymax, fill = colors), position = position_dodge(width = 0), width = 0.5, alpha = 0.5, stat = "identity")

显然,盒子的颜色搞砸了——"blue""red" 盒子应该在 df$x = 1,"gray30""gray70" 盒子应该在 df$x = 2,而 @ 987654330@ 和 "pink" 框应该在 df$x = 3。所以我正在寻找解决这个问题。

我还希望指定图例标题和标签,而不是默认生成。此外,对于每对具有相同 x 轴位置的框,df$posterior.probability 值是相同的,我想要在图的顶部绘制这些值(每对一个),比​​如最大 y 轴值,或在每对框的 max(ymax) 顶部和相应的 x 轴位置。换句话说,0.92、0.97 和 0.99 将分别绘制在 x 位置:1、2 和 3,以及绘图的最大 y 位置或这些位置 y 位置:0.75、0.65 和 0.95,分别。

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    您的箱线图是重叠的,正如我从您的代码中了解到的那样,您不希望这样。您的代码中不需要位置元素,您必须将x 视为一个因素,以便将它们彼此相邻绘制。

    使用此代码:

    ggplot(df, aes(x = as.factor(x), color = colors)) + 
      geom_boxplot(aes(lower = lower,upper = upper, middle = middle, ymin = ymin, ymax = ymax, fill = colors), width = 0.5, alpha = 0.5, stat = "identity") +
      geom_text(data = df, aes(x = as.factor(x), y = ymax, label = posterior.probability), size = 4, vjust = -0.5) +
      scale_fill_identity("Color legend", guide = "legend", labels = c("paternal","F1i","F1R","M","F","maternal")) +
      scale_color_identity("Color legend", guide = "legend", labels = c("paternal","F1i","F1R","M","F","maternal")) +
      labs(title = "Plot title", x = "X-lab label", y = "Y-lab label")
    

    你会得到这个结果:

    如果您不希望文本标签颜色相同,请将color = "black" 添加到geom_text 部分。

    【讨论】:

    • 感谢雅普的帮助。我实际上确实希望这些框重叠 - 这就是我使用 position = position_dodge(width = 0) 的原因。使您的解决方案完美解决我的问题的原因是能够将图例标签指定为 df$factor.lable,并使用相应的 df$colors 以透明方式为它们着色,因为它们出现在绘图本身中。
    【解决方案2】:

    对于制作标签的新数据框,每个 x 位置仅包含一个标签,并且 y 值被计算为最大 ymax 值。

    library(plyr)
    df.text<-ddply(df,.(x),summarise,y=max(ymax),label=max(posterior.probability))
    

    当您提供颜色名称时,您应该使用 scale_fill_identity()scale_color_identity() 告诉 ggplot 将它们解释为实际颜色。如果需要显示图例,则将参数guide="legend" 添加到scale_fill_identity()scale_color_identity(),然后提供要在图例中显示的labels=。然后使用geom_text() 和新数据框在箱线图上方添加标签。

    ggplot(df, aes(x = x)) + 
      geom_boxplot(aes(lower = lower,upper = upper, middle = middle, ymin = ymin, 
                        ymax = ymax,color = colors, fill = colors), 
                        position = position_dodge(width = 0), width = 0.5, 
                         alpha = 0.5, stat = "identity")+
      scale_fill_identity("Legend name",guide="legend",
                          labels=c("paternal","F1i","F1R","M","F","maternal"))+
        scale_color_identity("Legend name",guide="legend",
                          labels=c("paternal","F1i","F1R","M","F","maternal"))+
      geom_text(data=df.text,aes(x=x,y=y,label=label))
    

    【讨论】:

    • 非常感谢。还有一个问题:如何添加一个图例来指定每种颜色的因子标签?
    • @user1701545 更新了我的答案以包含图例。
    • 太好了!无论如何要让图例框在图中显示 - 意味着具有相同的边框颜色和透明度级别?
    • 只需在scale_color_identity() 中添加与scale_fill_identity() 相同的内容 - 请参阅更新后的答案。
    • 再次感谢。最后一个问题:是否可以控制图例中标签和颜色的顺序?我希望这是标签顺序:c("paternal","maternal","F1i","F1R","M","F"),这是相应的颜色顺序:c("blue ","re​​d","gray30","gray70","lightskyblue","pink") - 基本上就是它们在df中出现的顺序
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-13
    相关资源
    最近更新 更多