7000 字 23 张图,Pandas一键生成炫酷的动态交互式图表
作者 | 俊欣
来源 | 关于数据分析与可视化
今天小编来演示一下如何用pandas
一行代码来绘制可以动态交互的图表,并且将绘制的图表组合到一起,组成可视化大屏,本次小编将要绘制的图表有
折线图
散点图
直方图
柱状图
饼图
面积图
地图
组合图
准备工作
我们先导入需要用到的库,并做相应的设置
import pandas as pd
import pandas_bokeh
pandas_bokeh.output_notebook()
因为小编是在jupyter nobteook
上面操作的,这边就用到了output_notebook()
的设置
折线图
我们先来画一张简单的折线图,当中随机生成一批数据
import numpy as npnp.random.seed(55)
df = pd.DataFrame({"宁德时代": np.random.randn(100)+0.2, "贵州茅台": np.random.randn(100)+0.17}, index=pd.date_range('1/1/2021', periods=100))
df = df.cumsum()
df = df + 50
df.plot_bokeh(kind="line")
output
绘制出来的图表可以任意的缩放以及拖拽,我们也可以点击右边的“保存”按钮来实现对图表的下载保存,以至于图表的类型只需要对参数kind
加以设定,我们将上面的代码优化一下
df.plot_bokeh.line(figsize=(800, 450),title="宁德时代 vs 贵州茅台",xlabel="日期",ylabel="股票价格 [$]",yticks=[0, 100, 200, 300, 400],ylim=(0, 100),xlim=("2021-01-01", "2021-04-01"),colormap=["red", "blue"],plot_data_points=True,plot_data_points_size=10,marker="asterisk")
output
我们对X轴以及Y轴坐标做了范围的限定,并且加上了标注,效果看起来也更加的美观一些。和pyecharts
类似,我们也可以在图标的底部添加一个时间轴,拖动时间轴来展示数据
ts = pd.Series(np.random.randn(100), index=pd.date_range('1/1/2021', periods=100))
df = pd.DataFrame(np.random.randn(100, 4), index=ts.index, columns=list('ABCD'))
df = df.cumsum()df.plot_bokeh(rangetool=True)
output
当然我们也可以对折线加以修改,就可以变成另外一种样子,主要修改的就是参数marker
x = np.arange(-5, 5, 0.1)
y2 = x**2
y3 = x**3
df = pd.DataFrame({"x": x, "Type 1": y2, "Type 2": y3})
df.plot_bokeh.point(x="x",xticks=range(-5, 5),size=5,colormap=["#009933", "#ff3399"],title="折线图 (Type 1 vs. Type 2)",marker="x")
output
散点图
接下来我们来看散点图,步骤与上述的折线图相类似
df = pd.read_csv("iris.csv")
p_scatter = df.plot_bokeh.scatter(x="petal length(cm)",y="sepal width(cm)",category="species",title="Iris数据集可视化",show_figure=True,
)
output
我们在读取了iris
数据集之后,将x
参数和y
参数上填上我们所要绘制的两列,而title
参数则是设置图表的标题
我们也可以通过当中size
这个参数来控制散点的大小,例如
df.loc[13, "sepal length(cm)"] = 15
df.loc[15, "sepal length(cm)"] = 17
df.loc[20, "sepal length(cm)"] = 30
df.loc[40, "sepal length(cm)"] = 20p_scatter = df.plot_bokeh.scatter(x="petal length(cm)",y="sepal width(cm)",category="species",title="Iris数据集可视化",show_figure=True,size="sepal length(cm)"
)
output
柱状图
下面我们来看一下直方图的绘制
data = {'fruits':['苹果', '梨', '草莓', '西瓜', '葡萄', '香蕉'],'2015': [2, 1, 4, 3, 2, 4],'2016': [5, 3, 3, 2, 4, 6],'2017': [3, 2, 4, 4, 5, 3]
}
df = pd.DataFrame(data).set_index("fruits")p_bar = df.plot_bokeh.bar(ylabel="每斤的的价格 [¥]", title="水果每年的价格", alpha=0.6)
output
我们看到上面的直方图是按照不同的年份分开来的,我们也可以堆叠起来,通过stacked
这个参数来实现
p_stacked_bar = df.plot_bokeh.bar(ylabel="每斤的的价格 [¥]",title="水果每年的价格",stacked=True,alpha=0.6)
output
直方图
绘制直方图的方式也是类似的
p_hist = df_hist.plot_bokeh.hist(y=["a", "b"],bins=np.arange(-5, 5, 0.5),normed=100,vertical_xlabel=True,ylabel="Share[%]",title="正则分布直方图",show_average=True,xlim=(-4, 6),ylim=(0, 30),show_figure=True)
output
小编个人觉得直方图有点丑,不知道大家是不是有类似的体验
面积图
df.plot_bokeh.area(x="Year",stacked=True,legend="top_left",colormap=["yellow", "orange", "black", "grey", "blue", "green"],title="全球不同能源的消耗量",ylabel="不同能源的消耗(吨)",ylim=(0, 16000))
output
我们看到石油的消耗量一直都在不断的提升,另外有一个normed
参数来帮助我们更好的观察数据的走势
df.plot_bokeh.area(x="Year",stacked=True,normed = 100,legend="bottom_left",colormap=["yellow", "orange", "black", "grey", "blue", "green"],title="全球不同能源的消耗量",ylabel="不同能源的消耗(吨)")
output
饼图
df_pie.plot_bokeh.pie(x="Type",y="2017",colormap=["blue", "red", "yellow", "green", "purple", "orange", "grey"],title="饼图",)
output
上面的代码只是引用了表格当中的一列,当然我们也可以不做指定,引用表格当中的每一列数据
df_pie.plot_bokeh.pie(x="Type",colormap=["blue", "red", "yellow", "green", "purple", "orange", "grey"],title="多重饼图",line_color="black")
output
地图
同时我们来看一下地图的绘制,下面的图表是基于全球各大城市的人口密度分布来绘制的
df_mapped.plot_bokeh.map(x="longitude",y="latitude",hovertool_string="""<h2> @{name} </h2> <h3> Population: @{pop_max} </h3>""",tile_provider="STAMEN_TERRAIN_RETINA",size="population", figsize=(900, 600),title="全球特大城市分布")
output
从图中可以看出,亚洲的日本主要是集中在东京这块,而像在国内的话,有大家熟知的北上广深。上面的代码有两个参数x
和y
分别对应的是经纬度,
import geopandas as gpd
import pandas_bokeh
pandas_bokeh.output_file("Interactive Plot.html")df_states = gpd.read_file("states.geojson")
print(df_states.head())
下面这张图是美国各个州2017年的的人口总量,我们给上面的每一个州配上不同的颜色
df_states.plot_bokeh(figsize=(900, 600),category="POPESTIMATE2017",simplify_shapes=5000,colormap="Inferno",colormap_uselog=True,colorbar_tick_format="0.0a")
output
当然我们也可以在地图上面添加一个时间轴,让图表随着时间的流逝而变化
for i in range(8):df_states["Delta_Population_201%d"%i] = ((df_states["POPESTIMATE201%d"%i] / df_states["POPESTIMATE2010"]) -1 ) * 100slider_columns = ["Delta_Population_201%d"%i for i in range(8)]
slider_range = range(2010, 2018)
df_states.plot_bokeh(figsize=(900, 600),simplify_shapes=5000,slider=slider_columns,slider_range=slider_range,slider_name="Year",colormap="Inferno",hovertool_columns=["STATE_NAME"] + slider_columns,title="Change of Population [%]")
output
同时我们也可以在地图上面添加一个下拉框,通过点选来筛选数据的展示
df_states["STATE_NAME_SMALL"] = df_states["STATE_NAME"].str.lower()df_states.plot_bokeh(figsize=(900, 600),simplify_shapes=5000,dropdown=["POPESTIMATE2010", "POPESTIMATE2017"],colormap="Viridis",hovertool_string="""<imgsrc="https://www.states101.com/img/flags/gif/small/@STATE_NAME_SMALL.gif" height="42" alt="@imgs" width="42"style="float: left; margin: 0px 15px 15px 0px;"border="2"></img><h2> @STATE_NAME </h2><h3> 2010: @POPESTIMATE2010 </h3><h3> 2017: @POPESTIMATE2017 </h3>""",tile_provider_url=r"http://c.tile.stamen.com/watercolor/{Z}/{X}/{Y}.jpg",tile_attribution='Map tiles by <a href="http://stamen.com">Stamen Design</a>, under <a href="http://creativecommons.org/licenses/by/3.0">CC BY 3.0</a>. Data by <a href="http://openstreetmap.org">OpenStreetMap</a>, under <a href="http://www.openstreetmap.org/copyright">ODbL</a>.')
output
最后我们可以通过区域的筛选来进行数据的呈现,通过`category`这个参数来实现
df_states.plot_bokeh(figsize=(900, 600),simplify_shapes=5000,category="REGION",show_colorbar=False,colormap=["blue", "yellow", "green", "red"],hovertool_columns=["STATE_NAME", "REGION"],tile_provider="STAMEN_TERRAIN_RETINA")
多图组合
用pandas_bokeh
模块也能够实现多张图表的组合,例如上面 人口密度的图表就可以和美国各大洲的人口总量的图表进行组合
#绘制出大致的轮廓图
figure = df_states.plot_bokeh(figsize=(800, 450),simplify_shapes=10000,show_figure=False,xlim=[-170, -80],ylim=[10, 70],category="REGION",colormap="Dark2",legend="States",show_colorbar=False,
)#绘制人口的密度图
df_cities.plot_bokeh(figure=figure, # <== pass figure here!category="pop_max",colormap="Viridis",colormap_uselog=True,size="size",hovertool_string="""<h1>@name</h1><h3>Population: @pop_max </h3>""",marker="inverted_triangle",legend="Cities",
)
上面的代码我们主要是用到了pandas_bokeh.plot_grid
这个方法来将多个图结合起来,再来看几个简单的案例
df = pd.read_csv("iris.csv")from bokeh.models.widgets import DataTable, TableColumn
from bokeh.models import ColumnDataSourcedata_table = DataTable(columns=[TableColumn(field=Ci, title=Ci) for Ci in df.columns],source=ColumnDataSource(df),height=300,
)# 创建散点图:
p_scatter = df.plot_bokeh.scatter(x="petal length(cm)",y="sepal width(cm)",category="species",title="Iris数据可视化",show_figure=False,
)# Combine Table and Scatterplot via grid layout:
pandas_bokeh.plot_grid([[data_table, p_scatter]], plot_width=400, plot_height=350)
output
我们也可以借此多绘制几个直方图,然后组合起来
#重置表格的行索引:
df.reset_index(inplace=True)#创建水平方向的直方图:
p_hbar = df.plot_bokeh(kind="barh",x="fruits",xlabel="Price per Unit [€]",title="Fruit prices per Year",alpha=0.6,legend = "bottom_right",show_figure=False)#创建堆叠式的柱状图:
p_stacked_hbar = df.plot_bokeh.barh(x="fruits",stacked=True,xlabel="Price per Unit [€]",title="Fruit prices per Year",alpha=0.6,legend = "bottom_right",show_figure=False)#Plot all barplot examples in a grid:
pandas_bokeh.plot_grid([[p_bar, p_stacked_bar],[p_hbar, p_stacked_hbar]], plot_width=450)
output
往
期
回
顾
资讯
GPT-3与小学生的做题之战……
资讯
人工智能又将如何破局?文末赠书
资讯
老龄化的Facebook能否再换新颜
福利
赠书|深度学习视频理解之图像分类
分享
点收藏
点点赞
点在看
相关文章:

