簡體   English   中英

如何在 animation 期間更新子圖的顏色條?

[英]How to update subplot's colorbar during animation?

下面是我的示例 animation 和子圖。 我有兩個顏色條:本地和全局。 我找到了一種在 animation 期間更新全局顏色條的方法。 但是,我找不到更新本地的方法。

在當前的實現中,在每次迭代中我都會得到一個額外的顏色條(見附件)。 鑒於代碼結構,有沒有辦法清除/更新它?

import numpy as np
from scipy import interpolate
from scipy.interpolate import griddata
import matplotlib.pyplot as plt
import math
from scipy.interpolate import RectBivariateSpline
import matplotlib.animation as animation

# Animation with subplots

fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(15,15), subplot_kw=dict(projection='polar'))

def myValues(*args):
    azimuths = np.radians(np.linspace(0, 360, 20))
    zeniths  = np.arange(0, 150, 10)

    rho, theta = np.meshgrid(zeniths, azimuths)
    values     = np.random.random((azimuths.size, zeniths.size))
    
    return theta, rho, values

# ---------------------------------Sub-plot #1 ---------------------------------
theta, rho, values = myValues()
im1 = axes.flat[0].contourf(theta, rho, values, 150, cmap='jet')
fig.colorbar(im1, ax=axes.flat[0]) # local colorbar

# ---------------------------------Sub-plot #2 ---------------------------------
theta, rho, values = myValues()
im2 = axes.flat[1].contourf(theta, rho, values, 150, cmap='jet')

# ---------------------------------Sub-plot #3 ---------------------------------
theta, rho, values = myValues()
im3 = axes.flat[2].contourf(theta, rho, values, 150, cmap='jet')

# ---------------------------------Sub-plot #4 ---------------------------------
theta, rho, values = myValues()
im4 = axes.flat[3].contourf(theta, rho, values, 150, cmap='jet')

# Global colorbar
fig.subplots_adjust(right=0.94)
cax = fig.add_axes([0.95, 0.15, 0.02, 0.7])
gcb = fig.colorbar(im4, cax=cax)

# This function is called periodically from FuncAnimation
def updateFig(*args):
    
    global im1, im2, im3, im4, lcb, gcb
    
    # ---------------------------------Sub-plot #1 ---------------------------------
    theta, rho, values = myValues()
    
    for c in im1.collections:
        c.remove()  # removes only the contours, leaves the rest intact
    
    im1 = axes.flat[0].contourf(theta, rho, values, 150, cmap='jet')
    
    # How to update this local colorbar?
    lcb = fig.colorbar(im1, ax=axes.flat[0])

    # ---------------------------------Sub-plot #2 ---------------------------------
    theta, rho, values = myValues()
    
    for c in im2.collections:
        c.remove()
    
    im2 = axes.flat[1].contourf(theta, rho, values, 150, cmap='jet')

    # ---------------------------------Sub-plot #3 ---------------------------------
    theta, rho, values = myValues()
    
    for c in im3.collections:
        c.remove()
    
    im3 = axes.flat[2].contourf(theta, rho, values, 150, cmap='jet')

    # ---------------------------------Sub-plot #4 ---------------------------------
    theta, rho, values = myValues()
    
    for c in im4.collections:
        c.remove()
    
    im4 = axes.flat[3].contourf(theta, rho, values, 150, cmap='jet')
    
    # Update global colorbar
    cax.cla()
    gcb = fig.colorbar(im4, cax=cax)
    
# Set up plot to call animate() function periodically
ani = animation.FuncAnimation(fig, updateFig)
plt.show()

這篇文章https://stackoverflow.com/questions/39472017/how-to-animate-the-colorbar-in-matplotlib似乎是相關的,但我無法通過子圖對我的案例采用建議的解決方案。

這是我的解決方法:

# Animation with subplots
from mpl_toolkits.axes_grid1 import make_axes_locatable

fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(15,15), subplot_kw=dict(projection='polar'))

def myValues(*args):
    azimuths = np.radians(np.linspace(0, 360, 20))
    zeniths  = np.arange(0, 150, 10)

    rho, theta = np.meshgrid(zeniths, azimuths)
    values     = np.random.random((azimuths.size, zeniths.size))
    
    return theta, rho, values

# ---------------------------------Sub-plot #1 ---------------------------------
theta, rho, values = myValues()
im1 = axes.flat[0].contourf(theta, rho, values, 150, cmap='jet')

#Local colorbar
fig.subplots_adjust(right=0.47)
lcb_cax = fig.add_axes([0.5, 0.53, 0.02, 0.35])
lcb = fig.colorbar(im1, cax=lcb_cax)

# ---------------------------------Sub-plot #2 ---------------------------------
theta, rho, values = myValues()
im2 = axes.flat[1].contourf(theta, rho, values, 150, cmap='jet')

# ---------------------------------Sub-plot #3 ---------------------------------
theta, rho, values = myValues()
im3 = axes.flat[2].contourf(theta, rho, values, 150, cmap='jet')

# ---------------------------------Sub-plot #4 ---------------------------------
theta, rho, values = myValues()
im4 = axes.flat[3].contourf(theta, rho, values, 150, cmap='jet')

# Global colorbar
fig.subplots_adjust(right=0.94)
cax = fig.add_axes([0.95, 0.15, 0.02, 0.7])
gcb = fig.colorbar(im4, cax=cax)

# This function is called periodically from FuncAnimation
def updatefig(*args):
    
    global im1, im2, im3, im4, lcb, gcb
    
    # ---------------------------------Sub-plot #1 ---------------------------------
    theta, rho, values = myValues()
    
    for c in im1.collections:
        c.remove()  # removes only the contours, leaves the rest intact
    
    im1 = axes.flat[0].contourf(theta, rho, values, 150, cmap='jet')
    
    # How to update this local colorbar?
    lcb_cax.cla()
    lcb = fig.colorbar(im1, cax=lcb_cax)

    # ---------------------------------Sub-plot #2 ---------------------------------
    theta, rho, values = myValues()
    
    for c in im2.collections:
        c.remove()
    
    im2 = axes.flat[1].contourf(theta, rho, values, 150, cmap='jet')

    # ---------------------------------Sub-plot #3 ---------------------------------
    theta, rho, values = myValues()
    
    for c in im3.collections:
        c.remove()
    
    im3 = axes.flat[2].contourf(theta, rho, values, 150, cmap='jet')

    # ---------------------------------Sub-plot #4 ---------------------------------
    theta, rho, values = myValues()
    
    for c in im4.collections:
        c.remove()
    
    im4 = axes.flat[3].contourf(theta, rho, values, 150, cmap='jet')
    
    # Update global colorbar
    gcb_cax.cla()
    gcb = fig.colorbar(im4, cax=gcb_cax)
    
# Set up plot to call animate() function periodically
ani = animation.FuncAnimation(fig, updatefig)

plt.show()

最有可能的是,有更好的方法來做到這一點。 如果你知道,請告訴我!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM