使用对象通过极角投影为Matplotlib pcolor绘图设置动画问题

时间:2019-06-29 17:46:36

标签: python matplotlib animation

我正在尝试创建一个绘图对象,该对象生成带有极性投影的动画matplotlib pcolor绘图。目前,该对象可以创建一组极坐标图,也可以尝试创建这些极坐标图的动画。

创建极坐标图集(而不是动画)时,对象按计划工作。

对象的动画部分基于此example,在我的系统上有效。不幸的是,在我的对象中实现的动画无法正常工作。虽然为动画制作了一个图形和一个MP4文件,但是该图形和太短的动画都只显示了一些形状错误的轴。

有人建议将动画嵌入到对象中时如何在动画中捕获该图形系列吗?

我在Windows 10计算机上使用python 3.7,matplotlib 3.03

该对象的代码及其运行实例化的代码如下。

class Polar_smudge(object):
 # object for creating polar contour plots

 def __init__(self,  azimuth_grid, range_grid):
   import numpy as np

   self.azimuth_grid  = np.deg2rad(azimuth_grid)
   self.range_grid    = range_grid      
   self.fig =  None 
   self.ax =  None 
   self.images = []
 #------------------------------------------------------------------   
 def add_data(self, value_grid):
   import numpy as np

   self.value_grid = value_grid
   self.value_grid[self.value_grid<=0] = np.nan


 #------------------------------------------------------------------   
 def add_figure(self, value_grid):
    import matplotlib.pyplot as plt

    # make and set-up figure
    fig, ax = plt.subplots(subplot_kw=dict(projection='polar'))
    ax.set_theta_zero_location("N")
    ax.set_theta_direction(-1)
    ax.set_rlim([0,10])
    # make plot
    cax = ax.pcolor(self.azimuth_grid, self.range_grid, value_grid,  cmap=plt.cm.viridis_r)
    ax.grid()
    plt.show()


 #------------------------------------------------------------------   
 def start_figure(self):
    import matplotlib.pyplot as plt

    # make and set-up figure
    if self.fig is  None :
      self.fig, self.ax = plt.subplots(111, subplot_kw=dict(projection='polar'))
      self.ax[0].set_theta_zero_location("N")
      self.ax[0].set_theta_direction(-1)


 def update_figure(self, value_grid):
    import matplotlib.pyplot as plt

    # make figure and add to image list
    self.images.append((self.ax[0].pcolor(self.azimuth_grid, self.range_grid, value_grid,  cmap=plt.cm.viridis_r),))


 def end_figure(self):
    import matplotlib.animation as animation

    # animate the figure list
    im_ani = animation.ArtistAnimation(self.fig, self.images, interval=50, repeat_delay=3000,blit=True)
    im_ani.save('smudge.mp4')

#============This runs the object ====================================  
import numpy as np

azimuth_bins  = np.linspace(0, 360, 360)
range_bins     = np.linspace(0, 10, 30)

# make plotting azim range grids
range_grid, azimuth_grid = np.meshgrid(range_bins, azimuth_bins)

# this works but isnt what I want
good_smudge = Polar_smudge(azimuth_grid,range_grid)  
for ix in range(3):
    val_grid = np.random.randn(360,30)
    good_smudge.add_figure(val_grid)

# this doesnt work
bad_smudge = Polar_smudge(azimuth_grid,range_grid)  
bad_smudge.start_figure()  
for ix in range(3):
    val_grid = np.random.randn(360,30)
    bad_smudge.update_figure(val_grid)
bad_smudge.end_figure()

针对Earnest的评论,我做了一些进一步的改进,看来问题不在于嵌入到对象中,而且增加帧数(例如增加到30个)也不能解决问题。问题。下面的代码段更简洁地演示了该问题(但缺少正确生成的图形输出选项)。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

azimuth_bins  = np.linspace(0, 360, 60)
range_bins     = np.linspace(0, 10, 30)
images = []
# make plotting azim range grids
range_grid, azimuth_grid = np.meshgrid(range_bins, azimuth_bins)


fig,ax = plt.subplots(111, subplot_kw=dict(projection='polar'))
ax[0].set_theta_zero_location("N")
ax[0].set_theta_direction(-1)

for ix in range(30):
    val_grid = np.random.randn(60,30)
    images.append((ax[0].pcolor(azimuth_grid, range_grid, val_grid,  cmap=plt.cm.viridis_r),))


# animate the figure list
im_ani = animation.ArtistAnimation(fig, images, interval=50, repeat_delay=3000,blit=False)

im_ani.save('smudge2.mp4')

0 个答案:

没有答案