python - 如何在动画期间更新子图的颜色条?
问题描述
下面是我的带有子图的示例动画。我有两个颜色条:本地和全局。我找到了一种在动画期间更新全局颜色条的方法。但是,我找不到更新本地的方法。
在当前的实现中,在每次迭代中我都会得到一个额外的颜色条(见附件)。鉴于代码结构,有没有办法清除/更新它?
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()
最有可能的是,有更好的方法来做到这一点。如果你知道,请告诉我!
推荐阅读
- excel-formula - Excel 参考问题 - 公式无法正确复制
- reactjs - TypeScript 和 React Native:使用 Pick
避免使我的代码臃肿 - macos - 为 MacOS 自定义 Electron 中的工具栏
- javascript - 应用程序未连接到 mongodb Atlas
- amazon-web-services - Airflow 仅从 SQS 队列中获取一条消息
- python - 数据框连接表和 groupby 没有给出预期的输出
- java - 如何在 jenkins 作业中运行 main (mvn java)
- amazon-web-services - 过滤器不适用于 int 类型的属性、带有 GSI 的 DynamoDB
- java - Selenium 错误 (Java) - 检测到框架,但在尝试切换到框架时提示 noSuchFrameException
- c# - DateTime.Now 连续多次返回相同的时间