tripcolor中的set_array()bug?

时间:2016-11-08 17:01:30

标签: python matplotlib

我是Pythonmatplotlib的新手,我最近引用THIS来更新我的tripcolor图。随后进行数据准备

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 figurexfzf都有相同的维度。

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

非常感谢提前。

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

更新

谢谢大家。我实际上解决了自己。

关键是我需要为每个区域分配颜色,由shading参数控制,tripcolor的默认值为'flat',也就是每个顶点的颜色。因此,当我绘制第一个图时,我需要确保着色为'gouraud',为每个区域指定颜色

所以,

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

按照我的意图行事。

1 个答案:

答案 0 :(得分:0)

原因

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

未按预期工作,可能如下。在您的情况下,plt.tripcolor()会返回PolyCollectionPolyCollection的{​​{1}}将基本上设置该集合的颜色。但是,不会更改基础三角形,这样您最终会得到set_array()中的三角形,但来自xf的颜色。

由于tripcolor PolyCollection的生成非常复杂(因为它本身调用zf)并且可能没有辅助函数来从外部设置数据(至少我不知道任何),解决方案可能不要更新tripcolor而是生成一个新的。

你有什么理由要更新吗?你不能直接创建Triangulation吗?

如果有真正的理由,就像动画一样,可以选择在设置下一个之前删除第一个tripcolor图。

p = plt.tripcolor(triang, zf)

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