2016-11-08 40 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