Python 在tripcolor错误中设置_数组()?

Python 在tripcolor错误中设置_数组()?,python,matplotlib,Python,Matplotlib,我不熟悉Python和matplotlib,最近我引用来更新我的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):

我不熟悉
Python
matplotlib
,最近我引用来更新我的
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)
出现了。但是,如果我在创建
tripcolor
后尝试更新

# Not working well
p = plt.tripcolor(triang, xf)
p.set_array(zf)
然后,出现了。
xf
zf
具有相同的尺寸

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

非常感谢

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

更新

谢谢大家。我自己解决了

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

所以

如我所愿。

原因

p = plt.tripcolor(triang, xf)
p.set_array(zf)
未按预期(可能)工作,如下所示。在您的例子中,
plt.tripcolor()
返回一个
PolyCollection
PolyCollection
set\u array()
基本上将设置该集合的颜色。但是,基础三角形将不会更改,因此最终将使用
xf
中的三角形,而使用
zf
中的颜色

由于tripcolor PolyCollection的生成非常复杂(正如它所调用的
三角剖分
本身),并且可能没有用于外部设置数据的辅助函数(至少我不知道有),因此解决方案可能是根本不更新tripcolor,而是生成一个新的tripcolor

你有什么理由更新吗?难道你不能直接创建
p=plt.tripcolor(三角形,zf)

如果有真正的原因,比如在动画中,一个选项是在设置下一个tripcolor绘图之前删除第一个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)
不过,这并不是很有效,如果有人有更好的想法,我也想听听这个想法

原因是什么

p = plt.tripcolor(triang, xf)
p.set_array(zf)
未按预期(可能)工作,如下所示。在您的例子中,
plt.tripcolor()
返回一个
PolyCollection
PolyCollection
set\u array()
基本上将设置该集合的颜色。但是,基础三角形将不会更改,因此最终将使用
xf
中的三角形,而使用
zf
中的颜色

由于tripcolor PolyCollection的生成非常复杂(正如它所调用的
三角剖分
本身),并且可能没有用于外部设置数据的辅助函数(至少我不知道有),因此解决方案可能是根本不更新tripcolor,而是生成一个新的tripcolor

你有什么理由更新吗?难道你不能直接创建
p=plt.tripcolor(三角形,zf)

如果有真正的原因,比如在动画中,一个选项是在设置下一个tripcolor绘图之前删除第一个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)

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

因为链接的帖子显然对你有所帮助,所以你可以(也应该?)对贴在那里的答案进行投票。。。即使它只对你有帮助,但并没有解决你的问题。@rll我确实投了赞成票,但因为我的声誉很低,我的反馈不会显示给其他人。对不起,我的不好:)我正在更加专心地阅读你的问题,你在设置数组后是否尝试重新绘制?@rll谢谢。我试过了,它确实奏效了,但太慢了。我在这里发布的代码只是为了重现我的问题,而我正在处理的实际数据非常庞大。此外,我计划经常画这些数字,所以我认为如果可能的话,我应该避免重新画。或者,在这些事情完成后,有没有办法刷新这些数字?因为链接的帖子显然对你有所帮助,你可以(也应该?)对张贴在那里的答案进行投票。。。即使它只对你有帮助,但并没有解决你的问题。@rll我确实投了赞成票,但因为我的声誉很低,我的反馈不会显示给其他人。对不起,我的不好:)我正在更加专心地阅读你的问题,你在设置数组后是否尝试重新绘制?@rll谢谢。我试过了,它确实奏效了,但太慢了。我在这里发布的代码只是为了重现我的问题,而我正在处理的实际数据非常庞大。此外,我计划经常绘制这些图形,因此我认为如果可以的话,我应该避免重新绘制。或者,有没有办法在完成这些操作后刷新图形?感谢您分享您的解决方案。不过,由于缺乏控制数据的手段,我感到困惑
Triangal
xf
yf
构成,它们的尺寸与
zf
相同。它只需要改变颜色,看起来很简单。另一方面,根据您的诊断,我认为,使用
zf
创建
p=plt.tripcolor(三角形,zf)
,然后再次将数组设置为
zf
p.set_数组(zf)
应该可以,但我又错了。类似的模式,只是颜色有点不同。您可能想看看
tripcolor
的源代码,看看“只是”更改颜色需要什么。最后,不管你是自己做这些,还是删除对象并创建一个新对象
p.set_array(zf)
与调用
plt.tripcolor(trinal,zf)
仍然不同,因为涉及到一个内在的三角剖分步骤。感谢您分享您的解决方案。不过,由于缺乏控制数据的手段,我感到困惑<代码>三角形由构建