Анимированный график рассеяния по году в файле XLS - PullRequest
0 голосов
/ 28 мая 2018

Я строю простой точечный график (ожидаемая продолжительность жизни x ВВП на душу населения), который считывает данные из файла xls.Вот код:

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.cm as cm

#ler a terceira sheet da planilha
data = pd.read_excel('sample.xls', sheet_name=0)
data.head()

plt.scatter(x = data['LifeExpec'],
        y = data['GDPperCapita'],
        s = data['PopX1000'],
        c = data['PopX1000'],
        cmap=cm.viridis,
        edgecolors = 'none',
        alpha = 0.7)

for state in range(len(data['State'])):
    plt.text(x = data['LifeExpec'][state],
         y = data['GDPperCapita'][state],
         s = data['State'][state],
         fontsize = 14)

plt.colorbar()
plt.show()

Файл xls: enter image description here

Сюжет: enter image description here

Теперь я хочу добавить в этот файл xls некоторые данные из других лет и анимировать пузырьки, чтобы они перемещались и меняли размеры в соответствии с ВВП и численностью населения каждого года.В глупой попытке сделать это я изменил код так:

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import mplcursors
from matplotlib.animation import FuncAnimation

data = pd.read_excel('sample.xls', sheet_name=0)
data.head()
uniqueYears = data['Year'].unique()

fig, ax = plt.subplots()

def animate(i):
    for i in uniqueYears:
        ax.scatter(x = data['lifeExpec'],
            y = data['GDPperCapita'],
            s = data['PopX1000']/4,
            c = data['Region'].astype('category').cat.codes,
            cmap=cm.viridis,
            edgecolors = 'none',
            alpha = 0.7)

anim = FuncAnimation(fig, animate)

for state in range(len(data['State'])):
    plt.text(x = data['lifeExpec'][state],
             y = data['GDPperCapita'][state],
             s = data['State'][state],
             fontsize = 10,
             ha = 'center',
             va = 'center')

mplcursors.cursor(hover=True)
plt.draw()
plt.show()

Я подумал, что, возможно, способ сделать это - использовать функцию animate для построения диаграммы несколько раз, одинитерация в год.Но я не мог понять, как «фильтровать» строки, относящиеся к этому конкретному году.

Я слишком выключен?Можно ли даже добиться с помощью matplotlib?

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Используя сказанное Stylianos Nikas и ImportanceOfBeingErnest в качестве отправной точки, я составил список с уникальными годами в кадре данных и использовал его длину в качестве параметра в FuncAnimation, например:

def animate(frames):           
    ax.clear()    
    data = df[df['Ano'] == uniqueYears[frames]]
    ax.scatter(y = data['lifeExpec'],
    x = data['GPDperCapita'],
    s = data['PopX1000']/40000,
    c = data['Region'].astype('category').cat.codes,
    cmap = cm.viridis,
    edgecolors = 'none',
    alpha = 0.5)

anim = FuncAnimation(fig, animate, frames = len(uniqueYears),interval = 200, repeat = False)

Чтобы избежатьперекрытие кадров Я просто добавил ax.clear () в начало функции анимации.

0 голосов
/ 28 мая 2018

Вы можете отфильтровать строки с помощью простого оператора if.составьте список с теми годами, которые вы хотите построить, то есть list = [2000,2001,2002].затем выполните итерацию по списку

for i in range (0,2):
   if x=list[i]:
      #do whatever you want

Где x - это данные из вашего столбца F, в котором указаны годы.

Вы также можете просто сохранить цифры в соответствии с названием года

plt.savefig("{}.png".format(i))

, а затем просто используйте эту команду для создания анимации:

ffmpeg -framerate 25 -i %d.png -c:v libx264 -profile:v high -crf 20 -pix_fmt yuv420p output.mp4

Вы можете затем удалить сохраненные графики с помощью rm *.png

Вам нужно будет импортировать ОС в свойсценарий или сделать это вручную через командную строку после того, как ваш сценарий создал ваши графики.Я думаю, что это гораздо более простой способ решения проблемы.

Приветствия

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...