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

在ggplot2中为同一变量配置两种连续颜色渐变刻度

解决方案:为不同Category设置独立的填充渐变

要实现按Category分别应用不同的颜色渐变,最直接的方法是使用ggnewscale包,它允许在同一个ggplot中添加多个填充比例尺,从而为不同子集的tiles设置独立的颜色映射。

步骤1:安装并加载所需包

首先确保安装ggnewscale(如果未安装),同时加载ggplot2:

install.packages("ggnewscale")
library(ggplot2)
library(ggnewscale)

步骤2:完整可复现代码

以下是修正后的代码(固定随机种子保证结果一致,同时修复原代码中library(ggplot)的错误):

set.seed(123) # 固定随机数生成,方便复现结果
df <- data.frame(Type = c(rep("A", 5), rep("B", 5), rep("C", 5)),
                 Time = rep(1:5, 3),
                 Value = round(runif(15, min = -3, max = 3), 2),
                 Category = c(rep("BB", 5), rep("SS", 10)))

# 绘制分Category的渐变热图
ggplot() +
  # 绘制BB类别的tiles:藏青色(高值)到白色(低值)
  geom_tile(data = subset(df, Category == "BB"),
            aes(x = Time, y = Type, fill = Value),
            height = 0.8, width = 1) +
  scale_fill_gradient(low = "white", 
                      high = "#003366", # 藏青色
                      limits = c(-3, 3),
                      name = "BB 数值",
                      guide = guide_colorbar(frame.colour = "black", ticks.colour = "black")) +
  
  # 新建填充比例尺,为下一类别的tiles准备独立映射
  new_scale_fill() +
  
  # 绘制SS类别的tiles:红色(高值)到白色(低值)
  geom_tile(data = subset(df, Category == "SS"),
            aes(x = Time, y = Type, fill = Value),
            height = 0.8, width = 1) +
  scale_fill_gradient(low = "white", 
                      high = "#A63446", # 原代码使用的红色
                      limits = c(-3, 3),
                      name = "SS 数值",
                      guide = guide_colorbar(frame.colour = "black", ticks.colour = "black")) +
  
  theme_bw()

代码说明

  • 分子集绘制tiles:分别提取BB和SS类别的数据,各自绘制geom_tile层,确保不同类别的tiles独立设置颜色。
  • 统一数值范围:为两个渐变设置相同的limits(-3到3),保证数值与颜色映射的一致性,避免因数据范围差异导致颜色失真。
  • 多比例尺支持:new_scale_fill()是核心函数,它重置填充比例尺,让后续的scale_fill_*规则可以应用到新图层,实现同一图中多组颜色渐变。

替代方案:分面展示

如果可以接受分面布局,也可以用facet_wrap按Category拆分展示,每个分面使用对应颜色渐变:

ggplot(df, aes(x = Time, y = Type, fill = Value)) +
  geom_tile(height = 0.8, width = 1) +
  facet_wrap(~Category, scales = "free_y") +
  scale_fill_gradient(low = "white", 
                      high = ifelse(df$Category == "BB", "#003366", "#A63446")) +
  theme_bw()

内容的提问来源于stack exchange,提问作者accibio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 14:05:13