Обновите контур с помощью цветной панели в matplotlib

Вот мой тестовый код.

import os
import matplotlib.pyplot as plt

import numpy as np

a = np.arange(10)
bb, cc = np.meshgrid(a, a)
u = np.random.randint(2, 4, (10, 10))
v = np.random.randint(2, 4, (10, 10))

fig = plt.figure(figsize=(10, 10))
ax = fig.add_subplot(111)
plt.subplots_adjust(left=0.07, bottom=0.01, right=0.95,
                    top=0.94, hspace=0.0, wspace=0.0)

for i in range(10):

    u = np.random.randint(2, 4, (10, 10))
    v = np.random.randint(2, 4, (10, 10))
    ws = np.sqrt(u**2 + v**2)
    cf = plt.contourf(bb, cc, ws)
    cb = plt.colorbar(cf)

    fig.canvas.update()
    fig.canvas.flush_events()

    plt.savefig('test_barb/%i.png' % i, dpi=200)
    for c in cf.collections:
        c.remove()
    cb.remove()

Что меня смущает, так это то, что выходные изображения становятся все меньше и меньше, чем больше кадров я рисую. Есть ли способ предотвратить это?

0.png

1.png Последний


person Li Ziming    schedule 11.10.2017    source источник
comment
Повторяющийся вопрос показывает, как обновить цветные полосы. Вопросы, касающиеся нескольких разных проблем, не относятся к теме SO. Я бы порекомендовал задать новый конкретный вопрос о колючках, который не зависит от цветных полос.   -  person ImportanceOfBeingErnest    schedule 11.10.2017
comment
отлично, третий вопрос был не главным вопросом! поэтому я хотел бы удалить его и не дублировать.   -  person Li Ziming    schedule 11.10.2017
comment
На первый вопрос также отвечает дубликат. Вы, конечно, можете удалить и это, но затем также удалите цветную полосу из кода, а также (тогда несвязанные) изображения.   -  person ImportanceOfBeingErnest    schedule 11.10.2017
comment
Я все еще не понимаю. Не могли бы вы объяснить мне это снова? Спасибо за помощь.   -  person Li Ziming    schedule 11.10.2017
comment
Я все еще не понимаю. Не могли бы вы еще раз объяснить мне это? Спасибо за помощь.   -  person Li Ziming    schedule 11.10.2017
comment
Нельзя задавать несколько вопросов в одном. Поэтому, если проблема с цветной полосой все еще не ясна, задайте один вопрос об обновлении графика contourf с помощью цветной полосы и задайте другой вопрос об обновлении графика с зазубринами. Часть кода с зазубринами из вопроса не работает (выдает ошибку), поэтому вам также необходимо изменить этот бит.   -  person ImportanceOfBeingErnest    schedule 11.10.2017
comment
Я сейчас снял колкости с вопроса и дал на него ответ. Что касается колючек, задайте новый вопрос (без цветных полос), но с минимально воспроизводимым примером проблемы, которая на самом деле работоспособный.   -  person ImportanceOfBeingErnest    schedule 11.10.2017
comment
@ImportanceOfBeingErnest Прошу прощения за то, как я задал вопрос. И большое спасибо за ваше терпение. +1   -  person Li Ziming    schedule 12.10.2017


Ответы (1)


Вы хотели бы убедиться, что цветная полоса всегда находится в одних и тех же осях. С этой целью вы можете создать оси цветовой полосы (cax) вне цикла, например. используя axes_divider, и всегда наносите цветную полосу на эту ось, fig.colorbar(cf, cax=cax).

import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1.axes_divider import make_axes_locatable
import numpy as np

a = np.arange(10)
bb, cc = np.meshgrid(a, a)
u = np.random.randint(2, 4, (10, 10))
v = np.random.randint(2, 4, (10, 10))

fig = plt.figure(figsize=(6, 6))
ax = fig.add_subplot(111)

# create axes for the colorbar
cax = make_axes_locatable(ax).append_axes("right", size="5%", pad="2%")


for i in range(10):
    # clear colorbar axes
    cax.clear()
    u = np.random.randint(2, 4, (10, 10))
    v = np.random.randint(2, 4, (10, 10))
    ws = np.sqrt(u**2 + v**2)

    cf = ax.contourf(bb, cc, ws)
    # draw new colorbar in existing cax
    cb = fig.colorbar(cf, cax=cax)

    fig.canvas.update()
    fig.canvas.flush_events()

    #plt.savefig('test_barb/%i.png' % i, dpi=200)


plt.show()
person ImportanceOfBeingErnest    schedule 11.10.2017