前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >『数据可视化』一文掌握Pandas可视化图表

『数据可视化』一文掌握Pandas可视化图表

作者头像
可以叫我才哥
发布于 2021-08-05 07:30:11
发布于 2021-08-05 07:30:11
8.5K00
代码可运行
举报
文章被收录于专栏:可以叫我才哥可以叫我才哥
运行总次数:0
代码可运行

关注可以叫我才哥,学习分享数据之美

我们的第94篇原创

作者:才哥


大家好,我是才哥。

今天简单介绍一下Pandas可视化图表的一些操作,Pandas其实提供了一个绘图方法plot(),可以很方便的将SeriesDataframe类型数据直接进行数据可视化

1. 概述

这里我们引入需要用到的库,并做一些基础设置。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 设置 可视化风格
plt.style.use('tableau-colorblind10') 

# 以下代码从全局设置字体为SimHei(黑体),解决显示中文问题【Windows】
plt.rcParams['font.sans-serif'] = ['SimHei']

# 解决中文字体下坐标轴负数的负号显示问题
plt.rcParams['axes.unicode_minus'] = False 

plot方法默认是折线图,而它还支持以下几类图表类型:

‘line’ : 折线图 (default) ‘bar’ : 柱状图 ‘barh’ : 条形图 ‘hist’ : 直方图 ‘box’ : 箱型图 ‘kde’ : 密度图 ‘density’ : 同密度图 ‘area’ : 面积图 ‘pie’ : 饼图 ‘scatter’ : 散点图 (DataFrame only) ‘hexbin’ : 六边形箱体图 (DataFrame only)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 随机种子
np.random.seed(1)
ts = pd.Series(np.random.randn(100), index=pd.date_range("1/1/2020", periods=100))
ts = ts.cumsum()
ts.plot()

2. 图表元素设置

图表元素设置主要是指 数据源选择、图大小、标题、坐标轴文字、图例、网格线、图颜色、字体大小、线条样式、色系、多子图、图形叠加与绘图引擎等等。

数据源选择

这里是指坐标轴的x、y轴数据,对于Series类型数据来说其索引就是x轴,y轴则是具体的值;对于Dataframe类型数据来说,其索引同样是x轴的值,y轴默认为全部,不过可以进行指定选择。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 随机种子
np.random.seed(1)
df = pd.DataFrame(np.random.randn(100, 4), index=ts.index, columns=list("ABCD"))
df = df.cumsum()
df.head()

对于案例数据,直接绘图效果如下(显示全部列)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df.plot()

我们可以指定数据源,比如指定列A的数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df.plot(y='A')

我们还可以指定x轴和多列为y,我这里先构建一列X,然后进行数据源选取

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df["X"] = list(range(len(df)))
df.head()

选择X列为x轴,B、C列为y轴数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 指定多个Y
df.plot(x='X',y=['B','C'])

图大小

通过参数figsize传入一个元组,指定图的长宽(英寸)

注意:以下我们以柱状图为例做演示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
np.random.seed(1)
df = pd.DataFrame(np.random.rand(10, 3), columns=["a", "b", "c"])
df.head()
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 图像大小
df.plot.bar(figsize=(10,5))

除了在绘图时定义图像大小外,我们还可以通过matplotlib的全局参数设置图像大小

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
plt.rcParams['figure.figsize'] = (10,5)

标题

通过参数title设置图表标题,需要注意的是如果想要显示中文,需要提前设置相关字体参数,参考此前推文《详解Matplotlib中文字符显示问题

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 标题
df.plot.bar(title='标题',)

图例

通过参数legend可以设置图例,默认是显示图例的,可以不显示或者显示的图例顺序倒序

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 图例不显示
df.plot.bar(legend=False)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 图例倒序
df.plot.bar(legend='reverse')

坐标轴文字

细心的朋友可能会发现,在上图中x轴标签数字显示是躺着的,怎么坐起来呢?

那么可以通过参数rot设置文字的角度

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# x轴标签旋转角度
df.plot.bar(rot=0)

网格线

默认情况下图表是不显示网格线的,我们可以通过参数grid来设置其显隐

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 网格线
df.plot.bar(grid=True)

图颜色

通过color参数可以设定填充颜色,edgecolor可以设置边框颜色

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 指定颜色
df.plot.bar(color=['red','orange','yellow'], edgecolor='grey')

字体大小

通过fontsize可以设置字体大小

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 字体大小
df.plot.bar(fontsize=20)

