несколько строк в анимированном линейном графике python

#python #matplotlib #animation #data-visualization

#python #matplotlib #Анимация #визуализация данных

Вопрос:

Итак, я пытаюсь анимировать как ВВП на душу населения, так и ожидаемую продолжительность жизни анимированными линиями на одном графике. Мой код

 import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
import matplotlib.animation as animation

data= pd.read_csv("data.csv")
print (data.head())
data_2007=data[data.year==2007]
print (data_2007.head())
china=data[data.country=="China"]


x_data=[]
y_data=[]
y1_data=[]
fig, ax = plt.subplots()
ax.set_xlim(1950,2010)
line, = ax.plot(0,0)

def animation_frame(i):
    x_data.append(china.year.iloc[i])
    y_data.append(china.lifeExpectancy.iloc[i])
    y1_data.append(china.gdpPerCapita.iloc[i])

    line.set_xdata(x_data)
    line.set_ydata(y_data)
    line.set_y1data(y1_data)
    return line,

animation = FuncAnimation(fig, func=animation_frame, interval=500)
plt.show()

  

Но он не возвращает строк на графике и возвращает ошибку

     line.set_y1data(y1_data)
AttributeError: 'Line2D' object has no attribute 'set_y1data'
  

Есть идеи, как это исправить? Это работает, когда я пытаюсь отобразить только X и Y.
Заранее благодарю вас.

Ответ №1:

В вашем коде у вас нет дополнительной строки для GDP. Ошибка возникает из-за того, что метод set_y1data не определен внутри строки. Возможное решение выглядит так:

 import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
import matplotlib.animation as animation


x_data=[]
y_data=[]
y1_data=[]
fig, ax = plt.subplots()
ax.set_xlim(1950,2010)
ax.set_ylim(1950, 2100)



# for the purpose of illustration
xdata = np.linspace(1950, 2010, 50)
ydata = 1 * xdata
y1data = 1.01 * xdata

line_1, = ax.plot(xdata[0], ydata[0])
line_2, = ax.plot(xdata[0], y1data[0])


def animation_frame(i):
    
    line_1.set_xdata(xdata[:i])
    line_1.set_ydata(ydata[:i])
    line_2.set_xdata(xdata[:i])
    line_2.set_ydata(y1data[:i])
    return 

animation = FuncAnimation(fig, func=animation_frame, interval=500)