【问题标题】:Update range of colorbar in matplotlib更新 matplotlib 中颜色条的范围
【发布时间】:2017-04-20 10:59:40
【问题描述】:

我想在函数中更新contourf 绘图,它工作正常。 但是,数据的范围发生了变化,因此我还必须更新颜色条。这就是我没有这样做的地方。

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

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 个?

【问题讨论】:

    标签: python matplotlib colorbar contourf


    【解决方案1】:

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

    【讨论】:

    • 不完全。这从情节中“窃取”了一些空间。请参阅@ImportanceOfBeingErnest 的解决方法。
    • @J.Serra 虽然原则上可以删除和添加颜色条,但实际上它变得有点复杂,如this question 所示。
    【解决方案2】:

    您可以使用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()
    

    【讨论】:

    • 我正在修改的实际脚本非常复杂,并且有极坐标图。我宁愿不碰这个。 imshow 可以处理极坐标吗?
    • 不,不是直接的,需要手动转换数据以适应矩形网格。也许删除和重绘颜色条也是一种选择? (我刚才回复了a question about that
    • 那行得通。谢谢。但是你知道为什么使用 imshow 时 colorbar 的更新有效,而对 contourf 无效吗?
    • @Sebastian 颜色条的更新适用于任何类型的情节。问题是无法更新contour。在您删除并重新创建contour 的那一刻,最初的cbar 失去了与contour 的链接,因此无法正确更新。对于像imshow 这样的其他图,这个问题不存在,因为您可以更新基础数据。实际上我不确定是否有办法重新建立cbar 和新创建的contour 之间的链接 - 我只是不知道。
    猜你喜欢
    • 1970-01-01
    • 2011-03-23
    • 1970-01-01
    • 2012-07-08
    • 2011-02-02
    • 1970-01-01
    • 1970-01-01
    • 2017-08-01
    • 1970-01-01
    相关资源
    最近更新 更多