Динамически создавать пустых художников Line2D (линейный сюжет) в осях Объект в matplotlib? - PullRequest
0 голосов
/ 04 февраля 2020

Я пытаюсь создать довольно сложную анимацию mpl, для которой нужно динамически создавать оси (подсюжеты), для чего я использую gridspe c:

Код для создания фиктивных данных:

# Used to write test csv with dummy data
import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0.00001,1,5000)
a1 = 5
y1 = np.e**(-a1*x)
a2,s2,u2 = 0.7,1.07,0.
y2 = a2*(1/(np.sqrt(2*np.pi)*s2*x) * np.e**(-(np.log(x)-u2)**2/(2*s2**2)))
G3,k3,f03,b3,a3 = 1.001,7.,0.5,0.5,0.9
y3 = a3*(G3*((1)/(1+np.e**(-k3*G3*(x-b3))*(G3/(f03)-1))))
a4,s4,u4 = 0.1,2.,0.
y4 = a4*(1/(np.sqrt(2*np.pi)*s4*x) * np.e**(-(np.log(x)-u4)**2/(2*s4**2)))
# plt.plot(x,y1)
# plt.plot(x,y2)
# plt.plot(x,y3)
# plt.plot(x,y4)
# plt.show()

with open('Curves_to_be_animated.out','w') as outf:
  comb = (x,y1,y2,y3,y4)
  format_string = ''.join(['{:<15.5f}']*len(comb))+'\n'

  for i in range(len(x)):
    row = [comb[j][i] for j in range(len(comb))]
    outf.write(format_string.format(*row))

Создание осей работает динамически без проблем. Проблема начинается, когда я пытаюсь динамически добавлять артистов к этим осям. Мне нужно добавить столько линейных графиков, сколько наборов данных я предоставляю в своем CSV-файле (4 в фиктивных данных). Итак, основная проблема c заключается в следующем: как добавить N пустых художников Linet2 plt.plot в конкретный объект c ax, чтобы впоследствии я мог использовать .set_data () для этих художников в функции обновления анимации?

Самое смешное: динамическое c добавление художников к топору прекрасно работает для AnnotationBoxes, но не для объектов plt.plot (). Я предполагаю, что объекты Line2D не допускают этого так же, как AnnotationBoxes, потому что plt. функции создают свои собственные оси неявно. Поэтому я не могу добавить их к своему топору динамически, потому что я по сути пытаюсь сбросить артистов топора, что запрещено.

Для моего кода я исключаю AnnotationBoxes, так как вы этого не делаете в любом случае есть изображения, которые в них отображаются.

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
from matplotlib.offsetbox import OffsetImage, AnnotationBbox
import matplotlib.patches as patches
import matplotlib.gridspec as gridspec

# TODO: APPEND ARTISTS DYNAMICALLY TO AXES

# Specify data (Created by code above)
df = pd.read_csv('Curves_to_be_animated.out',delim_whitespace=True,header=None)
# Number of columns with y values in them. There are four in the dummy data.
Num_Colums = len(df.columns)-1
Num_Rows = df.shape[0]

# Create the figure
fig = plt.figure(figsize=(6,6))
# Create the gridspec object according to which axes can be created/placed.
gs = gridspec.GridSpec(nrows=2, ncols=Num_Colums, height_ratios=[1,3],figure=fig)

# Add axes Objects to the figure dynamically
for col in range(Num_Colums):
    fig.add_subplot(gs[0,col])

fig.add_subplot(gs[1:,:])

# Get a sliceable list of all axes that can later on be used to reference axes
# in the update animation function. Intended usage: all_axes[i].artists[j].set_data(x,y)
all_axes = fig.axes

Colors = ['tab:red','tab:green','chocolate','tab:blue','tab:orange']

# Append line2D artists to the first ax
for i in range(Num_Colums):
    # This doesn't cause an error, but it doesn't actually creates 4 settable Line2D artists 
    # in the first ax.
    all_axes[0].plot([],[],c=Colors[i])

# List of artists in the first ax is empty. How do I add them dynamically so I can reference them
# Later on in the update() function of an animation?
print(all_axes[0].artists)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...