我是Python
和matplotlib
的新手,我最近引用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 figure。 xf
和zf
都有相同的维度。
我做错了什么?问题的原因是什么,我该如何避免?
非常感谢提前。
=============================================== ==========
更新
谢谢大家。我实际上解决了自己。
关键是我需要为每个区域分配颜色,由shading
参数控制,tripcolor
的默认值为'flat'
,也就是每个顶点的颜色。因此,当我绘制第一个图时,我需要确保着色为'gouraud'
,为每个区域指定颜色。
所以,
p = plt.tripcolor(triang, xf, shading='gouraud')
p.set_array(zf)
按照我的意图行事。
答案 0 :(得分:0)
原因
p = plt.tripcolor(triang, xf)
p.set_array(zf)
未按预期工作,可能如下。在您的情况下,plt.tripcolor()
会返回PolyCollection
。 PolyCollection
的{{1}}将基本上设置该集合的颜色。但是,不会更改基础三角形,这样您最终会得到set_array()
中的三角形,但来自xf
的颜色。
由于tripcolor PolyCollection的生成非常复杂(因为它本身调用zf
)并且可能没有辅助函数来从外部设置数据(至少我不知道任何),解决方案可能不要更新tripcolor而是生成一个新的。
你有什么理由要更新吗?你不能直接创建Triangulation
吗?
如果有真正的理由,就像动画一样,可以选择在设置下一个之前删除第一个tripcolor图。
p = plt.tripcolor(triang, zf)
但这并不是很有效,如果有人有更好的想法,我也想听听那个。