上海物流公司网站建设,青岛网站建设套餐报价,温州做网站就来温州易富网络,php做网站导购在读技术博客的过程中#xff0c;我们会发现那些能够把知识、成果讲透的博主很多都会做动态图表。他们的图是怎么做的#xff1f;难度大吗#xff1f;这篇文章就介绍了 Python 中一种简单的动态图表制作方法。 数据暴增的年代#xff0c;数据科学家、分析师在被要求对数据有… 在读技术博客的过程中我们会发现那些能够把知识、成果讲透的博主很多都会做动态图表。他们的图是怎么做的难度大吗这篇文章就介绍了 Python 中一种简单的动态图表制作方法。 数据暴增的年代数据科学家、分析师在被要求对数据有更深的理解与分析的同时还需要将结果有效地传递给他人。如何让目标听众更直观地理解当然是将数据可视化啊而且最好是动态可视化。 本文将以线型图、条形图和饼图为例系统地讲解如何让你的数据图表动起来。 这些动态图表是用什么做的
接触过数据可视化的同学应该对 Python 里的 Matplotlib 库并不陌生。它是一个基于 Python 的开源数据绘图包仅需几行代码就可以帮助开发者生成直方图、功率谱、条形图、散点图等。这个库里有个非常实用的扩展包——FuncAnimation可以让我们的静态图表动起来。
FuncAnimation 是 Matplotlib 库中 Animation 类的一部分后续会展示多个示例。如果是首次接触你可以将这个函数简单地理解为一个 While 循环不停地在 “画布” 上重新绘制目标数据图。 如何使用 FuncAnimation
这个过程始于以下两行代码
import matplotlib.animation as anianimator ani.FuncAnimation(fig, chartfunc, interval 100)
从中我们可以看到 FuncAnimation 的几个输入 fig 是用来 「绘制图表」的 figure 对象 chartfunc 是一个以数字为输入的函数其含义为时间序列上的时间 interval 这个更好理解是帧之间的间隔延迟以毫秒为单位默认值为 200。
这是三个关键输入当然还有更多可选输入感兴趣的读者可查看原文档这里不再赘述。
下一步要做的就是将数据图表参数化从而转换为一个函数然后将该函数时间序列中的点作为输入设置完成后就可以正式开始了。
在开始之前依旧需要确认你是否对基本的数据可视化有所了解。也就是说我们先要将数据进行可视化处理再进行动态处理。
按照以下代码进行基本调用。另外这里将采用大型流行病的传播数据作为案例数据包括每天的死亡人数
import matplotlib.animation as ani
import matplotlib.pyplot as plt
import numpy as np
import pandas as pdurl https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_deaths_global.csv
df pd.read_csv(url, delimiter,, headerinfer)df_interest df.loc[df[Country/Region].isin([United Kingdom, US, Italy, Germany]) df[Province/State].isna()]df_interest.rename(indexlambda x: df_interest.at[x, Country/Region], inplaceTrue)
df1 df_interest.transpose()df1 df1.drop([Province/State, Country/Region, Lat, Long])
df1 df1.loc[(df1 ! 0).any(1)]
df1.index pd.to_datetime(df1.index) 绘制三种常见动态图表
动态曲线图 如下所示首先需要做的第一件事是定义图的各项这些基础项设定之后就会保持不变。它们包括创建 figure 对象x 标和 y 标设置线条颜色和 figure 边距等
import numpy as np
import matplotlib.pyplot as pltcolor [red, green, blue, orange]
fig plt.figure()
plt.xticks(rotation45, haright, rotation_modeanchor) #rotate the x-axis values
plt.subplots_adjust(bottom 0.2, top 0.9) #ensuring the dates (on the x-axis) fit in the screen
plt.ylabel(No of Deaths)
plt.xlabel(Dates)
接下来设置 curve 函数进而使用 .FuncAnimation 让它动起来
def buildmebarchart(iint):plt.legend(df1.columns)p plt.plot(df1[:i].index, df1[:i].values) #note it only returns the dataset, up to the point ifor i in range(0,4):p[i].set_color(color[i]) #set the colour of each curveimport matplotlib.animation as ani
animator ani.FuncAnimation(fig, buildmebarchart, interval 100)
plt.show() 动态饼状图 可以观察到其代码结构看起来与线型图并无太大差异但依旧有细小的差别。
import numpy as np
import matplotlib.pyplot as pltfig,ax plt.subplots()
explode[0.01,0.01,0.01,0.01] #pop out each slice from the piedef getmepie(i):def absolute_value(val): #turn % back to a numbera np.round(val/100.*df1.head(i).max().sum(), 0)return int(a)ax.clear()plot df1.head(i).max().plot.pie(ydf1.columns,autopctabsolute_value, label,explode explode, shadow True)plot.set_title(Total Number of Deaths\n str(df1.index[min( i, len(df1.index)-1 )].strftime(%y-%m-%d)), fontsize12)import matplotlib.animation as ani
animator ani.FuncAnimation(fig, getmepie, interval 200)
plt.show()
主要区别在于动态饼状图的代码每次循环都会返回一组数值但在线型图中返回的是我们所在点之前的整个时间序列。返回时间序列通过 df1.head(i) 来实现而. max()则保证了我们仅获得最新的数据因为流行病导致死亡的总数只有两种变化维持现有数量或持续上升。
df1.head(i).max() 动态条形图 创建动态条形图的难度与上述两个案例并无太大差别。在这个案例中作者定义了水平和垂直两种条形图读者可以根据自己的实际需求来选择图表类型并定义变量栏。
fig plt.figure()
bar def buildmebarchart(iint):iv min(i, len(df1.index)-1) #the loop iterates an extra one time, which causes the dataframes to go out of bounds. This was the easiest (most lazy) way to solve this :)objects df1.max().indexy_pos np.arange(len(objects))performance df1.iloc[[iv]].values.tolist()[0]if bar vertical:plt.bar(y_pos, performance, aligncenter, color[red, green, blue, orange])plt.xticks(y_pos, objects)plt.ylabel(Deaths)plt.xlabel(Countries)plt.title(Deaths per Country \n str(df1.index[iv].strftime(%y-%m-%d)))else:plt.barh(y_pos, performance, aligncenter, color[red, green, blue, orange])plt.yticks(y_pos, objects)plt.xlabel(Deaths)plt.ylabel(Countries)animator ani.FuncAnimation(fig, buildmebarchart, interval100)plt.show()
保存动画图
在制作完成后存储这些动态图就非常简单了可直接使用以下代码
animator.save(rC:\temp\myfirstAnimation.gif)