首页 文章

如何为连续数据指定ggplot2 boxplot填充颜色?

提问于
浏览
1

我想使用data.frame的所有列绘制ggplot2 boxplot,我想按列的中位数对列进行重新排序,旋转x轴标签和 fill each box with the colour corresponding to the same median . 我无法弄清楚如何做最后一部分 . 有很多例子,填充颜色对应于因子变量,但我没有看到使用连续变量来控制填充颜色的明显示例 . (我试图这样做的原因是结果图将为力导向网络图提供上下文,其中节点将以与boxplot相同的方式进行颜色编码 - 颜色将提供之间的映射 . 这两个图 . )如果我可以为后面的图重复使用值到颜色的映射,那么颜色在图之间是一致的将是很好的 . 因此,例如,对应于具有高中值的列变量的框将具有表示该映射的颜色并且完美匹配其他图中的相同列变量的颜色(例如,力导向网络中的对应节点)图形) .

到目前为止,我有这样的事情:

# Melt the data.frame:
DT.m <- melt(results, id.vars = NULL) # using reshape2
# I can now make a boxplot for every column in the data.frame:
g <- ggplot(DT.m, aes(x = reorder(variable, value, FUN=median), y = value)) +
theme(axis.text.x = element_text(angle = 90, hjust = 1)) +
stat_summary(fun.y=mean, colour="darkred", geom="point") +
geom_boxplot(???, alpha=0.5)

颜色填充信息是我坚持的 . “value”是[0,1]范围内的连续变量,我的data.frame中有55列 . 我试过的各种方法似乎导致盒子在中间垂直分割,我没有进一步 . 有任何想法吗?

2 回答

  • 0

    您可以通过将中位数组添加到数据框中,然后将新的中间变量映射到填充美学来实现此目的 . 这是内置 mtcars 数据框的示例 . 通过在不同的图上使用相同的映射,您应该获得相同的颜色:

    library(ggplot2)
    library(dplyr)
    
    ggplot(mtcars %>% group_by(carb) %>%
             mutate(medMPG = median(mpg)), 
           aes(x = reorder(carb, mpg, FUN=median), y = mpg)) +
      geom_boxplot(aes(fill=medMPG)) +
      stat_summary(fun.y=mean, colour="darkred", geom="point") +
      scale_fill_gradient(low=hcl(15,100,75), high=hcl(195,100,75))
    

    enter image description here

    如果你有不同范围的中位数的各种数据框,你仍然可以使用上面的方法,但要在所有图中获得颜色与中位数的一致映射,你还需要在每个图中为 scale_fill_gradient 设置相同的 limits . 在此示例中, mpg (通过 carb 分组)的中位数在15.0到22.8之间变化 . 但是,让我说在我的所有数据集中,它从13.3到39.8不等 . 然后我可以将它添加到我的所有情节中:

    scale_fill_gradient(limits=c(13.3, 39.8), 
                        low=hcl(15,100,75), high=hcl(195,100,75))
    

    这只是为了说明 . 为了便于维护,如果您的数据可能会发生变化,您需要以编程方式设置实际限制 .

  • 4

    我在eipi10的解决方案上构建并获得了以下代码,它可以满足我的需求:

    # "results" is a 55-column data.frame containing 
    # bootstrapped estimates of the Gini impurity for each column variable
    # (But can synthesize fake data for testing with a bunch of rnorms)
    DT.m <- melt(results, id.vars = NULL) # using reshape2
    g <- ggplot(DT.m %>% group_by(variable) %>%
              mutate(median.gini = median(value)), 
            aes(x = reorder(variable, value, FUN=median), y = value))  +
    theme(axis.text.x = element_text(angle = 90, hjust = 1)) +
    geom_boxplot(aes(fill=median.gini)) +
    stat_summary(fun.y=mean, colour="darkred", geom="point") +
    scale_fill_gradientn(colours = heat.colors(9)) +
    ylab("Gini impurity") +
    xlab("Feature") +
    guides(fill=guide_colourbar(title="Median\nGini\nimpurity"))
    plot(g)
    

    后来,第二个情节:

    medians <- lapply(results, median)
    color <- colorRampPalette(colors = 
    heat.colors(9))(1000)[cut(unlist(medians),1000,labels = F)]
    

    然后 color 是一个包含后续网络图中节点颜色的字符向量,这些颜色与箱图中的颜色相匹配 . 任务完成!

相关问题