我是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
具有相同的尺寸。
我做错了什么?问题的原因是什么,我如何避免它?
非常感谢。
更新
谢谢大家我自己解决了
关键是我需要为每个区域分配 *color *,这是由shading
参数控制的,tripcolor
的默认值是'flat'
,也就是说,color for each vertex。所以,当我绘制第一个图时,我需要确保阴影是'gouraud'
,它为每个区域分配 *color *。
所以,
p = plt.tripcolor(triang, xf, shading='gouraud')
p.set_array(zf)
就像我想的那样。
2条答案
按热度按时间zzlelutf1#
的原因
并没有像预期的那样工作,如下所示。在你的例子中,
plt.tripcolor()
返回一个PolyCollection
。PolyCollection
的set_array()
本质上会设置那个集合的颜色。但是,底层的三角形不会被改变,这样你最终得到的是来自xf
的三角形,而不是来自zf
的颜色。由于tripcolor PolyCollection的生成非常复杂(因为它调用
Triangulation
本身),而且可能没有帮助函数来外部设置数据(至少我不知道有任何帮助函数),解决方案可能是根本不更新tripcolor,而是生成一个新的。有什么理由要更新吗?直接创建
p = plt.tripcolor(triang, zf)
不就行了?如果有一个真实的原因,比如在动画中,一个选项是在设置下一个之前删除第一个tripcolor图。
不过,这并不是真正有效的,如果有人有更好的主意,我也想听听。
qlvxas9a2#
要将
set_array()
与tripcolor(..., shading="flat)
一起使用,您需要传入与每个 * 三角形 * 而不是每个点/顶点的颜色对应的值。表示每个三角形的值只是组成三角形的三个点的平均值。例如: