2016-12-05 429 views
1

我想更新一個函數內的contourf圖,它可以正常工作。 但是,數據的範圍發生變化,因此我也必須更新顏色條。那是我未能這樣做的地方。matplotlib中colorbar的更新範圍

請參閱以下最低工作示例:

import matplotlib.pyplot as plt 
import numpy as np 

fig = plt.figure() 
ax = fig.add_subplot(111) 

# Random data 
data = np.random.rand(10, 10) 

# Plot data 
levels = np.linspace(0., 1., 100) 
plot = ax.contourf(data, levels=levels) 
clist = plot.collections[:] 

# Create colorbar 
cbar = plt.colorbar(plot) 
cbar_ticks = np.linspace(0., 1., num=6, endpoint=True) 
cbar.set_ticks(cbar_ticks) 

plt.show() 

def update(): 
    # Remove old plot 
    for c in clist: 
     ax.collections.remove(c) 
     clist.remove(c) 

    # Create new data and plot 
    new_data = 2.*np.random.rand(10, 10) 
    new_levels = np.linspace(0., 2., 200) 
    new_plot = ax.contourf(new_data, levels=new_levels) 

    # Modify colorbar 
    cbar.set_clim(0., 2.) 
    new_cbar_ticks = np.linspace(0., 2., num=21, endpoint=True) 
    cbar.set_ticks(new_cbar_ticks) 

    plt.draw() 

update() 

如果不調用update()我獲得下面的圖片:

enter image description here

這正是我想要的。 在update()函數中,我基本上將數據範圍從[0,1)更改爲[0,2),創建新數據並更新繪圖。我還嘗試將色條中的採樣加倍,使間隔爲0.1,而不是0.2。這就是我得到:

enter image description here

的數據是正確的繪製,數據的顏色映射是正確的,蜱,並在彩條的顏色是正確的,但是彩條的範圍仍然是從0到1.如何更改顏色條以顯示最大2的全部範圍?

回答

0

你可以使用imshow而不是contour嗎?在這種情況下,只需更新兩者,繪圖和顏色條都很容易。

import matplotlib.pyplot as plt 
import numpy as np 

fig = plt.figure() 
ax = fig.add_subplot(111) 

# Random data 
data = np.random.rand(10, 10) 

# Plot data 
plot = ax.imshow(data) 


# Create colorbar 
cbar = plt.colorbar(plot) 
cbar_ticks = np.linspace(0., 1., num=6, endpoint=True) 
cbar.set_ticks(cbar_ticks) 

plt.show(block=False) 

def update(): 

    new_data = 2.*np.random.rand(10, 10) 

    plot.set_data(new_data) 
    cbar.set_clim(vmin=0,vmax=2) 
    cbar_ticks = np.linspace(0., 2., num=11, endpoint=True) 
    cbar.set_ticks(cbar_ticks) 
    cbar.draw_all() 
    plt.draw() 

    plt.show() 

update() 
+0

我正在修改的實際腳本非常複雜,並且在極座標中有圖。我寧願不要碰這個。 可以'imshow'處理極座標嗎? – Sebastian

+0

不,不是直接的,人們需要手動轉換數據以適應矩形網格。也許刪除和重繪彩條也是一個選擇? (我剛纔回答了[有關此問題](http://stackoverflow.com/a/40774184/4124317)) – ImportanceOfBeingErnest

+0

這很有效。謝謝。 但是,你知道爲什麼使用imshow時colorbar的更新工作,但不知道爲contourf嗎? – Sebastian

0

更新 我已經根據您的意見和這個答案更新我的答案。 Link

這就是你想要做的?

import matplotlib.pyplot as plt 
import numpy as np 

fig = plt.figure() 
ax = fig.add_subplot(111) 

# Random data 
data = np.random.rand(10, 10) 

# Plot data 
levels = np.linspace(0., 1., 100) 
plot = ax.contourf(data, levels=levels) 

# Create colorbar 
cbar = plt.colorbar(plot) 
cbar_ticks = np.linspace(0., 1., num=6, endpoint=True) 
cbar.ax.set_autoscale_on(True) 
cbar.set_ticks(cbar_ticks) 

plt.show(block=False) 

def update(): 
    global cbar 

    cbar.remove() 
    fig.clear() 

    # Create new data and plot 
    new_data = 2.*np.random.rand(10, 10) 
    new_levels = np.linspace(0., 2., 200) 
    ax = fig.add_subplot(111) 
    plot = ax.contourf(new_data, levels=new_levels) 

    cbar = plt.colorbar(plot) 
    cbar_ticks = np.linspace(0., 2., num=21, endpoint=True) 
    cbar.set_ticks(cbar_ticks)  
    plt.draw() 

update() 
+1

不完全。這「竊取」了情節中的一些空間。通過@ImportanceOfBeingErnest查看解決方法。 – Sebastian

+1

@ J.Serra雖然在principe中可以刪除和添加顏色條,但實際上它變得有點複雜了,如[這個問題]所示(http://stackoverflow.com/questions/40771464/如何做檢查,IF-彩條-存在,上圖)。 – ImportanceOfBeingErnest

+0

你說得對,對不起,我已經更新了我的答案。 –