簡體   English   中英

如何為連續數據指定ggplot2箱線圖填充顏色?

[英]How to specify ggplot2 boxplot fill colour for continuous data?

我想使用data.frame的所有列來繪制ggplot2箱線圖,並且想按每列的中位數對列進行重新排序,旋轉x軸標簽,並用與同一中位數相對應的顏色填充每個框 我不知道如何做最后一部分。 有很多示例,其中填充顏色對應於一個因子變量,但是我還沒有看到使用連續變量控制填充顏色的清晰示例。 (我嘗試這樣做的原因是,結果圖將為力導向網絡圖提供上下文,該圖的節點將以與箱圖相同的方式進行顏色編碼-然后顏色將提供如果可以在以后的繪圖中重新使用“顏色到顏色”的映射,以使各個繪圖之間的顏色保持一致,那就太好了。 因此,例如,與具有較高中位數的列變量相對應的框將具有表示此映射的顏色,並與其他圖中的相同列變量的顏色完全匹配(例如,力導向網絡中的相應節點)圖形)。

到目前為止,我有這樣的事情:

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

顏色填充信息就是我所堅持的。 “值”是在[0,1]范圍內的連續變量,在我的data.frame中有55列。 我嘗試過的各種方法似乎導致盒子在中間垂直向下分割,而我沒有得到更多。 有任何想法嗎?

您可以通過按組將中位數添加到數據框中,然后將新的中位數變量映射到填充美學來做到這一點。 這是內置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))

在此處輸入圖片說明

如果您有各種具有不同中值范圍的數據框,仍然可以使用上面的方法,但是要在所有繪圖中獲得顏色到中值的一致映射,還需要在每個繪圖中為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))

這僅用於說明。 為了便於維護,如果您的數據可能會更改,您需要以編程方式設置實際限制。

我以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是一個字符向量,其中包含我后續網絡圖中節點的顏色,並且這些顏色與箱圖中的顏色匹配。 任務完成!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM