You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何根据数值为箱线图正确填充颜色:解决排序错误问题

箱线图颜色排序修正:低温冷色调/高温暖色调

问题原因

你当前的代码里,用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 19:35:30