如何实现从三角形各顶点出发的自定义颜色渐变绘图?
实现三角形顶点起始的三色渐变效果
原代码的核心问题是使用colorRampPalette生成了线性过渡的三色渐变,而非基于顶点距离的颜色混合,因此无法实现从三个顶点分别发散的渐变效果。以下是修改后的代码,通过计算每个点到三个顶点的距离权重来混合颜色:
## 生成三角形网格点坐标 cells.x <- cells.y <- vector() k <- 1 asp <- abs(diff(par()$usr[4:3])/diff(par()$usr[2:1]))*par()$pin[2]/par()$pin[1] for(i in 1:50){ for(j in i:(100-i+1)){ cells.x[k] <- 0.1 + (j-1)*0.1/100 cells.y[k] <- (-1) + (i-1)*2*0.1*asp/100 k <- k + 1 } } # 定义三个顶点的颜色 color1 <- "#1e88e5" # 蓝色顶点 color2 <- "#d81b60" # 红色顶点 color3 <- "#ffc107" # 黄色顶点 # 提取三个顶点的坐标(从网格数据中直接获取) # 顶点1:蓝色(最小x,最大y) vert1_x <- min(cells.x) vert1_y <- max(cells.y) # 顶点2:红色(最大x,最小y) vert2_x <- max(cells.x) vert2_y <- min(cells.y) # 顶点3:黄色(最小x,最小y) vert3_x <- min(cells.x) vert3_y <- min(cells.y) # 计算每个点到三个顶点的欧氏距离 dist_to_vert1 <- sqrt((cells.x - vert1_x)^2 + (cells.y - vert1_y)^2) dist_to_vert2 <- sqrt((cells.x - vert2_x)^2 + (cells.y - vert2_y)^2) dist_to_vert3 <- sqrt((cells.x - vert3_x)^2 + (cells.y - vert3_y)^2) # 归一化距离,转换为权重(距离越近,权重越高) total_dist <- dist_to_vert1 + dist_to_vert2 + dist_to_vert3 # 避免除以0(顶点自身) total_dist[total_dist == 0] <- 1e-10 weight1 <- dist_to_vert2 + dist_to_vert3 # 到另外两个顶点的距离和作为当前顶点颜色的权重 weight2 <- dist_to_vert1 + dist_to_vert3 weight3 <- dist_to_vert1 + dist_to_vert2 # 归一化权重 weight1 <- weight1 / total_dist weight2 <- weight2 / total_dist weight3 <- weight3 / total_dist # 将十六进制颜色转换为RGB分量(0-1范围) rgb1 <- col2rgb(color1)/255 rgb2 <- col2rgb(color2)/255 rgb3 <- col2rgb(color3)/255 # 计算每个点的混合RGB颜色 mixed_r <- weight1*rgb1[1] + weight2*rgb2[1] + weight3*rgb3[1] mixed_g <- weight1*rgb1[2] + weight2*rgb2[2] + weight3*rgb3[2] mixed_b <- weight1*rgb1[3] + weight2*rgb2[3] + weight3*rgb3[3] # 转换为十六进制颜色 gradient_colors <- rgb(mixed_r, mixed_g, mixed_b) # 绘制渐变三角形 plot(0,0, type="n", xlim=range(cells.x), ylim=range(cells.y), asp=1, xlab="", ylab="") points(cells.x, cells.y, col=gradient_colors, pch=15, cex=0.5)
关键修改说明:
- 顶点坐标定义:明确了三角形三个顶点的位置,对应三种指定颜色
- 距离权重计算:使用每个点到另外两个顶点的距离和作为当前顶点颜色的权重,距离越近的顶点,颜色占比越高
- 颜色混合:通过
col2rgb提取颜色的RGB分量,基于权重混合后再转换回十六进制颜色,确保每个点的颜色是三个顶点颜色的平滑过渡
内容的提问来源于stack exchange,提问作者Lilnet Cloud
相关产品推荐
相关产品推荐

