python绘制pr曲线图_如何利用Python制作可以动的动态图表。

20e0b82eb35829fcc23326ab7ba3e404.png

来源:机器之心

原文链接:https://towardsdatascience.com/learn-how-to-create-animated-graphs-in-python-fce780421afe

在读技术博客的过程中,我们会发现那些能够把知识、成果讲透的博主很多都会做动态图表。他们的图是怎么做的?难度大吗?这篇文章就介绍了 Python 中一种简单的动态图表制作方法。

1ca585f2b775c971bfc0fae5f9a1691a.gif数据暴增的年代,数据科学家、分析师在被要求对数据有更深的理解与分析的同时,还需要将结果有效地传递给他人。如何让目标听众更直观地理解?当然是将数据可视化啊,而且最好是动态可视化。本文将以线型图、条形图和饼图为例,系统地讲解如何让你的数据图表动起来

06f86cf75266c3fd70b5cf33c8744b2c.gif

这些动态图表是用什么做的?接触过数据可视化的同学应该对 Python 里的 Matplotlib 库并不陌生。它是一个基于 Python 的开源数据绘图包,仅需几行代码就可以帮助开发者生成直方图、功率谱、条形图、散点图等。这个库里有个非常实用的扩展包——FuncAnimation,可以让我们的静态图表动起来。FuncAnimation 是 Matplotlib 库中 Animation 类的一部分,后续会展示多个示例。如果是首次接触,你可以将这个函数简单地理解为一个 While 循环,不停地在 “画布” 上重新绘制目标数据图。如何使用 FuncAnimation?这个过程始于以下两行代码:
import matplotlib.animation as ani

animator = 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=',', header='infer')df_interest = df.loc[
    df['Country/Region'].isin(['United Kingdom', 'US', 'Italy', 'Germany'])
    & df['Province/State'].isna()]df_interest.rename(
    index=lambda x: df_interest.at[x, 'Country/Region'], inplace=True)
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)
绘制三种常见动态图表动态曲线图

f12172eb13556b3d7c86b1e0842cb0e8.gif

如下所示,首先需要做的第一件事是定义图的各项,这些基础项设定之后就会保持不变。它们包括:创建 figure 对象,x 标和 y 标,设置线条颜色和 figure 边距等:
import numpy as np
import matplotlib.pyplot as pltcolor = ['red', 'green', 'blue', 'orange']
fig = plt.figure()
plt.xticks(rotation=45, ha="right", rotation_mode="anchor") #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(i=int):
    plt.legend(df1.columns)
    p = plt.plot(df1[:i].index, df1[:i].values) #note it only returns the dataset, up to the point i
    for 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()
动态饼状图

0c4af54a4344c0d09059a7294e02f215.gif