手把手教你使用zabbix监控nginx
zabbix监控nginx,多亏了容哥(杨容)的帮忙,为了感谢容哥的帮助,写了这篇文章。环境介绍:服务器系统版本:CentOSrelease 6.6 (Final)内核版本:Linux hk_nginx2.6.32-504.3.3.el6.x86_64ZabbixServer版本&…

理解多线程设计模式
多线程设计模式:1.Single Threaded Execution Pattern [同一时刻只允许一个线程操作] 比喻:三个挑水的和尚,只能同一时间一个人过桥,不然都掉河里喂鱼了。 总结:在多个线程同时要访问的方法上加上synchronized关键…

Linux内核之旅
内核模块是Linux内核向外部提供的一个插口,其全称为动态可加载内核模块(Loadable Kernel Module,LKM),我们简称为模块。Linux内核之所以提供模块机制,是因为它本身是一个单内核(monolithic kern…

qq腾讯第三方登陆
html页面:<html> <head> <meta charset"utf-8" /> <title>第三方登录</title> <meta property"qc:admins" content"1541324001721762700063671645060454" /> </h…

如何利用 Python 爬取 LOL 高清精美壁纸?
作者 | 阿拉斯加 来源 | 杰哥的IT之旅 一、背景介绍 随着移动端的普及出现了很多的移动 APP,应用软件也随之流行起来。最近看到英雄联盟的手游上线了,感觉还行,PC 端英雄联盟可谓是爆火的游戏,不知道移动端的英雄联盟前途如何&…

生产环境主从数据同步不了?
生产环境主从数据同步不了?经历过程: 一般我们常常在做主从复制的时候,可能是很少遇到到错误,那都是因为,你做主从基本用的是,本地虚拟机做,或者一些测试环境做。但是当我们把主从复制部署…

用 YOLOv5模型识别出表情!
作者 | 闫永强来源 | Datawhale本文利用YOLOV5对手势进行训练识别,并识别显示出对应的emoji,如同下图:本文整体思路如下。提示:本文含完整实践代码,代码较长,建议先看文字部分的实践思路,代码先…

Linux操作系统中内存buffer和cache的区别
我们一开始,先从Free命令说起。 free 命令相对于top 提供了更简洁的查看系统内存使用情况: $ freetotal used free shared buffers cachedMem: 255268 238332 16936 0 85540 126384-/ buffers/cache: 26408 228860Swap: 265000 …

sort cut 命令的常用用法
sort命令介绍:sort是在Linux里非常常用的一个命令,管排序的,集中精力,五分钟搞定sort,现在开始!1 sort的工作原理sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后&…

使用 dockerfile 创建镜像
dockerfile 是一个文本格式的配置文件,可以使用 dockerfile 快速创建自定义的镜像。 dockerfile 一般包含4部分信息:基础镜像信息、维护者信息、镜像操作指令、容器启动时执行指令 创建镜像命令:docker build [选项] 路径,会读取指…

wireshark的使用教程--用实践的方式帮助我们理解TCP/IP中的各个协议是如何工作的
wireshark的使用教程 --用实践的方式帮助我们理解TCP/IP中的各个协议是如何工作的 wireshark是一款抓包软件,比较易用,在平常可以利用它抓包,分析协议或者监控网络,是一个比较好的工具,因为最近在研究这个,…

设计师你们还坐的住吗?2021 PS 进入人工智能 P 图时代
与每年一样,Adobe 的 Max 2021 活动顺利开展。本次活动主要是以产品展示以及其他创新产品。 这个活动最有趣的特点之一是,Adobe 不断将人工智能集成到其产品或是功能中。在过去的几年里,人工智能一直是这家公司不断探索的领域。 与许多其他公…

图像处理之噪声---椒盐,白噪声,高斯噪声三种不同噪声的区别
白噪声是指功率谱密度在整个频域内均匀分布的噪声。 所有频率具有相同能量的随机噪声称为白噪声。白噪声或白杂讯,是一种功率频谱密度为常数的随机信号或随机过程。换句话说,此信号在各个频段上的功率是一样的,由于白光是由各种频率ÿ…

发现一个“佛系记账本”
因为这是一款微信小程序,张小龙大力推崇的“用完即走”完美地适合记账应用。 不用下载、不用安装、不用注册、不用各种授权,只要从微信进入,就能记账,账本只与微信关联。 换手机、换PAD都无所谓,只要登录微信ÿ…

YSLOW法则中,为什么yahoo推荐用GET代替POST?
原文:http://www.cnxct.com/use-get-for-ajax-requests-why/ 背景:上上周五,公司前端工程师培训,提到前端优化的一些技巧,当然不能少了yahoo yslow的优化法则。其中有这么一条“Use GET for AJAX Requests”࿰…

Python 多进程、协程异步抓取英雄联盟皮肤并保存在本地
作者 | 俊欣来源 | 关于数据分析与可视化就在11月7日晚间,《英雄联盟》S11赛季全球总决赛决斗,在冰岛拉开“帷幕”,同时面向全球直播。在经过了5个小时的鏖战,EDG战队最终以3:2战胜来自韩国LCK赛区的DK战队,获得俱乐部…

QT 5.4.1 for Android Ubuntu QtWebView Demo
QT 5.4.1 for Android Ubuntu QtWebView Demo 2015-5-15 目录 一、说明: 二、参考文章: 三、QtWebView Demo在哪里? 四、Qt Creator 3.4.0能打开QtWebView Demo? 五、Qt Creator如何生成AndroidManifest.xml? 一、…

硬改TP-Link WR841N v8刷breed和OpenWrt
找到了以前的路由器,想刷OpenWrt但版本是TP-Link的WR841N v8版,上网查过才知道,是专门面向国内发布的严重缩水版国际版的Flash是4M,内存RAM是32M,国内版是2M/16M,不过论坛上也有人说到手的Flash是4M的。(Op…

Facebook的实时Hadoop系统
原文地址: http://blog.solrex.org/articles/facebook-realtime-hadoop-system.html作者:杨文博Facebook 在今年六月 SIGMOD 2011 上发表了一篇名为“Apache Hadoop Goes Realtime at Facebook”的会议论文 (pdf),介绍了 Facebook 为了打造一…

Ka的回溯编程练习 Part1|整划什么的。。
1 #include<stdio.h>2 int search(int s,int t);3 void op(int k);4 int res[1001]{1},n;5 int main()6 {7 //scanf("%d",&n);8 n10;9 search(n,1); 10 return 0; 11 } 12 int search(int s,int t) //当前数的大小s,个数n 13 …

开发者关心的十个数据库技术问题
作者 | 雷海林 责编 | 田玮靖出品 | 《新程序员》如今,数据库越来越受到业界的广泛关注,许多高校毕业生及资深技术人也逐渐投身于数据库产业。《新程序员002》经过用户、专家调研,收集汇总了十个开发者关心的数据库技术问题,…

使用T-SQL语句操作数据表-更新数据
使用update语句更新表中的数据。也就是修改表中的数据。update语法格式:update <表名> set <列名更新值> [where <更新条件>] 解释:update 是更新数据名, 表明是更新数据set 是必要的, 后面可以紧随多个数据列的…

Category Archives: Linux
原文地址:http://blog.solrex.org/articles/solrex-linux-cheatsheet.html Cheatsheet:原意是考试的时候带的小抄,所以说是 cheat(作弊) sheet。在计算机科学领域里,主要是指记录一些难记命令或者操作的快查…

利用 OpenCV+ConvNets 检测几何图形
作者 | 小白 来源 | 小白学视觉 导读 人工智能领域中增长最快的子领域之一是自然语言处理(NLP),它处理计算机与人类(自然)语言之间的交互,特别是如何编程计算机以处理和理解大量自然语言数据。 自然语言处理…

《Linux实践及应用》
2019独角兽企业重金招聘Python工程师标准>>> 《Linux实践及应用》 本书以RedHat 9.0为蓝本,系统地介绍Linux的基础知识、Linux系统的安装与配置、常用命令,以及如何进行Linux系统管理和基本的网络服务设置(包括如何设置DNS服务器、…

找不到包含 OwinStartupAttribute 的程序集
2019独角兽企业重金招聘Python工程师标准>>> 尝试加载应用时出现了以下错误。 找不到包含 OwinStartupAttribute 的程序集。找不到包含 Startup 或 [AssemblyName].Startup 类的程序集。 若要禁用 OWIN 启动发现,请在 web.config 中为 appSetting owin:A…

Imagination 推新款GPU IP,首次实现桌面级光线追踪效果
游戏界被炒得最热的概念可能就是光线追踪技术了,不仅仅是PC端的游戏。光线追踪所展示出来的画面效果也确实惊艳,可以让我们感叹到图像技术达到的一个新高度。 但是实际上,光线追踪并不是一个新技术。10年前,光追就是游戏玩家茶余…

percent之集合
2019独角兽企业重金招聘Python工程师标准>>> 这个留到明天再来写吧,今天把hub剩下的坑填掉. 转载于:https://my.oschina.net/u/2011113/blog/416458

Mr. Process的一生-Linux内核的社会视角 (2)启动
原文地址: http://www.manio.org/cn/startup-of-linux-view-of-society.html 其实这才应该是这一系列文章的第一节,因为这篇文章讲的是盘古开天地的事。话说Mr. Process是一个现代人,但是,只要是人,总该有个祖先。人们…

深入研究ConcurrentHashMap 源码从7到8的变迁
ConcurrentHashMap是线程安全且高效的HashMap 1 为什么要使用ConcurrentHashMap 线程不安全的HashMap HashMap是Java中最常用的一个Map类,性能好、速度快,但不能保证线程安全,它可用null作为key/value HashMap的线程不安全主要体现在resize时…