线条样式

对于折线图来说,还可以设置线条样式style

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df.plot(style = ['.-','--','*-'] # 圆点、虚线、星星
       )

色系

通过colormap参数可以指定色系,色系选择可以参考matplotlib库的色系表

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 指定色系
x = df.plot.bar(colormap='rainbow')

多子图

通过subplots参数决定是否以多子图形式输出显示图表

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 多子图
x = df.plot.line(title ='多子图',
             fontsize =16,
             subplots =True, # 分列
             style = ['.-','--','*-','^-'] # 圆点、虚线、星星
            )

图像叠加

不同的图表类型组合在一起

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df.a.plot.bar()
df.b.plot(color='r')

绘图引擎

通过backend可以指定不同的绘图引擎,目前默认是matplotlib,还支持bokehplotlyAltair等等。当然,在使用新的引擎前需要先安装对应的库。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 绘图引擎
import pandas_bokeh

pandas_bokeh.output_notebook()
df.plot.bar(backend='pandas_bokeh')
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 绘图引擎 plotly
df.plot.bar(backend='plotly',
            barmode='group',
            height=500, # 图表高度
            width=800, # 图表宽度
           )

3. 常见图表类型

在介绍完图表元素设置后,我们演示一下常见的几种图表类型。

柱状图

柱状图主要用于数据的对比,通过柱形的高低来表达数据的大小。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 柱状图bar
df.plot.bar()

(这里不做展示,前面案例中有)

此外我们还可以绘制堆叠柱状图,通过设置参数stacked来搞定

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 堆叠柱状图
df.plot.bar(stacked=True)

柱状图多子图

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 柱状图多子图
df.plot.bar(subplots=True, rot=0)

条形图

条形图和柱状图其实差不多,条形图就是柱状图的横向展示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 条形图barh
df.plot.barh(figsize=(6,8))

堆叠条形图

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 堆叠条形图
df.plot.barh(stacked=True)

直方图

直方图又称为质量分布图,主要用于描述数据在不同区间内的分布情况,描述的数据量一般比较大。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 直方图
np.random.seed(1)
df = pd.DataFrame(
    {
        "a": np.random.randn(1000) + 1,
        "b": np.random.randn(1000),
        "c": np.random.randn(1000) - 1,
    },
     columns=["a", "b", "c"],
)
df.head()
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df.plot.hist(alpha=0.5) # alpha设置透明度

单直方图

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 单直方图
df.a.plot.hist()

堆叠并指定分箱数(默认为 10)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 堆叠并指定分箱数(默认为 10)
df.plot.hist(stacked=True, bins=20)

横向展示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 可以通过orientation='horizontal'和 cumulative=True 绘制横向和累积直方图
df["a"].plot.hist(orientation="horizontal", cumulative=True)

多子图展示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 绘制多子图
df.hist(color="k", alpha=0.5, bins=50)

单个直方图(自定义分箱+透明度)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 以下2种方式效果一致
df.hist('a', bins = 20, alpha=0.5)
# df.a.hist(bins = 20, alpha=0.5)

分组

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# by 分组
np.random.seed(1)
data = pd.Series(np.random.randn(1000))
data.hist(by=np.random.randint(0, 4, 1000), figsize=(6, 4))

箱线图

箱线图又称盒须图、箱型图等,用于显示一组数据分布情况的统计图。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
np.random.seed(1)
df = pd.DataFrame(np.random.rand(10, 5), columns=["A", "B", "C", "D", "E"])
df.head()
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df.boxplot()

指定元素颜色

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 指定元素颜色
color = {
  "boxes": "Green", # 箱体颜色
  "whiskers": "Orange", # 连线颜色
  "medians": "Blue", # 中位数颜色
  "caps": "Gray", # 极值颜色
}

df.boxplot(color=color, sym="r+")

横向展示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df.boxplot(vert=False, positions=[1, 4, 5, 6, 8])

面积图

面积图又称区域图,是将折线图与坐标轴之间的区域使用颜色填充,填充颜色可以很好地突出趋势信息,一般颜色带有透明度会更合适于观察不同序列之间的重叠关系。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
np.random.seed(1)
df = pd.DataFrame(np.random.rand(10, 4), columns=["a", "b", "c", "d"])
df.head()

默认情况下,面积图是堆叠的

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 默认是堆叠
df.plot.area()

单个面积图

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df.a.plot.area()

取消堆叠

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 取消堆叠
df.plot.area(stacked=False)

散点图

