Python利用pynimate实现制作动态排序图
什么是pynimate
pynimate是一个Python模块,用于可视化数据的动画制作。它基于Matplotlib构建,可以使用Matplotlib已有的绘图工具,创建动态、交互的图表。
pynimate构建于Matplotlib之上,因此,它的使用方法与Matplotlib非常相似,只需要稍作调整就可以将静态图转换成动态图,而且pynimate能够自动将图表转换成可播放的动画,无需使用其他工具。
制作动态排序图的步骤
- 准备数据
无论是制作静态还是动态排序图,数据都是必不可少的。在这里我们以一些姓氏在2010年至2020年的年度出现频率为例。
# 准备数据
import pandas as pd
data = {"Last_name": ["Smith", "Johnson", "Brown", "Taylor", "Miller"],
"2010": [1000, 950, 800, 700, 500],
"2011": [1050, 1000, 820, 750, 520],
"2012": [1100, 1050, 840, 780, 550],
"2013": [1150, 1100, 900, 820, 580],
"2014": [1200, 1150, 940, 870, 610],
"2015": [1250, 1200, 980, 910, 640],
"2016": [1300, 1250, 1020, 950, 670],
"2017": [1350, 1300, 1060, 990, 700],
"2018": [1400, 1350, 1100, 1030, 730],
"2019": [1450, 1400, 1140, 1070, 760],
"2020": [1500, 1450, 1180, 1110, 790]}
df = pd.DataFrame(data)
- 安装pynimate
pynimate是不自带的模块,所以我们需要先安装它。可以使用pip命令进行安装。
# 安装pynimate
!pip install pynimate
- 设置图表
接下来我们要设置列表的样式和标签,以便后续使用。
# 设置图表
import matplotlib.pyplot as plt
import matplotlib.animation as animation
fig, ax = plt.subplots(figsize=(10, 6))
ax.set_xlim(0, 1500)
ax.set_ylim(0, 5)
ax.set_xlabel("出现频率", fontsize=12)
ax.set_ylabel("姓氏", fontsize=12)
ax.set_yticks(df.index)
ax.set_yticklabels(df["Last_name"], fontsize=12)
ax.invert_yaxis()
bars = ax.barh(df.index, df["2010"], align='center')
- 定义更新函数
定义一个函数用于更新图表,每帧的变换都将在该函数中实现。
# 定义更新函数
def update(num):
year = str(num+2010)
ax.set_title("姓氏在"+year+"年度出现频率", fontsize=14)
values = df[year].values
indices = values.argsort()[::-1]
sorted_data = dict()
sorted_data["Last_name"] = df["Last_name"].iloc[indices]
sorted_data[year] = df[year].iloc[indices]
for i, y in enumerate(sorted_data[year]):
bars[i].set_width(y)
bars[i].set_color('#4682B4')
return bars
- 制作动画
最后,我们使用FuncAnimation功能来构建动画。该功能接收几个必要的参数,一个是图表的实例ax,一个是更新函数update,还需要设置总共需要更新的帧数frames。
# 制作动态排序图
ani = animation.FuncAnimation(fig, update, frames=range(11), interval=1000)
plt.show()
这段代码将生成一个可以在Jupyter Notebook界面内直接播放的动态图表。
示例一:不同颜色的动态排序图
如果你觉得默认颜色有些单调,可以考虑通过调整颜色方案来让图表更有视觉吸引力。
# 调整颜色的动态排序图
def update_colors(num, colors):
year = str(num+2010)
ax.set_title("姓氏在"+year+"年度出现频率", fontsize=14)
values = df[year].values
indices = values.argsort()[::-1]
sorted_data = dict()
sorted_data["Last_name"] = df["Last_name"].iloc[indices]
sorted_data[year] = df[year].iloc[indices]
for i, y in enumerate(sorted_data[year]):
bars[i].set_width(y)
if sorted_data["Last_name"].iloc[i] in colors:
bars[i].set_color(colors[sorted_data["Last_name"].iloc[i]])
else:
bars[i].set_color('#4682B4')
return bars
colors = {"Smith": "#FF5733", "Johnson": "#C70039", "Taylor": "#900C3F"}
ani = animation.FuncAnimation(fig, update_colors, frames=range(11), fargs=(colors,), interval=1000)
plt.show()
在这个例子里,我们利用了fargs
参数,将颜色方案传递给update
函数。update_colors
是一个修改过的函数,用于动态生成柱状图的颜色。
示例二:交互式动态排序图
在pynimate模块中,我们可以添加回调函数,在图表上添加按钮和滑块等控件,实现交互式动态排序图的制作。
# 交互式动态排序图
def update_interact(year):
ax.set_title("姓氏在"+year+"年度出现频率", fontsize=14)
values = df[year].values
indices = values.argsort()[::-1]
sorted_data = dict()
sorted_data["Last_name"] = df["Last_name"].iloc[indices]
sorted_data[year] = df[year].iloc[indices]
for i, y in enumerate(sorted_data[year]):
bars[i].set_width(y)
bars[i].set_color('#4682B4')
return bars
def on_slider_change(event):
year = str(int(event))
update_interact(year)
from matplotlib.widgets import Slider
year_slider_ax = fig.add_axes([0.15, 0.1, 0.7, 0.05])
year_slider = Slider(year_slider_ax, 'Year', 2010, 2020, valinit=2010, valstep=1)
year_slider.on_changed(on_slider_change)
plt.subplots_adjust(bottom=0.3)
update_interact('2010')
plt.show()
在这个例子里,我们添加了一个滑块作为控件,可以通过滑动滑块来改变动态排序图的年份。滑块的回调函数是on_slider_change
,每当滑块值发生变化时都会调用该函数,更新图表。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python利用pynimate实现制作动态排序图 - Python技术站