在Matplotlib中,如何在多边形的顶点之间填充渐变色?

11
我正在使用matplotlib的Poly3DCollection绘制一组多边形(三角形)。这些三角形是由具有颜色的顶点之间形成的。我目前正在每个三角形中填充一个实心颜色,该颜色是通过平均三个顶点的颜色得出的。这些三角形被绘制成一个三维表面网格。
我想用三个顶点之间的渐变来填充三角形。理想情况下,在给定点处的像素颜色将仅基于到三个点的距离进行线性插值。例如,如果顶点是蓝色、绿色和红色的,生成的三角形应该如下图所示: enter image description here 我认为这应该可以使用matplotlib实现,但不确定如何操作。如果不可能,您能否建议我使用其他库或方法?感谢您的帮助。
编辑: 附加细节
它应该适用于任意数量的三角形,但可能少于2000个。颜色是任意的,尽管每个顶点只与一个颜色相关联。多边形集合是从顶点列表[x_1, y_1, z_1, x_2, y_2, z_2...]创建的。我可以根据需要轻松更改此格式。与每个顶点相关联的颜色在单独的列表中,这也可以轻松更改。

2
你有多少个三角形?颜色是任意的还是总是相同的?你使用的数据格式是什么?我认为目前这个问题非常广泛,如果您能提供更多信息以及一些最小示例代码来用于可能的解决方案,那将会很有帮助。 - ImportanceOfBeingErnest
这些三角形有任何联系吗?就像这里一样?如果是这样,相邻顶点的颜色是否相同?我认为你可以非常确定没有人会为你编写完整的代码,所以你展示出更多的努力,获得帮助的机会就越高。 - ImportanceOfBeingErnest
1
你可能想先看一下渐变条图像剪辑路径的示例。 - ImportanceOfBeingErnest
@nicholash 基本上就是这个,但是用 Python 实现:https://dev59.com/lWgt5IYBdhLWcg3w2A77,对吧? - badgley
1个回答

1

这个问题在五年前就被问过了,我认为我们应该用代码来回答它。@ImportanceOfBeingErnest的评论是最有帮助的,现在我将每个要素总结为以下代码:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.path import Path
from matplotlib.patches import PathPatch

pts = np.array([(0, 0), (1, 0), (0.78, 1)])
p0 = pts.mean(axis=0)
x0, y0 = p0
L = np.maximum(pts[:, 0].ptp(), pts[:, 0].ptp())
delta = 0.01
x = np.arange(x0 -L, x0 + L, delta)
y = np.arange(y0 -L, y0 + L, delta)

X, Y = np.meshgrid(x, y)
d1 = np.sqrt((X-pts[0][0])**2 + (Y-pts[0][1])**2)
d2 = np.sqrt((X-pts[1][0])**2 + (Y-pts[1][1])**2)
d3 = np.sqrt((X-pts[2][0])**2 + (Y-pts[2][1])**2)
eps = 1e-9
d1  = 1/(d1 + eps)
d2  = 1/(d2 + eps)
d3  = 1/(d3 + eps)

d = np.dstack([d1, d2, d3])
d = d/(d.sum(axis=2)[:, :, np.newaxis])

# plot triangle
path = Path(pts)
patch = PathPatch(path, facecolor='none')

fig, ax = plt.subplots(1, 1, figsize=(7.2, 7.2))
ax.add_patch(patch)
im = ax.imshow(d, origin='lower', clip_path=patch, clip_on=True, extent=[x0-L, x0+L, y0-L, y0+L],)
im.set_clip_path(patch)

# plot trinagle points
ax.scatter(pts[:, 0], pts[:, 1], color='k', s=50)

输出:

enter image description here


你能否对如何选择颜色(在三个角落)提供一些额外的评论?d1 = np.sqrt((X-pts[0][0])**2 + (Y-pts[0][1])**2) 可能是魔法发生的地方,但我不清楚底层计算是如何工作的。 - Wasserwaage
@Wasserwaage,我刚刚将距离(d1、d2、d3)转换为三个顶点(黑色点)的RGB值。 - Jiadong

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接