DataSpell 2025.2 Help

使用 matplotlib 可视化数据

在本教程中,您将学习如何使用 Matplotlib 库来可视化数据。 在学习过程中,您将执行以下任务:

  • 找出 2003-2016 年间延误和取消航班比例最高的美国机场。

  • 查看这些比例随时间的变化情况。

  • 突出一些总体趋势。

先决条件

在开始之前,请确保:

  • 您已安装 DataSpell。 本教程是在 DataSpell 2023.3 中创建的。

  • 您的计算机上已安装 Python 3.6 或更新版本。 如果您使用的是 macOS 或 Linux,您的计算机已经安装了 Python。 您可以从 python.org 获取 Python。

准备一个示例

如果您已完成 上一个教程 ,请直接继续到 转换数据。 否则,请下载数据集并按照 将数据附加到工作区 部分的描述将其添加到 DataSpell 工作区。

在本教程中,我们将使用 "2003-2016 年航空延误" 数据集,由 Priank Ravichandar 提供,并根据 CC0 1.0 授权。 此数据集包含 2003-2016 年美国机场航班延误和取消的信息。

您应该有一个包含以下单元格的笔记本:

import pandas as pd # Read file data = pd.read_csv('airlines.csv')

您还可以下载完整的笔记本并将其添加到您的 DataSpell 工作区: ds_visualize_tutorial.ipynb

转换数据

我们的第一个目标是找到延误和取消航班比例最高的机场。 为此,我们只需要以下列:

  • Airport.Code

  • Statistics.Flights.Total (航班总数)

  • Statistics.Flights.Delayed (延误航班数)

  • Statistics.Flights.Cancelled (取消航班数)

  1. 让我们从 data DataFrame 中选择所需的列,并通过在第一个单元格中添加以下代码将它们放入 airport_data 中:

    # Select required columns airport_data = data[['Airport.Code', 'Statistics.Flights.Total', 'Statistics.Flights.Delayed', 'Statistics.Flights.Cancelled']] # View DataFrame airport_data

    运行单元格后,按下 Ctrl+Enter 或点击 运行全部 ,您将在输出中看到以下内容:

    新创建的 DataFrame 的输出
  2. 向下滚动行。 您会看到每一行都包含一个特定机场一个月的数据。 我们需要整个时期的统计数据,因此让我们按机场代码对数据进行分组并汇总值:

    # Group data by airport code and summarize the values airport_data = airport_data.groupby('Airport.Code').sum()

    以下是单元格的完整代码:

    import pandas as pd # Read file data = pd.read_csv('airlines.csv') # Select required columns airport_data = data[['Airport.Code', 'Statistics.Flights.Total', 'Statistics.Flights.Delayed', 'Statistics.Flights.Cancelled']] # Group data by airport code and summarize the values airport_data = airport_data.groupby('Airport.Code').sum() # View DataFrame airport_data

    ... 以及其输出:

    分组和汇总的 DataFrame 的输出

在继续之前,让我们创建另一个代码单元格。 点击笔记本工具栏中的 在下方添加代码单元

在下方添加一个代码单元格

我们将通过延误和取消航班的比例来比较机场。 看起来我们应该向 DataFrame 添加一些数据。

  1. 让我们创建两个新列: Ratio Delayed.TotalRatio.Cancelled Total。 这些列中的数据将通过计算得出。 引入变量是为了提高代码的可读性:

    # Assign variables delayed = airport_data['Statistics.Flights.Delayed'] cancelled = airport_data['Statistics.Flights.Cancelled'] total = airport_data['Statistics.Flights.Total'] # Create new columns and fill them with values airport_data['Ratio Delayed.Total']= delayed / total airport_data['Ratio Cancelled.Total']= cancelled / total # View DataFrame airport_data
  2. 运行该单元格以确保已向 DataFrame 添加了两个列。 为此,请按 Ctrl+Enter 或点击 运行全部

    DataFrame 中的两个附加列

可视化数据

让我们开始以柱状图的形式可视化我们新创建的 airport_data DataFrame。

您需要将 import matplotlib.pyplot as plt 添加到第一个代码单元格的开头。 编辑后不要忘记重新运行该单元格,例如,点击 运行单元格并选择下面的内容运行单元格并选择下一个 或按下 Shift+Enter

