我似乎无法解决这个问题。我有多组具有相同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")
非常感谢任何帮助,谢谢。
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")
但仍无济于事。
答案 0 :(得分:1)
并不是它不起作用,只是你正在绘制两次相同的三角测量,只改变颜色(在tripcolor签名中的triang后面的参数是数据点的颜色)。
下一个参数必须是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
可能会有某种方式来实现透明度,但我无法真正看到这些是如何计算的......