首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用三色透明绘制多组数据

用三色透明绘制多组数据
EN

Stack Overflow用户
提问于 2015-07-25 20:29:41
回答 1查看 1.5K关注 0票数 3

我似乎解决不了这个问题。我有多组数据,有相同的x,y点。我做Delaunay三角剖分,用三角画。我在这个论坛上读到,要将几组数据绘制到同一个图中,我需要指定轴和其他东西,但这里似乎不适合我( matplotlib的初学者,对不起)。我的代码:

代码语言:javascript
复制
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:我尝试使用彩色地图选项“set_under”显示几个数据集,而不设置所有数据集的透明度:

代码语言:javascript
复制
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)

然后

代码语言:javascript
复制
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的白色覆盖,我希望它是透明的)。我也试过蒙面阵列,

代码语言:javascript
复制
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")

不过还是无济于事。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-26 00:13:03

这并不是因为它不起作用,而是因为您正在绘制两次相同的三角剖分,只更改颜色( triang后面的参数是tripcolor签名中数据点的颜色)。

在tripcolor上引用文档:

下一个参数必须是C,即颜色值的数组,如果在点处定义了颜色值,则在三角剖分中有一个点,如果颜色值是在三角形上定义的,则为每个三角形。如果三角剖分中有相同数量的点和三角形,则假定颜色值是在点处定义的;为了强制在三角形上使用颜色值,可以使用kwarg facecolors*=C而不是仅仅*C。

因此,下面的代码是用cmap triang的颜色级别z1**2绘制三角剖分,然后在上面绘制完全相同的三角剖分,只需将颜色级别更改为z2**2,cmap更改为Reds

代码语言:javascript
复制
ax.tripcolor(triang, z2**2, shading='gouraud', cmap='Greens')
ax.tripcolor(triang, z1**2, shading='gouraud', cmap='Reds')

所以,当然,你只能看到最后一张图(红色),因为它正好覆盖了第一个标图(绿色)。您可能会看到这两种方法都使用alpha的透明性:

代码语言:javascript
复制
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所说的,如果您显示了您使用的数据类型以及您想要什么样的结果,那么就更容易理解您想要的是什么。

编辑:

我想我找到了一种用面具做你想做的事的方法:

代码语言:javascript
复制
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来实现透明性,但我不太清楚它们是如何计算出来的.

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31630825

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档