• 美化Matplotlib的3个小技巧


    Matplotlib是Python的数据可视化库的基础。它是其他可视化工具(如Seaborn)的基础。

    Matplotlib提供了很大的灵活性,因此您可以自定义或调整几乎所有的图表。但是想要完全控制可视化就需要编写更多的代码。

    在本文中,我们将介绍3个可以用于定制Matplotlib图表的技巧:

    • 减少x轴或y轴上的刻度数
    • 添加一个辅助y轴
    • 共享x轴的子图坐标对齐

    本文中我们将使用折线图为例,但这些技巧也可以应用于其他类型的图。我创建了一个数据集模拟价格和销售数据。

     import pandas as pd
     import numpy as np
     df = pd.read_csv("mock_sales_data.csv", nrows=100)
     df.head()
    
    • 1
    • 2
    • 3
    • 4

    数据包含日期、价格和销售数量列。只显示了数据集的前100行。

    减少刻度数

    如果在轴上绘制的数据点数量很多,刻度看起来非常的紧凑,甚至可能重叠。在处理时间序列数据时,x轴通常包含占用大量空间的日期,所以可以减少轴上的刻度数来提高显示效果。

    让我们先做一个不限制x轴刻度数的例子。

     import matplotlib.pyplot as plt
     plt.style.use("seaborn-darkgrid")
     
     plt.figure(figsize=(12, 6))
     plt.plot(df["Date"], df["Price"])
     plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    可以看到X轴的刻度重叠并且根本无法显示完整。下面我们添加设置只显示部分的刻度,这样可以完整显示。

     plt.figure(figsize=(12, 6))
     plt.plot(df["Date"], df["Price"])
     #每15个刻度显示一次
     plt.xticks(np.arange(0, len(df), 15), fontsize=12)
     plt.yticks(fontsize=12)
     
     plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    我们使用NumPy的arange函数来指定标记的位置,现在看起来好多了。

    使用辅助轴

    如果想在同一个图上显示两个变量。例如将产品的价格和销售数量绘制在一起查看价格对销售数量的影响。

    我们的DataFrame中的销售数量和价格列显示在同一线图上,只有一个y轴。

    可以看到价格和销售数量的取值范围差距很大我们几乎看不到销售的变化,这时可以使用辅助轴来指定另外一条线的取值范围。

     fig, ax1 = plt.subplots(figsize=(12,6))
     ax2 = ax1.twinx()
     
     ax1.plot(df["Date"], df["Price"])
     ax2.plot(df["Date"], df["SalesQty"], color="orange")
     ax1.set_ylabel("Price", fontsize=15)
     ax2.set_ylabel("SalesQty", fontsize=15)
     ax1.tick_params(axis='both', which='major', labelsize=12)
     ax2.tick_params(axis='both', which='major', labelsize=12)
     
     plt.xticks(np.arange(0, len(df), 15))
     ax1.grid(False)
     ax2.grid(False)
     
     plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    看起来好多了。我们可以清楚的观察到价格与销售量之间的反比关系。

    共享x轴的子图坐标对齐

    我们可以在一个Figure对象上创建多个子图。Matplotlib允许使用subplot函数创建子图格。例如下面的代码行创建了一个包含4个子图的2x2网格图。

     fig, (ax1, ax2, ax3, ax4) = plt.subplots(nrows=2, ncols=2)
    
    • 1

    使用nrows和ncols参数自定义网格的大小。

    如果我们想在2个子图中共享X轴怎么办呢?我们可以使用tight_layout函数。它可以用于调整子图之间的填充

     fig, (ax1, ax2) = plt.subplots(
         nrows=2, ncols=1, 
         sharex=True,
         figsize=(12, 8)
     )
     fig.tight_layout(pad=2)
     
     ax1.plot(df["Date"], df["Price"])
     ax1.set_title("Price", fontsize=15)
     
     ax2.plot(df["Date"], df["SalesQty"])
     ax2.set_title("SalesQty", fontsize=15)
     
     ax1.tick_params(axis='both', which='major', labelsize=12)
     ax2.tick_params(axis='both', which='major', labelsize=12)
     plt.xticks(np.arange(0, len(df), 15), fontsize=12)
     plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    可以看到2个子图的X轴坐标(日期)都已经对齐了,这对于分析时间序列时非常有用的,例如想对比2个产品或者2个不同的门店在同一时期的销售情况,通过对齐日期可以给出非常好的直观判断。

    以上就是3个Matplotlib可视化的小技巧,这些技巧肯定会帮助你创建信息更丰富、功能更强大的数据可视化图表。

    https://avoid.overfit.cn/post/bbb257b59ecc410c9611f2be2473b83d

    作者:Soner Yıldırım

  • 相关阅读:
    如何在线批量将PDF转换成JPG格式
    【Essential C++学习笔记】第四章 基于对象的编程风格
    MAC执行graalvm并编译
    java EE初阶 — volatile关键字保证内存可见性
    Ceres学习笔记002--使用Ceres求解Powell方程
    基于单片机教室人数实时检测系统仿真及源程序
    华为海思校园招聘-芯片-数字 IC 方向 题目分享——第四套
    springboot实战(九)之全局异常捕获&异常统一处理
    独立成分分析matlab代码
    【JVM笔记】同步控制字节码指令
  • 原文地址:https://blog.csdn.net/m0_46510245/article/details/126902229