如何在R中为数据框各数值列的直方图设置不同颜色?
解决ggplot2循环绘制直方图的不同颜色问题
我明白你想要给每个数值列的直方图设置独特颜色来提升视觉效果的需求啦!你的循环逻辑没问题,但颜色设置的方式有点小问题——你现在在aes()里设置fill = col[i],ggplot会把它当成数据框里的一个变量名,而不是直接使用你定义的彩虹色值。
这里给你两种简单的修改方案:
方案一:直接在geom_histogram里设置fill
把颜色参数移出aes(),直接在geom_histogram中指定fill = col[i],这样每一次循环都会用对应的彩虹色填充直方图:
library("ggplot2") library("MASS") library("corrplot") data(Boston) # 数据划分 index <- sample(1:nrow(Boston), floor(0.8 * nrow(Boston)), replace = FALSE) training <- Boston[index,] testing <- Boston[-index,] # 生成对应数量的彩虹色 col = rainbow(ncol(Boston)) # 循环绘制数值列直方图 for (i in 1:ncol(training)) { if(is.numeric(training[, i])){ # 关键改动:把fill从aes移到geom_histogram里 print( ggplot(data = data.frame(val = training[, i]), aes(x = val)) + geom_histogram(bins = 10, fill = col[i], color = "white") + # 加白色边框提升区分度 ggtitle(paste0(names(training)[i])) + theme(plot.title = element_text(hjust = 0.5)) + labs(x = "") ) } }
方案二:使用scale_fill_manual映射颜色(适合复杂颜色逻辑)
如果你以后需要更灵活的颜色映射,可以把颜色绑定到一个虚拟分组变量,再用scale_fill_manual指定颜色:
for (i in 1:ncol(training)) { if(is.numeric(training[, i])){ plot_data <- data.frame(val = training[, i], group = names(training)[i]) print( ggplot(plot_data, aes(x = val, fill = group)) + geom_histogram(bins = 10, color = "white") + scale_fill_manual(values = col[i]) + ggtitle(names(training)[i]) + theme(plot.title = element_text(hjust = 0.5), legend.position = "none") + # 单柱子无需显示图例 labs(x = "") ) } }
额外小提示
我添加了color = "white"参数,让直方图柱子的边框变成白色,这样不同柱子之间的轮廓更清晰,整体视觉体验会更好哦!
内容的提问来源于stack exchange,提问作者Piyush
相关产品推荐
相关产品推荐