创建一个柱状图

  1. 首先,让我们通过使用 sort_values 方法对 airport_data 中的行进行排序,以提高未来图表的可读性:

    airport_data = airport_data.sort_values(by='Ratio Delayed.Total', ascending=False)
  2. 现在分配变量:

    airport_code = airport_data.index delayed = airport_data['Ratio Delayed.Total'] cancelled = airport_data['Ratio Cancelled.Total']

    请注意,当我们创建 airport_data DataFrame 时, Airport.Code 列成为了索引列。 这意味着机场代码在此 DataFrame 中用作行地址,您不需要指定列名来读取它们。

  3. 以下代码创建了一个具有特定宽度和高度(以英寸为单位)的图形,以及一个 Matplotlib Axes。 它们将包含未来柱状图的所有元素。

    fig, ax = plt.subplots(figsize=(15,5))
  4. 要绘制柱状图,请使用 bar() 方法。 它接受 x 和 y 坐标作为前两个位置参数。 标签将用于渲染图例。

    ax.bar(airport_code, delayed[airport_code], bottom=cancelled[airport_code], label='Delayed') ax.bar(airport_code, cancelled[airport_code], label='cancelled')

    在绘制第一个柱状图时,我们使用了一个额外的 bottom 参数,将延误柱堆叠在取消柱的顶部。

  5. 设置轴标签、图表标题,并显示图例:

    ax.set_xlabel('Airport codes') ax.set_ylabel('Ratio') ax.set_title('Ratio of delayed and cancelled flights to total flights') ax.legend()
  6. 最后,使用 plt.show() 渲染整个内容。 这是单元格的完整代码:

    # Sort DataFrame rows airport_data = airport_data.sort_values(by='Ratio Delayed.Total', ascending=False) # Assign variables airport_code = airport_data.index delayed = airport_data['Ratio Delayed.Total'] cancelled = airport_data['Ratio Cancelled.Total'] # Create a figure and set its size to 15x5 in. fig, ax = plt.subplots(figsize=(15,5)) # Plot bar charts ax.bar(airport_code, delayed[airport_code], bottom=cancelled[airport_code], label='Delayed') ax.bar(airport_code, cancelled[airport_code], label='cancelled') # Add axes labels and title ax.set_xlabel('Airport codes') ax.set_ylabel('Ratio') ax.set_title('Ratio of delayed and cancelled flights to total flights') # Show legend ax.legend() # Show plot plt.show()

    结果如下:

    延误和取消比例的柱状图

您可以看到延误航班比例最高的是纽瓦克自由国际机场(EWR)。 让我们继续研究该机场的数据。 找出取消和延误航班数量随时间的变化会很有趣。

创建一条折线图

  1. 让我们从数据集中选择必要的数据开始:

    ewr_data = data[data['Airport.Code']=='EWR']

    这段代码可以翻译为“从 data 中选择在 Airport.Code 列中具有 EWR 的行,并将它们放入 ewr_data DataFrame”。

  2. 分配变量:

    date = ewr_data['Time.Label'] delayed = ewr_data['Statistics.Flights.Delayed'] cancelled = ewr_data['Statistics.Flights.Cancelled']
  3. 再次创建一个图形和一个 Axes

    fig, ax = plt.subplots(figsize=(15,5))
  4. 对于折线图,请使用 plot() 方法:

    ax.plot(date, delayed, label='Delays') ax.plot(date, cancelled, label='Cancellations')
  5. 添加轴标签、标题和图例:

    ax.set_xlabel('Year/Month') ax.set_ylabel('Flights (delayed/cancelled)') ax.set_title('Cancellations and delays in EWR 2003-2016') ax.legend()
  6. 以下是用于复制粘贴的完整代码单元格:

    # Select rows with 'EWR' in the first column ewr_data = data[data['Airport.Code']=='EWR'] # Assign variables date = ewr_data['Time.Label'] delayed = ewr_data['Statistics.Flights.Delayed'] cancelled = ewr_data['Statistics.Flights.Cancelled'] # Create a figure and set its size to 15x5 in. fig, ax = plt.subplots(figsize=(15,5)) # Plot line charts ax.plot(date, delayed, label='Delays') ax.plot(date, cancelled, label='Cancellations') # Add axes labels ax.set_xlabel('Year/Month') ax.set_ylabel('Flights (delayed/cancelled)') # Add title and legend ax.set_title('Cancellations and delays in EWR 2003-2016') ax.legend() # Show plot plt.show()

    输出如下:

    EWR 的延误和取消的折线图

    x 轴上的刻度太多。 要仅显示每第 12 个刻度,请在 plt.show() 之前添加以下行:

    ax.set_xticks(date[::12])

    现在看起来更好了:

    EWR 的延误和取消的折线图

正如您所见,取消航班的数量随时间变化不大。 但在 2009 年底,延误航班的数量明显下降。 他们是否雇用了新经理? 或者这可能与航班总数有关? 让我们检查一下!

