Актуализирайте диапазона на цветната лента в matplotlib

Искам да актуализирам графика 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?


person Sebastian    schedule 05.12.2016    source източник


Отговори (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()
person ImportanceOfBeingErnest    schedule 06.12.2016
comment
Действителният скрипт, който модифицирам, е доста сложен и има графики в полярни координати. Предпочитам да не пипам това. Може ли imshow да се справи с полярни координати? - person Sebastian; 06.12.2016
comment
Не, не директно, ще трябва да трансформирате данните ръчно, за да се поберат в правоъгълна мрежа. Може би премахването и преначертаването на цветната лента също би било опция? (Отговорих на на въпрос за това преди малко) - person ImportanceOfBeingErnest; 06.12.2016
comment
Това работи. благодаря Но знаете ли защо актуализацията на цветната лента работи, когато използвате imshow, но не и за contourf? - person Sebastian; 06.12.2016
comment
@Sebastian Актуализацията на цветната лента ще работи с всякакъв вид сюжет. Проблемът е, че не е възможно да се актуализира contour. В момента, в който премахнете и създадете отново contour, първоначалният cbar е загубил връзката си с contour и следователно не може да бъде актуализиран правилно. За други диаграми като imshow този проблем не съществува, тъй като можете да актуализирате основните данни. Всъщност не съм сигурен дали няма начин да се възстанови връзката между cbar и новосъздадения contour - просто не знам за такъв. - person ImportanceOfBeingErnest; 06.12.2016

Актуализирано Актуализирах отговора си въз основа на вашите коментари и този отговор. Връзка

Това ли се опитваш да направиш?

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()
person J.Serra    schedule 06.12.2016
comment
Не точно. Това краде малко място от сюжета. Вижте заобиколното решение от @ImportanceOfBeingErnest. - person Sebastian; 06.12.2016
comment
@J.Serra Въпреки че по принцип е възможно да се премахне и добави цветната лента, в действителност се оказва малко по-сложно, както е показано в този въпрос. - person ImportanceOfBeingErnest; 06.12.2016