Matplotlib / Cartopy - 在 Jupyter 笔记本中使用 FuncAnimation 的动画空白
Matplotlib / Cartopy - Animation Blank using FuncAnimation in Jupyter Notebooks
我使用 IPython 显示模块制作了同样的动画,但我希望它是交互式的,所以我尝试使用 matplotlib 动画模块。如果我 运行 下面的 %matplotlib notebook
它只是 returns 一个空白屏幕。如果我 运行 它与 %matplotlib inline
它 returns 只有第一帧。如果我 运行 在内联模式下使用 IPython.dispay 中的 HTML 模块将其保存为 HTML5 视频,它会显示空白屏幕的视频,并且在其下方显示最后一帧(不是第一帧)。
代码如下:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib import colors
from matplotlib import animation
import random
import cartopy.crs as ccrs
from cartopy.io.shapereader import Reader
from cartopy.feature import ShapelyFeature
fname = r'D:\Downloads\gadm36_USA_shp\gadm36_USA_2.shp'
fig = plt.figure()
ax = plt.axes((-82.65, 27.65, 0.595, 0.5), projection=ccrs.PlateCarree())
shape_feature = ShapelyFeature(Reader(fname).geometries(), ccrs.PlateCarree(), edgecolor='black')
ax.add_feature(shape_feature, alpha=0.5)
ax.set_extent([-82.65,-82.055,27.65,28.15])
cmap = colors.ListedColormap(['0000', 'green', 'yellow', 'orange', 'red'])
bounds = [0, .25, .5, .75, .9, 1]
norm = colors.BoundaryNorm(bounds, cmap.N)
pdf = plt.imshow(np.zeros((20,20)), cmap=cmap, extent=(-82.65,-82.055,27.65,28.15))
def search():
...
yield [op, norm]
...
def plot_search(args):
op = args[0]
updated_norm = args[1]
new_z = op.reshape((20,20))
pdf.set_norm(updated_norm)
pdf.set_data(new_z)
return [pdf]
ani = animation.FuncAnimation(fig, plot_search, frames=search, blit=True)
plt.plot()
search()
是生成器函数。即使我用 list(search())
包裹它,它仍然不起作用。
我是 matplotlib / cartopy 的新手,非常感谢任何帮助!
您在调用 axes
时的定义有点奇怪。我想当你使用笔记本时,它通过使用 "tight" 边界框来保存,这意味着它会自动调整图像大小以适应绘图上的内容——在你的情况下,它会使图像变大。在笔记本外使用时,默认图像不适合您定义的轴。以下对我有用:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib import colors
from matplotlib import animation
import random
import cartopy.crs as ccrs
from cartopy.io.shapereader import Reader
from cartopy.feature import ShapelyFeature
#fname = r'D:\Downloads\gadm36_USA_shp\gadm36_USA_2.shp'
fig = plt.figure()
ax = plt.axes(projection=ccrs.PlateCarree())
#shape_feature = ShapelyFeature(Reader(fname).geometries(), ccrs.PlateCarree(), edgecolor='black')
#ax.add_feature(shape_feature, alpha=0.5)
ax.set_extent([-82.65,-82.055,27.65,28.15])
cmap = colors.ListedColormap(['0000', 'green', 'yellow', 'orange', 'red'])
bounds = [0, .25, .5, .75, .9, 1]
norm = colors.BoundaryNorm(bounds, cmap.N)
pdf = plt.imshow(np.zeros((20,20)), cmap=cmap, extent=(-82.65,-82.055,27.65,28.15))
def search():
yield np.random.randn(400), plt.Normalize(-1, 1)
def plot_search(args):
op, updated_norm = args
new_z = op.reshape((20,20))
pdf.set_norm(updated_norm)
pdf.set_data(new_z)
return [pdf]
ani = animation.FuncAnimation(fig, plot_search, frames=search, blit=True)
plt.show()
如果您手动创建轴,您还可以查看 this example 参数的外观。
我使用 IPython 显示模块制作了同样的动画,但我希望它是交互式的,所以我尝试使用 matplotlib 动画模块。如果我 运行 下面的 %matplotlib notebook
它只是 returns 一个空白屏幕。如果我 运行 它与 %matplotlib inline
它 returns 只有第一帧。如果我 运行 在内联模式下使用 IPython.dispay 中的 HTML 模块将其保存为 HTML5 视频,它会显示空白屏幕的视频,并且在其下方显示最后一帧(不是第一帧)。
代码如下:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib import colors
from matplotlib import animation
import random
import cartopy.crs as ccrs
from cartopy.io.shapereader import Reader
from cartopy.feature import ShapelyFeature
fname = r'D:\Downloads\gadm36_USA_shp\gadm36_USA_2.shp'
fig = plt.figure()
ax = plt.axes((-82.65, 27.65, 0.595, 0.5), projection=ccrs.PlateCarree())
shape_feature = ShapelyFeature(Reader(fname).geometries(), ccrs.PlateCarree(), edgecolor='black')
ax.add_feature(shape_feature, alpha=0.5)
ax.set_extent([-82.65,-82.055,27.65,28.15])
cmap = colors.ListedColormap(['0000', 'green', 'yellow', 'orange', 'red'])
bounds = [0, .25, .5, .75, .9, 1]
norm = colors.BoundaryNorm(bounds, cmap.N)
pdf = plt.imshow(np.zeros((20,20)), cmap=cmap, extent=(-82.65,-82.055,27.65,28.15))
def search():
...
yield [op, norm]
...
def plot_search(args):
op = args[0]
updated_norm = args[1]
new_z = op.reshape((20,20))
pdf.set_norm(updated_norm)
pdf.set_data(new_z)
return [pdf]
ani = animation.FuncAnimation(fig, plot_search, frames=search, blit=True)
plt.plot()
search()
是生成器函数。即使我用 list(search())
包裹它,它仍然不起作用。
我是 matplotlib / cartopy 的新手,非常感谢任何帮助!
您在调用 axes
时的定义有点奇怪。我想当你使用笔记本时,它通过使用 "tight" 边界框来保存,这意味着它会自动调整图像大小以适应绘图上的内容——在你的情况下,它会使图像变大。在笔记本外使用时,默认图像不适合您定义的轴。以下对我有用:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib import colors
from matplotlib import animation
import random
import cartopy.crs as ccrs
from cartopy.io.shapereader import Reader
from cartopy.feature import ShapelyFeature
#fname = r'D:\Downloads\gadm36_USA_shp\gadm36_USA_2.shp'
fig = plt.figure()
ax = plt.axes(projection=ccrs.PlateCarree())
#shape_feature = ShapelyFeature(Reader(fname).geometries(), ccrs.PlateCarree(), edgecolor='black')
#ax.add_feature(shape_feature, alpha=0.5)
ax.set_extent([-82.65,-82.055,27.65,28.15])
cmap = colors.ListedColormap(['0000', 'green', 'yellow', 'orange', 'red'])
bounds = [0, .25, .5, .75, .9, 1]
norm = colors.BoundaryNorm(bounds, cmap.N)
pdf = plt.imshow(np.zeros((20,20)), cmap=cmap, extent=(-82.65,-82.055,27.65,28.15))
def search():
yield np.random.randn(400), plt.Normalize(-1, 1)
def plot_search(args):
op, updated_norm = args
new_z = op.reshape((20,20))
pdf.set_norm(updated_norm)
pdf.set_data(new_z)
return [pdf]
ani = animation.FuncAnimation(fig, plot_search, frames=search, blit=True)
plt.show()
如果您手动创建轴,您还可以查看 this example 参数的外观。