原来使用 Pandas 绘制图表也这么惊艳!

Pandas 是一种非常流行的数据分析工具,同时它还为数据可视化提供了很好的选择。 数据可视化是使数据科学项目成功的重要一步——一个有效的可视化图表可以胜过上千文字描述。 数据可视化是捕捉趋势和分享从数据中获得的见解的非常有效的方式,流行的可视化工具有很,它们各具特色,但是在今天的文章中,我们将学习使用 Pandas 进行绘图。 ## Pandas 的 plot() 方法 Pandas 附带了一些绘图功能,底层都是基于 Matplotlib 库的,也就是说,由 Pandas 库创建的任何绘图都是 Matplotlib 对象。 从技术上讲,Pandas 的 `plot()` 方法通过 `kind` 关键字参数提供了一组绘图样式,以此来创建美观的绘图。`kind` 参数的默认值是行字符串值。我们可以将 11 种不同的字符串值分配给 kind 参数,也就可以创建出不一样的绘图了。 同时 `.plot` 也是 Pandas DataFrame 和 series 对象的属性,提供了 Matplotlib 可用的一小部分绘图功能。事实上,Pandas 通过为我们自动化大部分数据可视化过程,使绘图变得像编写一行代码一样简单。 ## 导入库和数据集 在今天的文章中,我们将研究 Facebook、微软和苹果股票的每周收盘价。以下代码导入可视化所需的必要库和数据集,然后在输出中显示 DataFrame 的内容。 %matplotlib 内联魔法命令也被添加到代码中,以确保绘制的数字正确显示在笔记本单元格中: ```Python import pandas as pd import numpy as np import matplotlib.pyplot as plt df = pd.read_csv('weekly_stocks.csv', parse_dates=['Date'], index_col='Date') pd.set_option('display.max.columns', None) print(df.head()) ``` Output: ```Text MSFT FB AAPL Date 2021-05-24 249.679993 328.730011 124.610001 2021-05-31 250.789993 330.350006 125.889999 2021-06-07 257.890015 331.260010 127.349998 2021-06-14 259.429993 329.660004 130.460007 2021-06-21 265.019989 341.369995 133.110001 ``` 我们现在已准备好使用 Pandas 探索和可视化数据了,开始吧 ## 折线图 plot 默认图就是是折线图,它在 x 轴上绘制索引,在 y 轴上绘制 DataFrame 中的其他数字列。 让我们绘制一个折线图,看看微软在过去 12 个月的表现如何: ```Python df.plot(y='MSFT', figsize=(9,6)) ``` Output: ![](https://upload-images.jianshu.io/upload_images/5803165-b7cf68d6feba3c96.png) > figsize 参数接受两个参数,以英寸为单位的宽度和高度,并允许我们更改输出图形的大小。宽度和高度的默认值分别为 6.4 和 4.8。 通过提供列名列表并将其分配给 y 轴,我们可以从数据中绘制多条线。 例如,让我们看看这三家公司在去年的表现如何: ```Python df.plot.line(y=['FB', 'AAPL', 'MSFT'], figsize=(10,6)) ``` Output: ![](https://upload-images.jianshu.io/upload_images/5803165-169f5993691ec5f4.png) 我们可以使用 `plot()` 方法提供的其他参数来为绘图添加更多细节,如下所示: ```Python df.plot(y='FB', figsize=(10,6), title='Facebook Stock', ylabel='USD') ``` Output: ![](https://upload-images.jianshu.io/upload_images/5803165-c5ff24de1fbb7ff2.png) 正如我们在图中看到的,title 参数为绘图添加了一个标题,而 ylabel 为绘图的 y 轴设置了一个标签。默认情况下显示图例的图例,但是我们可以将 legend 参数设置为 false 来隐藏图例。 ## 条形图 条形图是一种基本的可视化图表,用于比较数据组之间的值并用矩形条表示分类数据。该图表可能包括特定类别的计数或任何定义的值,并且条形的长度对应于它们所代表的值。 在下面的示例中,我们将根据每月平均股价创建一个条形图,来比较每个公司在特定月份与其他公司的平均股价。首先,我们需要按月末重新采样数据,然后使用 `mean()` 方法计算每个月的平均股价。我们还选择了最近三个月的数据,如下所示: ```Python df_3Months = df.resample(rule='M').mean()[-3:] print(df_3Months) ``` Output: ```Text MSFT FB AAPL Date 2022-03-31 298.400002 212.692505 166.934998 2022-04-30 282.087494 204.272499 163.704994 2022-05-31 262.803335 198.643331 147.326665 ``` 现在,我们可以通过将条形字符串值分配给 kind 参数来基于聚合数据创建条形图: ```Python df_3Months.plot(kind='bar', figsize=(10,6), ylabel='Price') ``` Output: ![](https://upload-images.jianshu.io/upload_images/5803165-b3a3e53bcacefe6c.png) 我们可以通过将 barh 字符串值分配给 kind 参数来创建水平条形图: ```Python df_3Months.plot(kind='barh', figsize=(9,6)) ``` Output: ![](https://upload-images.jianshu.io/upload_images/5803165-747350cde8ad8b01.png) 我们还可以在堆叠的垂直或水平条形图上绘制数据,这些条形图代表不同的组,结果条的高度显示了组的组合结果。要创建堆积条形图,我们需要将 True 分配给堆积参数,如下所示: ```Python df_3Months.plot(kind='bar', stacked=True, figsize=(9,6)) ``` Output: ![](https://upload-images.jianshu.io/upload_images/5803165-f17c7bd922cacd6e.png) ## 直方图 直方图是一种表示数值数据分布的条形图,其中 x 轴表示 bin 范围,而 y 轴表示某个区间内的数据频率。 ```Python df[['MSFT', 'FB']].plot(kind='hist', bins=25, alpha=0.6, figsize=(9,6)) ``` Output: ![](https://upload-images.jianshu.io/upload_images/5803165-c65454393e79374f.png) 在上面的示例中, bins 参数指定 bin 间隔的数量,而 alpha 参数指定透明度。 也可以堆叠直方图: ```Python df[['MSFT', 'FB']].plot(kind='hist', bins=25, alpha=0.6, stacked=True, figsize=(9,6)) ``` Output: ![](https://upload-images.jianshu.io/upload_images/5803165-3683deea9ba803b1.png) ## 箱形图 箱线图由三个四分位数和两个须线组成,它们在一组指标中总结数据:最小值、第一四分位数、中位数、第三四分位数和最大值。 箱线图传达的信息非常有用,例如四分位距 (IQR)、中位数和每个数据组的异常值。让我们看看它是如何工作的: ```Python df.plot(kind='box', figsize=(9,6)) ``` Output: ![](https://upload-images.jianshu.io/upload_images/5803165-b039ad2faf96c76e.png) 我们可以通过将 False 分配给 vert 参数来创建水平箱线图,如水平条形图: ```Python df.plot(kind='box', vert=False, figsize=(9,6)) ``` Output: ![](https://upload-images.jianshu.io/upload_images/5803165-3eb4e2f7b6318b5c.png) ## 面积图 面积图是折线图的扩展,它用颜色填充折线图和 x 轴之间的区域。如果在同一个图中显示了多个面积图,则不同的颜色可以区分不同的面积图: ```Python df.plot(kind='area', figsize=(9,6)) ``` Output: ![](https://upload-images.jianshu.io/upload_images/5803165-1262709b04388f69.png) Pandas plot() 方法默认创建堆积面积图,通过将 False 分配给堆叠参数来取消堆叠面积图是一项常见任务: ```Python df.plot(kind='area', stacked=False, figsize=(9,6)) ``` Output: ![](https://upload-images.jianshu.io/upload_images/5803165-90fc54f3c2dc5eff.png) ## 饼图 如果我们对比率感兴趣,饼图是列中数值数据的一个很好的比例表示。以下示例显示了过去三个月的平均 Apple 股票价格分布: ```Python df_3Months.index=['March', 'April', 'May'] df_3Months.plot(kind='pie', y='AAPL', legend=False, autopct='%.f') ``` Output: ![](https://upload-images.jianshu.io/upload_images/5803165-55eb741c5cb24c6b.png) 默认情况下,图例将显示在饼图上,因此我们将 False 分配给 legend 关键字以隐藏图例。 上面代码中的新关键字参数是 autopct,它在饼图切片上显示百分比值。 如果我们想将多个饼图中所有列的数据表示为子图,我们可以将 True 分配给 subplots 参数,如下所示: ```Python df_3Months.plot(kind='pie', legend=False, autopct='%.f', subplots=True, figsize=(14,8)) ``` Output: ![](https://upload-images.jianshu.io/upload_images/5803165-9901e43bba555b80.png) ## 散点图 散点图在 x 和 y 轴上绘制数据点以显示两个变量之间的相关性。像这样: ```Python df.plot(kind='scatter', x='MSFT', y='AAPL', figsize=(9,6), color='Green') ``` Output: ![](https://upload-images.jianshu.io/upload_images/5803165-16747a117c388cfc.png) 正如我们在上图中看到的,散点图显示了微软和苹果股价之间的关系。 ## 六边形图 当数据非常密集时,六边形 bin 图(也称为 hexbin 图)可以替代散点图。换句话说,当数据点的数量很大,并且每个数据点不能单独绘制时,最好使用这种以蜂窝形式表示数据的绘图。此外,每个 hexbin 的颜色定义了该范围内数据点的密度。 ```Python df.plot(kind='hexbin', x='MSFT', y='AAPL', gridsize=10, figsize=(10,6)) ``` Output: ![](https://upload-images.jianshu.io/upload_images/5803165-4502bf7a52ece03f.png) gridsize 参数指定 x 方向上六边形的数量,较大的网格尺寸意味着更多和更小的箱,gridsize 参数的默认值为 100。 ## KDE 绘图 我们要讨论的最后一个图是核密度估计,也称为 KDE,它可视化连续和非参数数据变量的概率密度。该图使用高斯核在内部估计概率密度函数 (PDF): ```Python df.plot(kind='kde') ``` Output: ![](https://upload-images.jianshu.io/upload_images/5803165-f3d01d29794fe4df.png) 我们还可以指定影响 KDE 绘图中绘图平滑度的带宽,如下所示: ```Python df.plot(kind='kde', bw_method=0.1) ``` Output: ![](https://upload-images.jianshu.io/upload_images/5803165-de21322d45f30cc4.png) ```Python df.plot(kind='kde', bw_method=1) ``` Output: ![](https://upload-images.jianshu.io/upload_images/5803165-d1daa092c9c003ca.png) 正如我们所见,选择较小的带宽会导致平滑不足,这意味着密度图显示为单个峰值的组合。相反,巨大的带宽会导致过度平滑,这意味着密度图表现为单峰分布。 好啦,这就是今天分享的全部内容,喜欢就点个赞吧~ 本文由[mdnice](https://mdnice.com/?platform=6)多平台发布
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,602评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,442评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,878评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,306评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,330评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,071评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,382评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,006评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,512评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,965评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,094评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,732评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,283评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,286评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,512评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,536评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,828评论 2 345

推荐阅读更多精彩内容