散点图就是将数据点展示在直角坐标系上,可以很好地反应变量之间的相互影响程度

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
np.random.seed(1)
df = pd.DataFrame(np.random.rand(50, 4), columns=["a", "b", "c", "d"])

df["species"] = pd.Categorical(
  ["setosa"] * 20 + ["versicolor"] * 20 + ["virginica"] * 10
)

df.head()

指定一组数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df.plot.scatter(x="a", y="b")

多组数据并用不同颜色标注

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ax = df.plot.scatter(x="a", y="b", color="Blue", label="Group 1")
df.plot.scatter(x="c", y="d", color="red", label="Group 2", ax=ax)

一组数据,x/y及z,其中x/y表示位置、z的值用于颜色区分

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df.plot.scatter(x="a", y="b", c="c", s=50) # 参数s代表散点大小

一组数据,然后分类并用不同颜色(色系下)表示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df.plot.scatter(x="a", y="b", c="species", cmap="viridis", s=50)

气泡图

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df.plot.scatter(x="a", y="b", color="red", s=df["c"] * 200)

饼图

饼图主要用于不同分类的数据占总体的比例情况

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
np.random.seed(8)
series = pd.Series(3 * np.random.rand(4), index=["a", "b", "c", "d"], name="series")
series
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
series.plot.pie(figsize=(6, 6), fontsize=20)

多子图展示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
np.random.seed(8)
df = pd.DataFrame(
     3 * np.random.rand(4, 2), index=["a", "b", "c", "d"], columns=["x", "y"]
 )
df
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
df.plot.pie(subplots=True, figsize=(8, 4), fontsize=16)

指定显示样式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
series.plot.pie(
     labels=["AA", "BB", "CC", "DD"], # 标签
     colors=["r", "g", "b", "c"], # 指定颜色
     autopct="%.2f", # 数字格式(百分比)
     fontsize=20,
     figsize=(6, 6),
 )

如果数据总和小于1,可以绘制扇形

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
series = pd.Series([0.1] * 4, index=["a", "b", "c", "d"], name="series2")
series.plot.pie(figsize=(6, 6), normalize=False)

4. 其他图表类型

在常见图表中,有密度图和六边形箱型图 绘制过程报错,暂时没有解决(本机环境:pandas1.3.1)

本节主要介绍散点矩形图、安德鲁曲线等,更多资料大家可以查阅官方文档了解

https://pandas.pydata.org/pandas-docs/stable/user_guide/visualization.html

散点矩形图

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from pandas.plotting import scatter_matrix

df = pd.DataFrame(np.random.randn(1000, 4), columns=["a", "b", "c", "d"])
scatter_matrix(df, alpha=0.2, figsize=(6, 6), diagonal="kde")

安德鲁曲线

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from pandas.plotting import andrews_curves

data = pd.read_csv("iris.csv")
andrews_curves(data, "Name")

