如何在ggplot2直方图中使用另一连续变量的均值填充条形颜色
解决直方图按分组变量均值填充颜色的问题
你的思路很实用——通过直方图展示一个变量的分布,同时用另一个连续变量的均值区分不同分箱的特征,能直观揭示两个变量间的潜在关联。不过直接用fill=wt行不通,因为geom_histogram会把多个观测归到同一个mpg分箱里,而fill=wt会试图给每个原始数据点的wt值映射颜色,导致颜色混乱。我们需要先计算每个mpg分箱对应的wt均值,再把这个均值映射到填充色上。
下面给你两种可行的解决方案:
方法一:用stat_summary_bin快速实现(推荐)
这个方法不需要提前处理数据,直接在ggplot中通过统计函数自动计算每个分箱的计数和wt均值:
library(tidyverse) mtcars %>% ggplot(aes(x = mpg)) + # 用stat_summary_bin计算每个分箱的计数和wt均值 stat_summary_bin( aes(y = ..count.., fill = ..mean(wt)..), # y是分箱计数,fill是wt的均值 fun = length, # 统计每个分箱的样本数(即直方图高度) geom = "col", # 用柱状图呈现,效果和geom_histogram一致 bins = 8 # 指定分箱数,和geom_histogram默认值一致,可根据需求调整 ) + # 设置颜色渐变图例 scale_fill_gradient(low = "#cce7ff", high = "#003366", name = "Mean Weight") + # 添加标签 labs( x = "Miles per Gallon (mpg)", y = "Number of Vehicles", title = "Distribution of MPG with Mean Weight by Bin" )
说明:
..count..和..mean(wt)..是ggplot的特殊变量,分别代表分箱的计数和wt的均值geom="col"替代geom_histogram,因为我们已经明确了每个分箱的高度(计数)scale_fill_gradient可以自定义渐变的起始/结束颜色,name参数用来设置图例标题,清晰说明颜色对应的含义
方法二:手动分箱预处理数据(更灵活)
如果你需要自定义分箱规则,或者要对分箱数据做额外分析,可以先手动处理数据再绘图:
library(tidyverse) # 1. 对mpg进行分箱,计算每个分箱的计数和wt均值 mtcars_binned <- mtcars %>% # 用pretty函数生成美观的分箱边界,n指定分箱数 mutate(mpg_bin = cut(mpg, breaks = pretty(mpg, n = 8))) %>% group_by(mpg_bin) %>% summarise( vehicle_count = n(), avg_weight = mean(wt) ) %>% # 计算分箱的中点,让x轴显示更直观 mutate( mpg_mid = as.numeric(str_extract(mpg_bin, "\\d+\\.\\d+")) + (diff(pretty(mtcars$mpg, n=8))[1]/2) ) # 2. 绘制直方图 mtcars_binned %>% ggplot(aes(x = mpg_mid, y = vehicle_count, fill = avg_weight)) + geom_col(width = diff(pretty(mtcars$mpg, n=8))[1]) + # 柱子宽度匹配分箱宽度 scale_fill_gradient(low = "#cce7ff", high = "#003366", name = "Mean Weight") + labs( x = "Miles per Gallon (mpg)", y = "Number of Vehicles", title = "Distribution of MPG with Mean Weight by Bin" )
说明:
cut(mpg, breaks = pretty(mpg, n=8))可以生成比默认分箱更美观的区间- 计算
mpg_mid是为了让x轴显示分箱的中点,比直接显示区间字符串更简洁 - 这种方法适合需要对分箱数据做进一步分析(比如过滤异常分箱)的场景
两种方法都能实现你想要的效果:每个直方图条形的颜色对应该mpg区间内车辆的平均重量,渐变图例清晰展示均值的相对高低,帮你直观观察mpg较低的组是否确实平均重量更高。
内容的提问来源于stack exchange,提问作者PaulaSpinola
相关产品推荐
相关产品推荐

