Pandas 是一种非常流行的数据分析工具,同时它还为数据可视化提供了很好的选择。
数据可视化是使数据科学项目成功的重要一步——一个有效的可视化图表可以胜过上千文字描述。
数据可视化是捕捉趋势和分享从数据中获得的见解的非常有效的方式,流行的可视化工具有很多,它们各具特色,但是在今天的文章中,我们将学习使用 Pandas 进行绘图。
Pandas 的 plot() 方法
Pandas 附带了一些绘图功能,底层都是基于 Matplotlib 库的,也就是说,由 Pandas 库创建的任何绘图都是 Matplotlib 对象。
从技术上讲,Pandas 的 plot()
方法通过 kind
关键字参数提供了一组绘图样式,以此来创建美观的绘图。kind
参数的默认值是行字符串值。我们可以将 11 种不同的字符串值分配给 kind 参数,也就可以创建出不一样的绘图了。
同时 .plot
也是 Pandas DataFrame 和 series 对象的属性,提供了 Matplotlib 可用的一小部分绘图功能。事实上,Pandas 通过为我们自动化大部分数据可视化过程,使绘图变得像编写一行代码一样简单。
导入库和数据集
在今天的文章中,我们将研究 Facebook、微软和苹果股票的每周收盘价。以下代码导入可视化所需的必要库和数据集,然后在输出中显示 DataFrame 的内容。%matplotlib 内联魔法命令也被添加到代码中,以确保绘制的数字正确显示在笔记本单元格中:
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:
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 个月的表现如何:
df.plot(y='MSFT', figsize=(9,6))
Output:
figsize 参数接受两个参数,以英寸为单位的宽度和高度,并允许我们更改输出图形的大小。宽度和高度的默认值分别为 6.4 和 4.8。
通过提供列名列表并将其分配给 y 轴,我们可以从数据中绘制多条线。例如,让我们看看这三家公司在去年的表现如何:
df.plot.line(y=['FB', 'AAPL', 'MSFT'], figsize=(10,6))
Output:
我们可以使用 plot()
方法提供的其他参数来为绘图添加更多细节,如下所示:
df.plot(y='FB', figsize=(10,6), title='Facebook Stock', ylabel='USD')
Output:
正如我们在图中看到的,title 参数为绘图添加了一个标题,而 ylabel 为绘图的 y 轴设置了一个标签。默认情况下显示图例的图例,但是我们可以将 legend 参数设置为 false 来隐藏图例。
条形图
条形图是一种基本的可视化图表,用于比较数据组之间的值并用矩形条表示分类数据。该图表可能包括特定类别的计数或任何定义的值,并且条形的长度对应于它们所代表的值。
在下面的示例中,我们将根据每月平均股价创建一个条形图,来比较每个公司在特定月份与其他公司的平均股价。首先,我们需要按月末重新采样数据,然后使用 mean()
方法计算每个月的平均股价。我们还选择了最近三个月的数据,如下所示:
df_3Months = df.resample(rule='M').mean()[-3:] print(df_3Months)
Output:
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 参数来基于聚合数据创建条形图:
df_3Months.plot(kind='bar', figsize=(10,6), ylabel='Price')
Output:
我们可以通过将 barh 字符串值分配给 kind 参数来创建水平条形图:
df_3Months.plot(kind='barh', figsize=(9,6))
Output:
我们还可以在堆叠的垂直或水平条形图上绘制数据,这些条形图代表不同的组,结果条的高度显示了组的组合结果。要创建堆积条形图,我们需要将 True 分配给堆积参数,如下所示:
df_3Months.plot(kind='bar', stacked=True, figsize=(9,6))
Output:
直方图
直方图是一种表示数值数据分布的条形图,其中 x 轴表示 bin 范围,而 y 轴表示某个区间内的数据频率。
df[['MSFT', 'FB']].plot(kind='hist', bins=25, alpha=0.6, figsize=(9,6))
Output:
在上面的示例中, bins 参数指定 bin 间隔的数量,而 alpha 参数指定透明度。
也可以堆叠直方图:
df[['MSFT', 'FB']].plot(kind='hist', bins=25, alpha=0.6, stacked=True, figsize=(9,6))
Output:
箱形图
箱线图由三个四分位数和两个虚线组成,它们在一组指标中总结数据:最小值、第一四分位数、中位数、第三四分位数和最大值。
箱线图传达的信息非常有用,例如四分位距 (IQR)、中位数和每个数据组的异常值。让我们看看它是如何工作的:
df.plot(kind='box', figsize=(9,6))
Output:
我们可以通过将 False 分配给 vert 参数来创建水平箱线图,如水平条形图:
df.plot(kind='box', vert=False, figsize=(9,6))
Output:
面积图
面积图是折线图的扩展,它用颜色填充折线图和 x 轴之间的区域。如果在同一个图中显示了多个面积图,则不同的颜色可以区分不同的面积图:
df.plot(kind='area', figsize=(9,6))
Output:
Pandas plot() 方法默认创建堆积面积图,通过将 False 分配给堆叠参数来取消堆叠面积图是一项常见任务:
df.plot(kind='area', stacked=False, figsize=(9,6))
Output:
饼图
如果我们对比率感兴趣,饼图是列中数值数据的一个很好的比例表示。以下示例显示了过去三个月的平均 Apple 股票价格分布:
df_3Months.index=['March', 'April', 'May'] df_3Months.plot(kind='pie', y='AAPL', legend=False, autopct='%.f')
Output:
默认情况下,图例将显示在饼图上,因此我们将 False 分配给 legend 关键字以隐藏图例。
上面代码中的新关键字参数是 autopct,它在饼图切片上显示百分比值。
如果我们想将多个饼图中所有列的数据表示为子图,我们可以将 True 分配给 subplots 参数,如下所示:
df_3Months.plot(kind='pie', legend=False, autopct='%.f', subplots=True, figsize=(14,8))
Output:
散点图
散点图在 x 和 y 轴上绘制数据点以显示两个变量之间的相关性。像这样:
df.plot(kind='scatter', x='MSFT', y='AAPL', figsize=(9,6), color='Green')
Output:
正如我们在上图中看到的,散点图显示了微软和苹果股价之间的关系。
六边形图
当数据非常密集时,六边形 bin 图(也称为 hexbin 图)可以替代散点图。换句话说,当数据点的数量很大,并且每个数据点不能单独绘制时,最好使用这种以蜂窝形式表示数据的绘图。此外,每个 hexbin 的颜色定义了该范围内数据点的密度。
df.plot(kind='hexbin', x='MSFT', y='AAPL', gridsize=10, figsize=(10,6))
Output:
gridsize 参数指定 x 方向上六边形的数量,较大的网格尺寸意味着更多和更小的箱,gridsize 参数的默认值为 100。
KDE 绘图
我们要讨论的最后一个图是核密度估计,也称为 KDE,它可视化连续和非参数数据变量的概率密度。该图使用高斯核在内部估计概率密度函数 (PDF):
df.plot(kind='kde')
Output:
我们还可以指定影响 KDE 绘图中绘图平滑度的带宽,如下所示:
df.plot(kind='kde', bw_method=0.1)
Output:
df.plot(kind='kde', bw_method=1)
Output:
正如我们所见,选择较小的带宽会导致平滑不足,这意味着密度图显示为单个峰值的组合。相反,巨大的带宽会导致过度平滑,这意味着密度图表现为单峰分布。
好啦,这就是今天分享的全部内容,喜欢就点个赞吧~