如何根据数值为箱线图正确填充颜色:解决排序错误问题
箱线图颜色排序修正:低温冷色调/高温暖色调
问题原因
你当前的代码里,用unique(cut(data$tavg, ...))来设置因子水平,这会导致区间顺序是数据中随机出现的顺序,而非温度从低到高的逻辑顺序,直接造成颜色和温度区间的对应关系错乱。虽然viridis默认配色是从冷到暖,但顺序错了,颜色自然匹配不对。
解决步骤
1. 提前固定温度区间的逻辑顺序
先手动生成按温度从低到高排列的区间标签,不要依赖数据中的出现顺序:
temp_bins <- seq(-20, 30, 5) # 生成标准的区间标签并按温度排序 temp_levels <- levels(cut(seq(-20, 25, 5), temp_bins))
2. 统一处理数据中的分组
把温度列切割后,用上面固定的temp_levels转成因子,保证区间顺序严格从低到高:
data$temp_group <- factor(cut(data$tavg, temp_bins), levels = temp_levels)
3. 颜色匹配
viridis默认的颜色序列刚好是从冷色调(深蓝)过渡到暖色调(亮黄),直接按区间数量生成颜色即可,完美契合你的需求。
完整修正代码
library(ggplot2) library(viridisLite) # 生成数据(修正原数据行数不匹配问题) set.seed(123) data <- data.frame(tavg = sample(-30:30, 2000, replace = TRUE), attendance = sample(100:30000, 2000, replace = TRUE)) # 定义温度区间并固定顺序 temp_bins <- seq(-20, 30, 5) temp_levels <- levels(cut(seq(-20, 25, 5), temp_bins)) data$temp_group <- factor(cut(data$tavg, temp_bins), levels = temp_levels) # 生成冷→暖的颜色序列 my_colors <- viridis(length(temp_levels)) # 绘图 ggplot(data, aes(x = temp_group, y = attendance, fill = temp_group)) + geom_boxplot(outlier.shape = NA) + geom_jitter(color = "black", size = 0.4, alpha = 0.1) + scale_fill_manual(values = my_colors) + labs(x = "Temperature", y = "Attendance", fill="Temperature Range") + ggtitle("Attendance vs Temperature") + theme_minimal()
补充提示
- 原代码中
tavg是2000行,attendance只有1000行,存在行数不匹配的错误,已经修正为一致 - 如果需要反转颜色(高温冷色调/低温暖色调),可以用
viridis(length(temp_levels), direction = -1) - 用
levels(cut(...))生成区间标签比手动拼接更规范,避免格式错误
内容的提问来源于stack exchange,提问作者Delopera
相关产品推荐
相关产品推荐

