使用 tripcolor 绘制多组数据 - 颜色图中的透明度

Plot multiple sets of data with tripcolor - transparency in colormaps

我好像无法解决这个问题。我有多组具有相同 x,y 点的数据。我进行 Delaunay 三角剖分并使用 tripcolor 绘制它。我在这个论坛上读到,要将几组数据绘制到同一个图中,我需要指定轴和其他东西,但它在这里似乎对我不起作用(matplotlib 的初学者,抱歉)。我的代码:

import matplotlib.pyplot as plt
import matplotlib.tri as tri
from pylab import genfromtxt

data=genfromtxt("momentAF.txt")
data2=genfromtxt("momentZZ.txt")

x = data[:,0]
y = data[:,1]
z1 = data[:,4]
z2 = data2[:,4]

circle=plt.Circle((0,0),1,color="black",fill=False)

triang = tri.Triangulation(x, y)

ax = plt.subplot(111)
ax.set_aspect('equal')
ax.add_artist(circle)
ax.tripcolor(triang, z2**2, shading='gouraud', cmap='Greens')
ax.tripcolor(triang, z1**2, shading='gouraud', cmap='Reds')
#plt.colorbar()
plt.title("ST, G'=-0.0")

非常感谢任何帮助,谢谢。

编辑: 我要做什么的一个粗略例子:

编辑2: 我尝试使用颜色映射选项 "set_under":

来显示多个数据集而不为所有数据集设置透明度
my_cmap = cm.get_cmap("Greens")
my_cmap2 = cm.get_cmap("Reds")
my_cmap.set_under('w',alpha=0)
my_cmap2.set_under('w',alpha=0)

然后

ax.tripcolor(triang, z1**2, shading='gouraud', cmap=my_cmap, vmin=0.01)
ax.tripcolor(triang, z2**2, shading='gouraud', cmap=my_cmap2, vmin=0.01)

但它仍然只显示 z1 非零的区域(即 z1 非零的区域被来自 my_cmap2 的白色覆盖,我希望它是透明的)。我也试过屏蔽数组,

masked = np.ma.masked_where(z1<.1,z3**2)
masked2 = np.ma.masked_where(z2<.1,z4**2)

ax.tripcolor(triang, masked, shading='gouraud', cmap="Greens")
ax.tripcolor(triang, masked2, shading='gouraud', cmap="Reds")

不过还是没用。

并不是说它不起作用,只是你绘制了两​​次相同的三角剖分,只是改变了颜色(tripcolor 签名中 triang 之后的参数是数据点的颜色)。

Cf the doc on tripcolor :

The next argument must be C, the array of color values, either one per point in the triangulation if color values are defined at points, or one per triangle in the triangulation if color values are defined at triangles. If there are the same number of points and triangles in the triangulation it is assumed that color values are defined at points; to force the use of color values at triangles use the kwarg facecolors*=C instead of just *C.

所以你下面的代码正在做的是用 cmap Greens 的颜色级别 z1**2 绘制三角剖分 triang,然后在它上面绘制完全相同的三角剖分,只是改变颜色级别为 z2**2 和 cmap 为 Reds.

ax.tripcolor(triang, z2**2, shading='gouraud', cmap='Greens')
ax.tripcolor(triang, z1**2, shading='gouraud', cmap='Reds')

当然,您只能看到最后绘制的(红色),因为它恰好覆盖了第一个绘制的(绿色)。您也许可以通过 alpha :

使用透明度来查看两者
ax.tripcolor(triang, z2**2, shading='gouraud', cmap='Greens', alpha=0.5)
ax.tripcolor(triang, z1**2, shading='gouraud', cmap='Reds', alpha=0.5)

但最终结果将是混合颜色(最后绘制的占主导地位),我不确定这是否是您想要的...

就像cphlewis说的,如果你展示你使用什么样的数据,你想要什么样的结果,会更容易理解你想要什么。

编辑:

我想我找到了一种使用掩码来做你想做的事情的方法:

import matplotlib.pyplot as plt
import matplotlib.tri as tri

x = np.random.uniform(-0.7,0.7,10)
y = np.random.uniform(-0.7,0.7,10)
z1 = np.random.uniform(-1,1,10)
z2 = - z1

circle=plt.Circle((0,0),1,color="black",fill=False)

triang1 = tri.Triangulation(x, y)
triang2 = tri.Triangulation(x, y)

mask1 = np.logical_or.reduce(( np.where(z1[triang1.triangles]<=0, 1,0).T ))
mask2 = np.logical_or.reduce(( np.where(z2[triang2.triangles]<=0, 1,0).T ))

triang1.set_mask(mask1)
triang2.set_mask(mask2)

ax = plt.subplot(111)
ax.set_aspect('equal')
ax.add_artist(circle)

t1 = ax.tripcolor(triang1, z1, shading='gouraud', cmap=matplotlib.cm.Greens, alpha=0.5)
t2 = ax.tripcolor(triang2, z2, shading='gouraud', cmap=matplotlib.cm.Reds, alpha=0.5)

基本上,您创建一个蒙版,然后设置它和 triang1,这将控制显示哪个三角形。

triang2.triangles 是三角形列表(实际上是一个 3*nb_of_triangles 数组,基本上是一个顶点数组)。 z2[triang2.triangles] 为每个顶点提供相应的 zlevel。 np.where(z2[triang2.triangles]<=0,1,0).T 测试顶点级别是否为零,因此是否应该屏蔽它。 np.logical_or.reduce 做一个逻辑或,如果三角形的至少一个顶点被遮蔽(所以基本上,只有顶点可见的三角形不被遮蔽)。

请注意,可能有一些方法可以通过直接编辑 t1._facecolors 来实现透明度,但我真的看不出这些是如何计算的...