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

geom_polygon三角形三色渐变填充异常及角部文本标注需求

解决ggplot2三角形三色渐变填充问题

原代码的核心问题有两个:

  • 仅提供了三角形的三个顶点数据,geom_polygon只能绘制单一多边形,无法实现内部的渐变填充(它的fill参数是针对整个多边形的,不是逐点映射);
  • 误用了color=value设置边框颜色,而非填充色,且scale_fill_gradient2是双色加中间色的渐变,不匹配三色顶点渐变的需求。

要实现三个角颜色向中心混合的渐变效果,需要先生成三角形内部的密集网格点,计算每个点相对于三个顶点的权重,再通过权重混合颜色,最后用栅格填充这些点。以下是完整解决方案:

步骤1:加载依赖包并定义基础数据

library(ggplot2)
library(dplyr)
library(tidyr)

# 定义等边三角形的三个顶点,包含坐标、对应颜色和标注文本
vertices <- data.frame(
  x = c(0, 1, 0.5),
  y = c(0, 0, sqrt(3)/2),
  color = c("blue", "red", "green"),
  label = c("蓝色角", "红色角", "绿色角")
)

步骤2:生成三角形内部的密集网格点

# 生成密集的x、y序列,数量越多渐变越平滑
x_seq <- seq(0, 1, length.out = 200)
y_seq <- seq(0, sqrt(3)/2, length.out = 200)
grid <- expand.grid(x = x_seq, y = y_seq)

# 筛选出三角形内部的点(通过三条边的线性不等式判断)
grid <- grid %>%
  filter(
    y <= sqrt(3)*x,                # 左下到右上的边
    y <= -sqrt(3)*(x - 1),         # 右下到右上的边
    y >= 0                         # 底边
  )

步骤3:计算权重并混合颜色

利用重心坐标计算每个点相对于三个顶点的权重,通过权重加权混合三种颜色:

grid <- grid %>%
  mutate(
    # 解重心坐标方程组,得到三个顶点的权重w1、w2、w3
    w1 = ((vertices$y[2] - vertices$y[3])*(x - vertices$x[3]) + (vertices$x[3] - vertices$x[2])*(y - vertices$y[3])) / 
         ((vertices$y[2] - vertices$y[3])*(vertices$x[1] - vertices$x[3]) + (vertices$x[3] - vertices$x[2])*(vertices$y[1] - vertices$y[3])),
    w2 = ((vertices$y[3] - vertices$y[1])*(x - vertices$x[3]) + (vertices$x[1] - vertices$x[3])*(y - vertices$y[3])) / 
         ((vertices$y[2] - vertices$y[3])*(vertices$x[1] - vertices$x[3]) + (vertices$x[3] - vertices$x[2])*(vertices$y[1] - vertices$y[3])),
    w3 = 1 - w1 - w2,
    # 修正计算误差导致的负权重
    w1 = pmax(w1, 0),
    w2 = pmax(w2, 0),
    w3 = pmax(w3, 0),
    # 归一化权重确保总和为1
    total_w = w1 + w2 + w3,
    w1 = w1 / total_w,
    w2 = w2 / total_w,
    w3 = w3 / total_w,
    # 加权混合RGB颜色
    r = w2*255 + w3*0 + w1*0,  # 红色角对应权重w2
    g = w3*255 + w1*0 + w2*0,  # 绿色角对应权重w3
    b = w1*255 + w2*0 + w3*0,  # 蓝色角对应权重w1
    color_rgb = rgb(r, g, b, maxColorValue = 255)
  )

步骤4:绘制最终图表

ggplot() +
  # 用栅格填充内部点,实现平滑渐变
  geom_raster(data = grid, aes(x = x, y = y, fill = color_rgb)) +
  # 使用手动生成的颜色,禁用默认颜色比例尺
  scale_fill_identity() +
  # 绘制三角形黑色边框
  geom_polygon(data = vertices, aes(x = x, y = y), color = "black", fill = NA, linewidth = 1) +
  # 添加角部文本标注,调整位置避免遮挡
  geom_text(data = vertices, aes(x = x, y = y, label = label), 
            nudge_x = c(-0.08, 0.08, 0), nudge_y = c(-0.05, -0.05, 0.05), size = 4) +
  # 设置白色背景,移除多余元素
  theme_minimal() +
  theme(
    panel.background = element_rect(fill = "white", color = NA),
    plot.background = element_rect(fill = "white", color = NA),
    axis.text = element_blank(),
    axis.title = element_blank(),
    panel.grid = element_blank()
  ) +
  # 固定坐标系,保证三角形不变形
  coord_fixed()

效果说明

  • 三个角的颜色会向中心自然混合,形成平滑的渐变过渡;
  • 角部文本标注位置经过调整,不会遮挡图形;
  • 图表背景为纯白色,符合需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 15:40:04