可以观察到,其代码结构看起来与线型图并无太大差异,但依旧有细小的差别。
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 number
        a  = np.round(val/100.*df1.head(i).max().sum(), 0)
        return int(a)
    ax.clear()
    plot = df1.head(i).max().plot.pie(y=df1.columns,autopct=absolute_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')), fontsize=12)import matplotlib.animation as ani
animator = ani.FuncAnimation(fig, getmepie, interval = 200)
plt.show()
主要区别在于,动态饼状图的代码每次循环都会返回一组数值,但在线型图中返回的是我们所在点之前的整个时间序列。返回时间序列通过 df1.head(i) 来实现,而. max()则保证了我们仅获得最新的数据,因为流行病导致死亡的总数只有两种变化:维持现有数量或持续上升。
df1.head(i).max()
动态条形图542f3486ac2d4475096e379c96786419.gif创建动态条形图的难度与上述两个案例并无太大差别。在这个案例中,作者定义了水平和垂直两种条形图,读者可以根据自己的实际需求来选择图表类型并定义变量栏。
fig = plt.figure()
bar = ''def buildmebarchart(i=int):
    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().index
    y_pos = np.arange(len(objects))
    performance = df1.iloc[[iv]].values.tolist()[0]
    if bar == 'vertical':
        plt.bar(y_pos, performance, align='center', 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, align='center', color=['red', 'green', 'blue', 'orange'])
        plt.yticks(y_pos, objects)
        plt.xlabel('Deaths')
        plt.ylabel('Countries')animator = ani.FuncAnimation(fig, buildmebarchart, interval=100)plt.show()
保存动画图在制作完成后,存储这些动态图就非常简单了,可直接使用以下代码:
animator.save(r'C:\temp\myfirstAnimation.gif')
感兴趣的读者如想获得详细信息可参考https://matplotlib.org/3.1.1/api/animation_api.html。

1604d88307254c731937d8f709548da7.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/332969.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

switch字符串jdk_JDK 12 Early Access Build 12中的原始字符串文字支持

switch字符串jdk本周Java世界上最大的新闻可能是JDK 11的通用性。 但是,另一个令人兴奋的发展是JDK 12 Early Access Build 12的发布 ( 2018年9月20日 )。 JDK 12的这个早期访问生成12是显著,因为它包括与实施方式中JEP 326 [“原…

MacOS安装pip失败,提示:SyntaxError: invalid syntax

使用命令 easy_install 安装 pip 使用命令 sudo easy_install pip 安装 pip,结果失败了,执行命令的信息如下: ➜ ~ sudo easy_install pip Password: Searching for pip Reading https://pypi.org/simple/pip/ Downloading https://files.…

java压缩视频

引入依赖 <dependency><groupId>ws.schild</groupId><artifactId>jave-core</artifactId><version>3.0.0</version></dependency><dependency><groupId>ws.schild</groupId><artifactId>jave-all-dep…

经济学自身利益最大化_劳动经济学:研究劳动力市场运作的专业

多年以来同学们对劳动经济学认知上存在误区&#xff0c;很多同学一上来看到劳动两字会误以为这是让自己去当工人干活。事实并非如此&#xff0c;例如人力资源管理&#xff0c;大家都知道是一门很热门、实用的管理学&#xff0c;毕业后可以从事hr的工作&#xff0c;其实劳动经济…

corda_使用Spring WebFlux从Corda节点流式传输数据

corda自上次发布以来已经有一段时间了&#xff0c;但我终于回来了&#xff01; 由于我仍在我的项目中&#xff0c;因此我将再次撰写有关使用Corda的文章。 这次&#xff0c;我们将不再关注Corda&#xff0c;而是将Spring与Corda结合使用。 更具体地说&#xff0c;Spring WebFlu…

iTerm2 隐藏用户名和主机名

有时候我们的用户名和主机名太长&#xff0c;比如我的&#xff1a; 这么长的提示符前缀&#xff0c;在终端显示的时候会很不好看&#xff0c;我们可以手动去除。 编辑 ~/.zshrc 文件&#xff0c;增加 DEFAULT_USER"lwx" 配置&#xff0c;如下所示&#xff1a; 注…

投影串口测试程序_串口测试方法和步骤

信号测试与分析版号&#xff1a;xxx编写&#xff1a;xxx1、232串口信号&#xff1a;要点&#xff1a;RS232采用三线制传输分别为TXD\RXD\GND其中TXD为发送信号&#xff0c;RXD为接收信号。全双工&#xff0c;在RS232中任何一条信号线的电压均为负逻辑关系。即&#xff1a;—15v…

springBoot中自定义的yml文件引用的方式

一、yml配置文件 在yam文件中配置自定义的标签 1.在yml配置文件中加入 through:url: http://10.4.2.140:49003/IBSThrough2.测试类进行测试 import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; /…

MacOS安装zsh插件zsh-autosuggestion(自动命令补全和建议)

文章目录安装命令一安装命令二安装命令三使用插件 zsh-autosuggestion 用于命令建议和补全。 GitHub主页&#xff1a;https://github.com/zsh-users/zsh-autosuggestions 安装命令一 cd ~/.oh-my-zsh/custom/plugins/ git clone https://github.com/zsh-users/zsh-autosugg…

javafx 调用java_Java,JavaFX的流畅设计风格拨动开关

javafx 调用java嗨&#xff0c;这次我将在新版本的JMetro中讨论新的Toggle Switch样式。 拨动开关是一种近年来非常流行的控件。 我前一段时间在ControlsFX库中添加了JavaFX实现。 刚刚发布的JMetro版本4.1中提供了此新样式。 什么是拨动开关 在以前的文章中&#xff0c;我讨…

polkit 重新安装_不折腾,为U-NAS安装一个清爽的桌面,把小U打造成双面高手

本帖最后由 emaic 于 2012-2-2 03:41 编辑除了文件的存储和下载外&#xff0c;U-NAS还可以干嘛&#xff1f;其实&#xff0c;只要你-U-NAS的硬件性能足够强悍&#xff0c;U-NAS可以完成很多你意想不到的工作哦&#xff0c;也会有很多意想不到的玩法&#xff0c;希望看了emaic打…

用于zsh的插件incr(目录提示和补全)

文章目录使用命令 wget 下载插件直接下载插件脚本文件配置提示存在不安全目录incr 是一个目录提示和补全插件。 使用命令 wget 下载插件 mkdir ~/.oh-my-zsh/custom/plugins/incr cd ~/.oh-my-zsh/custom/plugins/incr wget -O incr.plugin.zsh http://mimosa-pudica.net/src…

普罗米修斯使用es数据库_用普罗米修斯和格拉法纳仪法来豪猪

普罗米修斯使用es数据库Adam Bien的Porcupine库使配置充当应用程序隔板的专用执行程序服务变得容易。 我创建了一个扩展&#xff0c;通过MicroProfile Metrics公开了豪猪统计信息。 我们还可以通过Prometheus和Grafana仪表板使仪器可见。 进行此扩展的原因是我们希望对Porcupi…

2字节十六进制浮点数 qt_Qt二进制文件操作(读和写)详解

除了文本文件之外&#xff0c;其他需要按照一定的格式定义读写的文件都称为二进制文件。每种格式的二进制文件都有自己的格式定义&#xff0c;写入数据时按照一定的顺序写入&#xff0c;读出时也按照相应的顺序读出。例如地球物理中常用的 SEG-Y 格式文件&#xff0c;必须按照其…

cobol host变量_将Host Cobol批次和Monolith Webapps移动到云和微服务

cobol host变量在Amazon Event “从大型机到微服务– Vanguard迁移到云”中非常有趣的演示。 以下部分可用作迁移模式 &#xff1a;如何从大型机迁移到微服务的不同方式&#xff1a; 重新托管 再造 重构 使用Linux和Java重新平台 回购 退役 全部结合 该演示文稿还展示了V…

maven的常用命令

install 安装 功能&#xff1a; 编译和打包&#xff0c;把打好的可执行的jar包&#xff08;或者war包或者其他包&#xff09;部署到本地maven仓库 编译 javac 打包 -jar&#xff0c;将java代码打包为jar文件 安装到本地仓库-将打包的jar文件&#xff0c;保存到本地仓库目录中…

MacOS在zsh环境下安装和使用终端插件autojump

文章目录介绍安装 autojump使用 git clone使用 HomeBrew 安装配置使用 autojump卸载 autojump介绍 autojump is a faster way to navigate your filesystem. It works by maintaining a database of the directories you use the most from the command line. Directories must…

如何做到服务器虚拟化_尽可能地做到无服务器,但不止于此

如何做到服务器虚拟化毫无疑问&#xff0c;如果您一直关注技术趋势&#xff0c;那么您会看到“无服务器”的兴起。 在某些情况下&#xff0c;“无服务器”被称为“下一个应用程序体系结构”样式。 我什至听说有人说“您不需要技术X&#xff0c;因为无服务器是未来的方式”或“技…

MAC启动redis的目录

找到目录 cd /redis-6.2.1/src ./redis-service

Linux/MacOS 安装 Oh my zsh

文章目录安装curl 安装wget 安装卸载安装 安装方法有两种&#xff0c;可以使用 curl 或 wget&#xff0c;看自己环境或喜好 curl 安装 sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"curl 是下载文件的…