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

时间:2015-07-25 20:29:42

标签: python matplotlib triangulation

我似乎无法解决这个问题。我有多组具有相同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")

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

编辑: 我想要的一个粗略的例子: Phase diagram

EDIT2: 我尝试使用colormap选项“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")

但仍无济于事。

1 个答案:

答案 0 :(得分:1)

并不是它不起作用,只是你正在绘制两次相同的三角测量,只改变颜色(在tripcolor签名中的triang后面的参数是数据点的颜色)。

Cf the doc on tripcolor :

  

下一个参数必须是C,颜色值数组,如果在点处定义颜色值,则在三角测量中每个点一个,或者如果在三角形中定义颜色值,则在三角测量中每个三角形一个。如果在三角测量中存在相同数量的点和三角形,则假设颜色值在点处定义;强制在三角形中使用颜色值使用kwarg facecolors * = C而不仅仅是* C.

下面你的代码正在做的是用cmap triang的颜色级别z1**2绘制三角剖分Greens,然后在其上绘制完全相同的三角剖分,只是改变颜色级别为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可能会有某种方式来实现透明度,但我无法真正看到这些是如何计算的......