以上就是本次全部内容,感兴趣的朋友可以后台回复 955 在可视化文件夹领取案例数据及代码演示文件。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-07-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 可以叫我才哥 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
又遇500
宽带换套餐迟了,只好销户再开,也就从前天起没法上网了,昨天早上用手机登陆网站的时候发现500错误了,以为只是一会,结果晚上了还没好,就联系电信机房把我的宽带账号激活,赶紧看看出啥事了。
空空裤兜
2023/03/03
5520
502错误处理思路
最近几天,一个站不时502,另一个却好好的,很是纳闷。最开始以为是php或者nginx卡住了,重启两个服务后恢复,后来重启没有作用,更换了php和nginx的版本后问题解决,再后来重启服务、重启vps都不能解决问题,一直既往的一个站点正常,另一个站502错误。
空空裤兜
2023/03/03
7350
鼠标点击特效tunneler
2022.10.15update:虽然找到了JS文件,现在已经不能使用了,有需要文件自行研究的留言。
空空裤兜
2023/03/03
2.7K0
友链移至首页
买了木木的主题有一段时间了,修修改改的折腾到现在,虽然还有错误的地方,但是相对来说不是很严重,还在可以接受的范围内,比如评论时不知道什么时候会出现的评论框不能输入,发布按钮上的倒计时也会停留在15秒不动,可能是代码冲突,先放着吧。
空空裤兜
2023/03/03
1.3K0
友链移至首页
道道通出现“no mapdb1”错误
善领引导凯立德成功。引导道道通的时候提示“No mapdb1”,搜了很多解决方法,基本都是一个抄另一个,通过我不断的楼上楼下跑,修改、测试,终于找到一种目前还没搜到的办法,当然,也很简单。
空空裤兜
2023/03/03
2990
道道通出现“no mapdb1”错误
自建随机图片API
将上述代码放入新建的PHP文件中,名称随意,我的是img.php,同级建立images目录,将图片直接放到images中即可。
空空裤兜
2023/03/03
9320
通过DenyHosts阻止SSH暴力攻击教程
Denyhosts是一个Linux系统下阻止暴力破解SSH密码的软件,它的原理与DDoS Deflate类似,可以自动拒绝过多次数尝试SSH登录的IP地址,防止互联网上某些机器常年破解密码的行为,也可以防止黑客对SSH密码进行穷举。
空空裤兜
2023/03/03
6710
wordpress中文论坛被黑了
自从博客换了wordpress程序后,经常泡的论坛就是wordpress中文论坛,看到博友们分享的主题、插件,更多的是结识了一群博友,互访,灌水。
空空裤兜
2023/03/03
4570
wordpress中文论坛被黑了
为tag添加链接
最近转了很多博客,看到很多人的文章内有tag的链接,自己以前也用过这样的插件,比如all in one seo,key-link好像,感觉都不怎么好。
空空裤兜
2023/03/03
6050
为tag添加链接
源码搭建tiny tinyrss订阅系统
安装ttrss也有两种比较常见的方案,一种是docker,一种是通过源码。这里,我们采用源码的方式。
空空裤兜
2023/03/03
6840
源码搭建tiny tinyrss订阅系统
Gravatar头像缓存本地化
Gravatar头像因为某种原因打不开,解决办法有换源、本地缓存等,上个主题不知道哪里的问题,换源始终不行,评论区一水的葫芦娃和爷爷,今天翻教程,找到这篇本地缓存教程,来自《wordpress加速之Gravatar头像缓存本地化》。
空空裤兜
2023/03/03
9120
Gravatar头像缓存本地化
搬家到MC
搬到洛杉矶MC机房了,感觉上速度和linode东京差别不大,记录下搬家中的小问题。
空空裤兜
2023/03/03
1.3K0
搬家到MC
自动填写评论者信息
前几天在木木的博客看到下面这段代码,当时也没在意,今天在毕扬那里又见到了,那么折腾下吧。
空空裤兜
2023/03/03
6530
Postfix配置记录
手贱,又搞了个vps,用就久了sendmail,想着换换口味,于是就postfix。Postfix安装很简单,centos6.4好像默认已经安装好了,略过不叙。主要记录一下配置中出现的一些问题。
空空裤兜
2023/03/03
8400
搞定侧边栏TAB选项卡
竖着排列确实会在网速卡的时候,随机日志,最新日志,热评日志会连在一起显示30篇文章,太不美观了。
空空裤兜
2023/03/03
1.2K0
添加微信开放平台
在微信开放平台刚出来的时候,就申请了一个号码,并热乎乎的发布了出来,也关注了几个公共号码,一时间微信消息此起彼伏,好不热闹,不过空空裤兜只是注册了号码,并没有发布消息,所以这个所谓的平台是一片冷清。
空空裤兜
2023/03/03
3K0
添加微信开放平台
Linux Apache主机设置ZBLOG PHP防盗链图片的方法
我们一般选择的云服务器都是有带宽或者流量限制的,甚至我们在将网站的图片静态文件丢入对象存储,对象存储空间也是按照流量计费。如果我们的网站被盗链图片,可能会导致流量流失比较大,当然是有消耗我们的成本的,于是我们会使用到防盗链的方法。
老蒋
2021/12/27
6850
给WordPress评论添加背景图片
很多博客的评论框有背景图片,因为担心服务器的响应时间,一直都没设置,为了鼓励访客评论,我也给评论框添加了背景图片,实现的方法是very very简单。
空空裤兜
2023/03/03
6480
给WordPress评论添加背景图片
标题载入添加loading状态
昨天不知道在谁的博客看到一个特效,鼠标移到标题的时候,标题会向右缓缓移动,感觉不错,还留了言,博主没有回复,我现在也不急的是谁的博客了。
空空裤兜
2023/03/03
8740
初步折腾Varnish
开始安装就遇到麻烦了,总是提示安装不成功,换了一个又一个的源,最后总算在谷哥的帮助下安装成功。
空空裤兜
2023/03/03
4230
相关推荐
又遇500
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档