Python matplotlib中颜色栏的更新范围

Python matplotlib中颜色栏的更新范围,python,matplotlib,colorbar,contourf,Python,Matplotlib,Colorbar,Contourf,我想在一个函数中更新一个tourtf绘图,它可以正常工作。 然而,数据的范围发生了变化,因此我还必须更新颜色栏。这就是我未能做到的地方 请参阅以下最低工作示例: 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.li

我想在一个函数中更新一个
tourtf
绘图,它可以正常工作。 然而,数据的范围发生了变化,因此我还必须更新颜色栏。这就是我未能做到的地方

请参阅以下最低工作示例:

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()
我得到以下图像:

这正是我想要的。 在
update()
函数中,我基本上将数据范围从
[0,1)
更改为
[0,2)
,创建新数据,并更新绘图。我还尝试将颜色条刻度中的采样加倍,使刻度间隔为0.1,而不是0.2。这就是我得到的结果:


数据打印正确,数据的颜色映射正确,颜色条中的刻度和颜色正确,但颜色条的范围仍然是从0到1。如何更改颜色条以显示最大为2的完整范围?

您可以使用
imshow
而不是
轮廓
?在这种情况下,只需使用同时更新绘图和颜色栏

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()
已更新 我已经根据你的评论和这个答案更新了我的答案

这就是你想做的

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()

我正在修改的实际脚本非常复杂,并且有极坐标的绘图。我不想碰这个。可以
imshow
处理极坐标吗?不,不直接,需要手动转换数据以适应矩形网格。也许移除和重绘颜色条也是一个选项?(我刚才回答了)那就行了。谢谢。但是你知道为什么在使用imshow时色条的更新会起作用,而不是contourf吗?@Sebastian色条的更新会对任何类型的绘图起作用。问题是不可能更新
contour
。在你移除并重新创建
contour
的那一刻,初始的
cbar
has失去了与
等高线的链接,因此无法正确更新。对于其他绘图,如
imshow
,此问题不存在,因为您可以更新基础数据。实际上,我不确定是否有办法重新建立
cbar
与新创建的
等高线之间的链接-我很抱歉st不知道。不完全清楚。这会“偷走”情节中的一些空间。请参阅@ImportanceOfBeingErnest.@J.Serra的解决方法。在principe中,可以删除和添加颜色条,但实际上,颜色条会变得更复杂,如中所示。