我如何在 pandas 中创建图表?#

../../_images/04_plot_overview.svg
In [1]: import pandas as pd

In [2]: import matplotlib.pyplot as plt
Data used for this tutorial:
  • 在本教程中,使用了关于 \(NO_2\) 的空气质量数据,这些数据由 OpenAQ 提供,并使用了 py-openaq 包。air_quality_no2.csv 数据集提供了测量站 FR04014BETR801London Westminster 分别在巴黎、安特卫普和伦敦的 \(NO_2\) 值。

    To raw data
    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=0parse_dates=True 参数分别将第一(0th)列定义为结果 DataFrame 的索引,并将列中的日期转换为 Timestamp 对象。

  • 我想快速直观地检查数据。

    In [5]: air_quality.plot()
    Out[5]: <Axes: xlabel='datetime'>
    
    In [6]: plt.show()
    
    savefig/04_airqual_quick.png

    使用 DataFrame ,pandas 默认会为每列具有数值数据的列创建一个线图。

  • 我只想绘制来自巴黎的数据表的列。

    In [7]: air_quality["station_paris"].plot()
    Out[7]: <Axes: xlabel='datetime'>
    
    In [8]: plt.show()
    
    savefig/04_airqual_paris.png

    要绘制特定列,请结合使用 子集数据教程 中的选择方法与 plot() 方法。因此,plot() 方法适用于 SeriesDataFrame

  • 我想直观地比较在伦敦和巴黎测量的 \(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()
    
    savefig/04_airqual_scatter.png

除了使用 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()
savefig/04_airqual_boxplot.png
To user guide

有关除默认线图之外的其他图表介绍,请参阅用户指南中关于 支持的图表样式 的部分。

  • 我希望每一列都在一个单独的子图中。

    In [14]: axs = air_quality.plot.area(figsize=(12, 4), subplots=True)
    
    In [15]: plt.show()
    
    savefig/04_airqual_area_subplot.png

    每个数据列的单独子图可以通过 plot 函数的 subplots 参数来支持。每个 pandas 绘图函数中可用的内置选项值得回顾。

To user guide

一些更多的格式化选项在用户指南的 绘图格式化 部分有解释。

  • 我想进一步自定义、扩展或保存生成的图表。

    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()
    
    savefig/04_airqual_customized.png

每个由 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 对象。

To user guide

可视化页面 中提供了 pandas 绘图的全面概述。