我正在嘗試在 mpl 中為繪圖設定影片,并且我決定最聰明的方法是使用 Gridspec 動態添加多個軸。我提供了許多列和行,我希望 Gridspec 在我的畫布上為其制作軸,然后我可以用藝術家填充這些軸。
由于軸的數量是任意的,因此藝術家的數量是任意的,我認為最好像這樣訪問藝術家:
import matplotlib.pyplot as plt
fig = plt.figure(constrained_layout=False, figsize=(8,8), facecolor=bg_colour)
gs = fig.add_gridspec(nrows=nrows, ncols=ncols, hspace=0.1, wspace=0.1)
for i in range(nrows):
for j in range(ncols):
ax = plt.subplot(gs[i,j])
print(fig.axes[0].artists)
所以我的想法是我可以動態地創建我的所有軸,然后我還可以通過fig.axes使用適當的索引切片來動態地將藝術家添加到這些軸。一旦我選擇了我的軸,我就可以做
fig.axes[0].plot([],[])
將一個空的藝術家添加到右軸,然后我可以在我的代碼中使用更新函式對其進行影片處理。
問題是,無論我如何設定圖形、軸和藝術家的創建,fig.axes[index].artists串列總是空的。我不明白如何下達命令來繪制我的軸,然后不讓藝術家出現在所有藝術家的串列中。實際上不是.artists我需要使用的所有藝術家的容器嗎?我要找的東西是否存盤在其他地方?mpl 實際上首先不允許這種事情嗎?
完整代碼
import numpy as np
import itertools
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
from matplotlib.ticker import AutoMinorLocator, MaxNLocator
def circle_points_x(period):
t = np.linspace(0,2*np.pi,500)
x = np.cos(period*t np.pi/2)
return x
def circle_points_y(period):
t = np.linspace(0,2*np.pi,500)
y = np.sin(period*t np.pi/2)
return y
# true distribution
ncols,nrows = (5,5)
bg_colour = np.array((84, 153, 215))/256
bg_colour = np.append(bg_colour,0.5)
fig = plt.figure(constrained_layout=False, figsize=(8,8), facecolor=bg_colour)
gs = fig.add_gridspec(nrows=nrows, ncols=ncols, hspace=0.1, wspace=0.1)
for i in range(nrows):
for j in range(ncols):
ax = plt.subplot(gs[i,j])
ax.axis('off')
def init():
for i in range(nrows):
for j in range(ncols):
x = circle_points_x(j 1)
y = circle_points_y(i 1)
fig.axes[i*nrows j].plot(x,y,lw=0.5,aa=True)
fig.axes[i*nrows j].scatter([x[0]],[y[0]])
print(fig.axes[0].artists)
return list(itertools.chain(*[i.artists for i in fig.axes]))
def update(frame):
for i in range(nrows):
for j in range(ncols):
# fig.axes[i*nrows j].artists[0] # TURN THIS ON TO SEE THE ERROR
pass
return list(itertools.chain(*[i.artists for i in fig.axes]))
ani = FuncAnimation(fig, update, frames=range(1,8),repeat=False,init_func=init, blit=True,interval=40)
# ani.save('histogram.gif', dpi=300 ,writer="ffmpeg")
plt.show()
uj5u.com熱心網友回復:
也許您正在尋找的是ax.get_children(),但是它會回傳所有內容(線條、線條集合、脊椎、圖例......),因此您必須以某種方式過濾結果。
如果您事先知道您正在繪制什么樣的資料,這里有一些 Matplotlib 將藝術家分開的位置。
ax.lines存盤使用創建的行ax.plot。ax.collectionsax.add_collection存盤用,ax.plot_surface,ax.contour,ax.contourf, ...創建的集合(線集合、多邊形集合)ax.images存盤使用ax.imshow.ax.patches包含使用ax.bar,ax.fill, ...創建的藝術家。ax.tables包含使用創建的藝術家ax.table。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/462460.html
標籤:Python matplotlib 动画片
下一篇:集合視圖的自定義影片
