- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章利用 Python 让图表动起来由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
用Matplotlib和Seaborn这类Python库可以画出很好看的图,但是这些图只是静态的,难以动态且美观地呈现数值变化。要是在你下次的演示、视频、社交媒体Po文里能用短视频呈现数据变化,是不是很赞呢?更棒的是,你还是可以在你的图表上用Matplotlib、Seaborn或者其他库! 。
本文将使用美国国家药物滥用研究所和疾病预防控制中心公布的阿片类药物数据,可在此处下载:https://http://www.drugabuse.gov/sites/default/files/overdosedata1999-2015.xls 。
我们会用到的数据是这样的:
数据下载地址:https://www.drugabuse.gov/sites/default/files/overdose_data_1999-2015.xls. 。
我们将用Matplotlib和Seaborn绘图,用Numpy和Pandas处理数据。Matplotlib也提供了一些我们做动画可以的函数,所以让我们首先导入所有依赖项.
import numpy as npimport pandas as pdimport seaborn as snsimport matplotlibimport matplotlib.pyplot as pltimport matplotlib.animation as animation
然后用Pandas载入数据并转成DataFrame类型的数据结构。因为我们要针对不同阿片类药物的滥用画图,写个函数来载入感兴趣的特定行的数据能避免重复代码。(小编注:原文提供的代码在读取excel文件的时候使用了已废弃的sheetname参数,本文中已修正为sheet_name) 。
overdoses = pd.read_excel("overdose_data_1999-2015.xls",sheet_name="Online",skiprows =6)def get_data(table,rownum,title): data = pd.DataFrame(table.loc[rownum][2:]).astype(float) data.columns = {title} return data
现在让我们来做动画吧! 。
首先,如果你和我一样使用的是jupyter notebook,请在代码首行加入 %matplotlib notebook,如此便可在notebook直接看到生成的动画而非保存后才可见.
我现在使用 get_data函数从表中检索海洛因过量的数据并放在有两列的Pandas DataFrame中,一列是年,一列是过量死亡的人数.
%matplotlib notebooktitle = "Heroin Overdoses"d = get_data(overdoses,18,title)x = np.array(d.index)y = np.array(d["Heroin Overdoses"])overdose = pd.DataFrame(y,x)#XN,YN = augment(x,y,10)#augmented = pd.DataFrame(YN,XN)overdose.columns = {title}
接下来我们初始化一个ffmpeg Writer并以20帧每秒、1800比特率进行录屏。你也可以根据喜好自行设置这些值.
Writer = animation.writers["ffmpeg"]writer = Writer(fps=20, metadata=dict(artist="Me"), bitrate=1800)
(小编注:如果出现 RuntimeError:RequestedMovieWriter(ffmpeg)notavailable的报错,请自行安装ffmpeg,装了brew的Mac可以直接: brew install ffmpeg) 。
现在我们创建一个有几个标签的图形。确保设置x和y轴的限制,以免动画随当前显示的数据范围乱跳转.
fig = plt.figure(figsize=(10,6))plt.xlim(1999, 2016)plt.ylim(np.min(overdose)[0], np.max(overdose)[0])plt.xlabel("Year",fontsize=20)plt.ylabel(title,fontsize=20)plt.title("Heroin Overdoses per Year",fontsize=20)
动画的核心是动画函数,你可以在其中定义视频的每一帧发生什么。这里的 i表示动画中帧的索引。使用这个索引可以选择应在此帧中可见的数据范围。然后我使用seaborn线图来绘制所选的数据。最后两行代码只是为了让图表更美观.
def animate(i): data = overdose.iloc[:int(i+1)] #选择数据范围 p = sns.lineplot(x=data.index, y=data[title], data=data, color="r") p.tick_params(labelsize=17) plt.setp(p.lines,linewidth=7)
我们用调用了 animate 函数并定义了帧数的 matplotlib.animation.FuncAnimation来开始动画, frames实际上定义了调用 animate的频率.
ani = matplotlib.animation.FuncAnimation(fig, animate, frames=17, repeat=True)
你可以用 ani.save()把动画保存为mp4,如果你想直接看一看动画效果可以用plt.show() .
ani.save("HeroinOverdosesJumpy.mp4", writer=writer)
现在我们的图表动起来啦:
动画能够正常运行但是感觉有点跳跃,所以我们需要在已有数据点之间增加更多的数据点来使动画的过渡平滑。于是我们使用另一个函数 augment.
def augment(xold,yold,numsteps): xnew = [] ynew = [] for i in range(len(xold)-1): difX = xold[i+1]-xold[i] stepsX = difX/numsteps difY = yold[i+1]-yold[i] stepsY = difY/numsteps for s in range(numsteps): xnew = np.append(xnew,xold[i]+s*stepsX) ynew = np.append(ynew,yold[i]+s*stepsY) return xnew,ynew
现在我们只需要对我们的数据应用这个函数、增加 matplotlib.animation.FuncAnimation 函数的帧数。在这里我用参数 numsteps=10调用 augment函数,也就是增加数据点至160个,并且设置 frames=160 。这样以来,图表显得更为平滑,但还是在数值变动处有些突兀.
为了让我们的动画更平滑美观,我们可以增加一个平滑函数(具体请见:https://www.swharden.com/wp/2008-11-17-linear-data-smoothing-in-python/ ).
def smoothListGaussian(listin,strippedXs=False,degree=5): window=degree*2-1 weight=np.array([1.0]*window) weightGauss=[] for i in range(window): i=i-degree+1 frac=i/float(window) gauss=1/(np.exp((4*(frac))**2)) weightGauss.append(gauss) weight=np.array(weightGauss)*weight smoothed=[0.0]*(len(listin)-window) for i in range(len(smoothed)): smoothed[i]=sum(np.array(listin[i:i+window])*weight)/sum(weight) return smoothed
另外我们也可以加上一点颜色和样式参数,让图表更个性化.
sns.set(rc={"axes.facecolor":"lightgrey", "figure.facecolor":"lightgrey","figure.edgecolor":"black","axes.grid":False})
当当当!如此我们便得到了文章开头的动画图表.
这篇文章仅仅只是matplotlib动画功能的一个例子,你大可以用它来实现任何一种图表的动画效果。简单调整 animate()函数内的参数和图表类型,就能得到无穷无尽的可能性.
到此这篇关于利用 Python 让图表动起来的文章就介绍到这了,更多相关Python 让图表动起来内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:https://zhuanlan.zhihu.com/p/409151635 。
最后此篇关于利用 Python 让图表动起来的文章就讲到这里了,如果你想了解更多关于利用 Python 让图表动起来的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在处理一组标记为 160 个组的 173k 点。我想通过合并最接近的(到 9 或 10 个组)来减少组/集群的数量。我搜索过 sklearn 或类似的库,但没有成功。 我猜它只是通过 knn 聚类
我有一个扁平数字列表,这些数字逻辑上以 3 为一组,其中每个三元组是 (number, __ignored, flag[0 or 1]),例如: [7,56,1, 8,0,0, 2,0,0, 6,1,
我正在使用 pipenv 来管理我的包。我想编写一个 python 脚本来调用另一个使用不同虚拟环境(VE)的 python 脚本。 如何运行使用 VE1 的 python 脚本 1 并调用另一个 p
假设我有一个文件 script.py 位于 path = "foo/bar/script.py"。我正在寻找一种在 Python 中通过函数 execute_script() 从我的主要 Python
这听起来像是谜语或笑话,但实际上我还没有找到这个问题的答案。 问题到底是什么? 我想运行 2 个脚本。在第一个脚本中,我调用另一个脚本,但我希望它们继续并行,而不是在两个单独的线程中。主要是我不希望第
我有一个带有 python 2.5.5 的软件。我想发送一个命令,该命令将在 python 2.7.5 中启动一个脚本,然后继续执行该脚本。 我试过用 #!python2.7.5 和http://re
我在 python 命令行(使用 python 2.7)中,并尝试运行 Python 脚本。我的操作系统是 Windows 7。我已将我的目录设置为包含我所有脚本的文件夹,使用: os.chdir("
剧透:部分解决(见最后)。 以下是使用 Python 嵌入的代码示例: #include int main(int argc, char** argv) { Py_SetPythonHome
假设我有以下列表,对应于及时的股票价格: prices = [1, 3, 7, 10, 9, 8, 5, 3, 6, 8, 12, 9, 6, 10, 13, 8, 4, 11] 我想确定以下总体上最
所以我试图在选择某个单选按钮时更改此框架的背景。 我的框架位于一个类中,并且单选按钮的功能位于该类之外。 (这样我就可以在所有其他框架上调用它们。) 问题是每当我选择单选按钮时都会出现以下错误: co
我正在尝试将字符串与 python 中的正则表达式进行比较,如下所示, #!/usr/bin/env python3 import re str1 = "Expecting property name
考虑以下原型(prototype) Boost.Python 模块,该模块从单独的 C++ 头文件中引入类“D”。 /* file: a/b.cpp */ BOOST_PYTHON_MODULE(c)
如何编写一个程序来“识别函数调用的行号?” python 检查模块提供了定位行号的选项,但是, def di(): return inspect.currentframe().f_back.f_l
我已经使用 macports 安装了 Python 2.7,并且由于我的 $PATH 变量,这就是我输入 $ python 时得到的变量。然而,virtualenv 默认使用 Python 2.6,除
我只想问如何加快 python 上的 re.search 速度。 我有一个很长的字符串行,长度为 176861(即带有一些符号的字母数字字符),我使用此函数测试了该行以进行研究: def getExe
list1= [u'%app%%General%%Council%', u'%people%', u'%people%%Regional%%Council%%Mandate%', u'%ppp%%Ge
这个问题在这里已经有了答案: Is it Pythonic to use list comprehensions for just side effects? (7 个答案) 关闭 4 个月前。 告
我想用 Python 将两个列表组合成一个列表,方法如下: a = [1,1,1,2,2,2,3,3,3,3] b= ["Sun", "is", "bright", "June","and" ,"Ju
我正在运行带有最新 Boost 发行版 (1.55.0) 的 Mac OS X 10.8.4 (Darwin 12.4.0)。我正在按照说明 here构建包含在我的发行版中的教程 Boost-Pyth
学习 Python,我正在尝试制作一个没有任何第 3 方库的网络抓取工具,这样过程对我来说并没有简化,而且我知道我在做什么。我浏览了一些在线资源,但所有这些都让我对某些事情感到困惑。 html 看起来
我是一名优秀的程序员,十分优秀!