2016-11-08 53 views
0

我是Pythonmatplotlib的新手,我最近引用了THIS来更新我的tripcolor图。随着下面的数据准备set_array()in tripcolor bug?

import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.tri as tri 
import math 

r = np.zeros((100,100)) 
t = np.zeros((100,100)) 
for i in range(0,100): 
    for j in range(0,100): 
     r[i,j]=i 
     t[i,j]=2*math.pi*j/100 
x=r*np.cos(t) 
y=r*np.sin(t) 
z=r*r 

xf=x.flatten() 
yf=y.flatten() 
zf=z.flatten() 
triang = tri.Triangulation(xf,yf) 

如果我使用tripcolor,因为它的目的是,

# Works well 
p = plt.tripcolor(triang, zf) 

correct figure出现。但是,如果我尝试创建tripcolor后更新

# Not working well 
p = plt.tripcolor(triang, xf) 
p.set_array(zf) 

然后,wrong figure出现。 xfzf都具有相同的尺寸。

我在做什么错?问题的原因是什么,我该如何避免它?

非常感谢提前。

============================================== ===========

更新

谢谢大家。我真的解决了我自己。

的关键是,我需要分配颜色对每个区域,通过shading参数控制的,并且用于tripcolor默认值是'flat',这一点,颜色为每个顶点。所以,当我绘制第一个数字时,我需要确定着色是'gouraud',它为每个区域分配颜色。

所以,

p = plt.tripcolor(triang, xf, shading='gouraud') 
p.set_array(zf) 

作品我打算。

+0

因为显然链接的文章对你有些帮助,你可以(也应该?)upvote在那里发布的答案......即使它只对你有帮助,但并没有解决你的问题。 – rll

+0

@rll我做了upvote,但由于我的声誉很低,我被告知,我的反馈并没有显示给其他人。 –

+0

对不起,我的不好:)然后我正在阅读你的问题更多的关注,你有没有尝试重新设置数组后? – rll

回答

0

原因

p = plt.tripcolor(triang, xf) 
p.set_array(zf) 

未正常工作(可能)预期的,如下所述。在你的情况下,plt.tripcolor()返回PolyCollectionPolyCollectionset_array()将基本上设置该集合的颜色。但是,下面的三角形不会改变,因此最终得到的结果是来自xf的三角形,但是颜色来自zf

由于tripcolor PolyCollection的生成相当复杂(因为它本身称为Triangulation),并且可能没有帮助函数来设置外部数据(至少我没有意识到),所以解决方案可能不是更新tripcolor,而是生成一个新的。

是否有任何理由让您更新?难道你不能直接创建p = plt.tripcolor(triang, zf)

如果真有其原因,比如在动画中等,可以选择删除第一个tripcolor图,然后再设置下一个。

# create one plot 
p = plt.tripcolor(triang, xf) 
#delete this plot (you need both lines actually!!) 
p.remove() 
del p 
#create second plot 
p = plt.tripcolor(triang, zf) 

虽然这不是很有效,但如果有人有更好的想法,我也想听听那个。

+0

感谢您分享您的解决方案。但是,缺乏控制数据的手段让我感到困惑。 'triang'由'xf'和'yf'构造而成,它们与'zf'具有相同的尺寸。它只需要改变颜色,而且看起来很简单。另一方面,根据你的诊断,我认为,用**'zf' **创建; 'p = plt.tripcolor(triang,zf)',然后再次将数组设置为**'zf' **; 'p.set_array(zf)'应该没问题,但我再次得到了错误的数字。类似的模式,只是有点不同的颜色。 –

+0

你可能想看看'tripcolor'的源代码,看看需要什么来“改变”颜色。最后,如果您自己完成所有这些操作,或者删除了对象并创建了一个新对象,则无关紧要。 'p.set_array(zf)'仍然不同于调用'plt.tripcolor(triang,zf)',因为这涉及到三角测量的固有步骤。 – ImportanceOfBeingErnest