Проблема анимации matplotlib pcolor-графика с полярной проекцией с использованием объекта - PullRequest
1 голос
/ 29 июня 2019

Я пытаюсь создать объект для черчения, который создает анимированный сюжет matplotlib pcolor с полярной проекцией.В настоящее время объект может создать набор полярных графиков или попытаться создать анимацию этих графиков.

При создании набора полярных графиков (но не анимации) объект работает как запланировано.

Анимационная часть объекта основана на этом примере , который работает в моей системе.К сожалению, анимация, реализованная в моем объекте, не работает.Для анимации созданы фигура и файл MP4, но и фигура, и слишком короткая анимация показывают только некоторые неправильные оси.

У кого-нибудь есть предложения, как запечатлеть эту серию фигур в анимации при встраивании в объект?

Я использую python 3.7, matplotlib 3.03 на компьютере с Windows 10

Код для объекта и код для запуска его реализации приведены ниже.

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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...