我如何在 pandas 中创建图表?#
In [1]: import pandas as pd
In [2]: import matplotlib.pyplot as plt
- Air quality data
在本教程中,使用了关于 \(NO_2\) 的空气质量数据,这些数据由 OpenAQ 提供,并使用了 py-openaq 包。
To raw dataair_quality_no2.csv
数据集提供了测量站 FR04014、BETR801 和 London Westminster 分别在巴黎、安特卫普和伦敦的 \(NO_2\) 值。In [3]: air_quality = pd.read_csv("data/air_quality_no2.csv", index_col=0, parse_dates=True) In [4]: air_quality.head() Out[4]: station_antwerp station_paris station_london datetime 2019-05-07 02:00:00 NaN NaN 23.0 2019-05-07 03:00:00 50.5 25.0 19.0 2019-05-07 04:00:00 45.0 27.7 19.0 2019-05-07 05:00:00 NaN 50.4 16.0 2019-05-07 06:00:00 NaN 61.9 NaN
备注
传递给
read_csv
函数的index_col=0
和parse_dates=True
参数分别将第一(0th)列定义为结果DataFrame
的索引,并将列中的日期转换为Timestamp
对象。
我想快速直观地检查数据。
In [5]: air_quality.plot() Out[5]: <Axes: xlabel='datetime'> In [6]: plt.show()
使用
DataFrame
,pandas 默认会为每列具有数值数据的列创建一个线图。
我只想绘制来自巴黎的数据表的列。
In [7]: air_quality["station_paris"].plot() Out[7]: <Axes: xlabel='datetime'> In [8]: plt.show()
要绘制特定列,请结合使用 子集数据教程 中的选择方法与
plot()
方法。因此,plot()
方法适用于Series
和DataFrame
。
我想直观地比较在伦敦和巴黎测量的 \(NO_2\) 值。
In [9]: air_quality.plot.scatter(x="station_london", y="station_paris", alpha=0.5) Out[9]: <Axes: xlabel='station_london', ylabel='station_paris'> In [10]: plt.show()
除了使用 plot
函数时的默认 line
绘图外,还有许多其他绘图选项可供使用。让我们使用一些标准的 Python 来概览可用的绘图方法:
In [11]: [
....: method_name
....: for method_name in dir(air_quality.plot)
....: if not method_name.startswith("_")
....: ]
....:
Out[11]:
['area',
'bar',
'barh',
'box',
'density',
'hexbin',
'hist',
'kde',
'line',
'pie',
'scatter']
备注
在许多开发环境如 IPython 和 Jupyter Notebook 中,使用 TAB 键来获取可用方法的概览,例如 air_quality.plot.
+ TAB。
其中一个选项是 DataFrame.plot.box()
,它指的是一个 箱线图 。box
方法适用于空气质量示例数据:
In [12]: air_quality.plot.box()
Out[12]: <Axes: >
In [13]: plt.show()
有关除默认线图之外的其他图表介绍,请参阅用户指南中关于 支持的图表样式 的部分。
我希望每一列都在一个单独的子图中。
In [14]: axs = air_quality.plot.area(figsize=(12, 4), subplots=True) In [15]: plt.show()
每个数据列的单独子图可以通过
plot
函数的subplots
参数来支持。每个 pandas 绘图函数中可用的内置选项值得回顾。
一些更多的格式化选项在用户指南的 绘图格式化 部分有解释。
我想进一步自定义、扩展或保存生成的图表。
In [16]: fig, axs = plt.subplots(figsize=(12, 4)) In [17]: air_quality.plot.area(ax=axs) Out[17]: <Axes: xlabel='datetime'> In [18]: axs.set_ylabel("NO$_2$ concentration") Out[18]: Text(0, 0.5, 'NO$_2$ concentration') In [19]: fig.savefig("no2_concentrations.png") In [20]: plt.show()
每个由 pandas 创建的绘图对象都是一个 Matplotlib 对象。由于 Matplotlib 提供了许多自定义绘图的选项,使得 pandas 和 Matplotlib 之间的联系明确,可以利用 Matplotlib 的所有功能进行绘图。这种策略在前面的例子中得到了应用:
fig, axs = plt.subplots(figsize=(12, 4)) # Create an empty Matplotlib Figure and Axes
air_quality.plot.area(ax=axs) # Use pandas to put the area plot on the prepared Figure/Axes
axs.set_ylabel("NO$_2$ concentration") # Do any Matplotlib customization you like
fig.savefig("no2_concentrations.png") # Save the Figure/Axes using the existing Matplotlib method.
plt.show() # Display the plot
REMEMBER
.plot.*
方法适用于 Series 和 DataFrames。默认情况下,每一列都绘制为不同的元素(线、箱线图等)。
由 pandas 创建的任何图表都是 Matplotlib 对象。
在 可视化页面 中提供了 pandas 绘图的全面概述。