显示更多数据

  1. 我们将添加另一条显示航班总数的折线图。 但这些数字远大于延误的数量。 解决方案是添加另一个 Axes ,它将共享相同的 x 轴,但有自己的 y 轴。 这可以通过使用 twinx() 方法来完成:

    total = ewr_data['Statistics.Flights.Total'] ax2=ax.twinx() ax2.plot(date, total, '--', color='g', label='Total flights') ax2.set_ylabel('Flights (total)') ax2.legend(loc='upper center')

    注意 plot() 方法的第三个位置参数。 虚线将生成一条虚线。 颜色也是可自定义的。 我们还指定了图例的位置,以免与另一个图例冲突。

  2. 完整代码如下:

    # Select rows with 'EWR' in the first column ewr_data = data[data['Airport.Code']=='EWR'] # Assign variables date = ewr_data['Time.Label'] delayed = ewr_data['Statistics.Flights.Delayed'] cancelled = ewr_data['Statistics.Flights.Cancelled'] total = ewr_data['Statistics.Flights.Total'] # Create a figure and set its size to 15x5 in. fig, ax = plt.subplots(figsize=(15,5)) # Plot line charts ax.plot(date, delayed, label='Delays') ax.plot(date, cancelled, label='Cancellations') # Add axes labels ax.set_xlabel('Year/Month') ax.set_ylabel('Flights (delayed/cancelled)') # Add title and legend ax.set_title('Cancellations and delays in EWR 2003-2016') ax.legend() # Decrease the density of ticks on x-axis ax.set_xticks(date[::12]) # Plot another chart with extra y-axis ax2=ax.twinx() ax2.plot(date, total, '--', color='g', label='Total flights') ax2.set_ylabel('Flights (total)') # Add legend in center ax2.legend(loc='upper center') # Show plot plt.show()

    图表如下:

    延误、取消和航班总数的折线图

所以,没有什么神奇的。 2008 年中期航班总数显著减少,这自然导致了延误的减少。

继续研究

2008 年发生了什么? 航班数量是否仅在 EWR 减少? 让我们通过分析整个数据集来找出答案。

现在我们只对日期和数字感兴趣。 让我们按时间标签(YYYY/MM 格式)对 data DataFrame 的行进行分组,然后汇总值。 某些列中会有无效值(例如 Time.MonthTime.Year ),但我们不会使用它们。 其余部分与之前教程的步骤类似:

# Group data by date and summarize the values monthly_data = data.groupby('Time.Label').sum() # Assign variables date = monthly_data.index # Date total = monthly_data['Statistics.Flights.Total'] # Total number of flights # Create a figure and set its size to 15x5 in. fig, ax = plt.subplots(figsize=(15,5)) # Plot a line chart ax.plot(date, total) # Decrease the density of ticks on x-axis ax.set_xticks(date[::12]) # Add title and axes labels ax.set_title('Total number of flights in US airports 2003-2016') ax.set_xlabel('Year/Month') ax.set_ylabel('Flights') # Show plot plt.show()

是的,美国所有机场的航班总数确实有所下降:

2003-2016 年美国机场的航班总数

说到下降,您是否注意到图表上那些周期性的负峰值? 似乎它们每年都会重复。 让我们绘制一张图表,看看全年航班总数的变化情况。

这次我们将按月份名称对数据进行分组。 sort_values(by='Time.Month') 部分用于按时间顺序排列月份:

# Group data by month, summarize values, and place months in correct order seasonal_data = data.groupby('Time.Month Name').sum().sort_values(by='Time.Month') # Assign variables month = seasonal_data.index total = seasonal_data['Statistics.Flights.Total'] # Create a figure and set its size to 15x5 in. fig, ax = plt.subplots(figsize=(15,5)) # Plot a line chart ax.plot(month, total) # Add title and axes labels ax.set_title('Total number of flights in US airport throughout the year') ax.set_xlabel('Month') ax.set_ylabel('Flights') # Disable scientific notation for y-axis ax.ticklabel_format(axis='y', style='plain') # Show plot plt.show()

毫无疑问,二月是美国民航的淡季:

全年美国机场的航班总数

创建报告

完成后,您可以将笔记本导出为 PDF 报告。 为此,请点击工具栏上的 导出为 PDF 图标导出为 PDF ,然后从列表中选择 整个 Notebook

导出操作

摘要

您已完成 matplotlib 可视化教程。 以下是您完成的内容:

  • 选择了必要的数据并进行了转换

  • 绘制了柱状图和折线图

  • 发现了统计趋势

  • 已创建报告

最后修改日期: 2025年 9月 27日