我想使用data.frame的所有列绘制ggplot2 boxplot,我想按每列的中位数对列重新排序,旋转x轴标签,然后用颜色填充每个框对应相同的中位数。我无法弄清楚如何做最后一部分。有很多例子,填充颜色对应于 factor 变量,但我还没有看到使用连续变量来控制填充颜色的明显示例。 (我试图这样做的原因是结果图将为力导向网络图提供上下文,其中节点将以与箱线图相同的方式进行颜色编码 - 颜色将提供两个图之间的映射。)如果我可以为后面的图重复使用值到颜色的映射,那么颜色在图之间是一致的将是很好的。因此,例如,对应于具有高中值的列变量的框将具有表示该映射的颜色并且完美匹配其他图中的相同列变量的颜色(例如,力导向网络中的对应节点)图)。
到目前为止,我有这样的事情:
# 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)
颜色填充信息是我所坚持的。 &#34;值&#34;是[0,1]范围内的连续变量,我的data.frame中有55列。我试过的各种方法似乎导致盒子在中间垂直分开,我还没有进一步。有什么想法吗?
答案 0 :(得分:4)
您可以通过在数据框中添加逐个中间值,然后将新的中间变量映射到填充美学来实现此目的。以下是内置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))
如果您拥有不同数据范围的各种数据框,您仍然可以使用上述方法,但要在所有绘图中获得颜色与中位数的一致映射,您还需要设置相同的{{1在每个情节中为limits
。在此示例中,scale_fill_gradient
(按mpg
分组)的中位数从15.0到22.8不等。但是,让我说在我的所有数据集中,它从13.3到39.8不等。然后我可以将它添加到我的所有情节中:
carb
这只是为了说明。为便于维护,如果您的数据可能会发生变化,您需要以编程方式设置实际限制。
答案 1 :(得分:0)
我在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
是一个字符向量,包含后续网络图中节点的颜色,这些颜色与箱图中的颜色相匹配。完成工作!