从入门到放弃:python数据分析系列-matplotlib

开始之前,请配置好python环境,同时检查是否安装了第三方库:matplotlib。
本文是博主的学习笔记,有不足之处还请指出。

1. matplotlib库的介绍

1.1 matplotlib库的介绍

matplotlib库是一个数据可视化的一个第三方库,它包含了过百种图像。它结合matlab的优缺点,在此基础上形成了matplotlib。matplotlib由各种可视化类构成,内部结构复杂。因此,我们可以通过matplotlib的一个命令子库matplotlib.pyplot来调用这些基本功能。
一般,我们引用pyplot子库的方式为:

import matplotlib.pyplot as plt

1.2 牛刀小试

我们先画一个简单的图像:

    import matplotlib.pyplot as plt
    
    
    plt.plot([1,2,3,7,4,2])      # 传入xy轴参数,默认为y轴
    plt.ylabel("Grade")          # 指定y轴 名称
    plt.savefig("test",dpi=600)  # 保存图像 默认png格式,其中dpi指图片质量
    plt.show()                   # 展示图片

效果如下:
折线图

1.3 pyplot的绘图区域

pyplot通过plt.subplot(nrows,ncols,plot_number)方法来实现在同一画板上画多幅子图。参数介绍如下:

  • nrows:横向数量
  • ncols:纵向数量
  • plot_number:当前子图的区域位置。
    如plt.subplot(2,2,3)就是表示将将一个全局绘图区域分成4个子区域,当前子图位于第3个子图位置。当子图数量为个位数时,subplot()内参数可以不用逗号分隔,即subplot(223)。
    在这里插入图片描述

1.4 pyplot的plot()绘图函数

plot是matplotlib中最主要的绘图函数,其全部参数介绍如下:
plt.plot(x,y,format_string,**kwargs)

  • x: x轴的数据,可以是列表或数组,是一个可选参数
  • y:y轴的数据,可以是列表或数组,必选。
  • **kwargs:可以是第二条曲线的参数,需要注意的是,当绘制多条曲线时,xy参数都必须存在;也可以是color、linestyle、marker等等

下面仔细讲解一下format_string参数:
format_string参数是控制曲线格式的字符串,虽然是可选参数,但是却非常重要。它由颜色字符、风格字符和标记字符组成,可以组合使用。

(1)颜色字符,即控制曲线颜色的字符,由于控制颜色的字符较多,这里就仅列出一些常用的字符:

  • b: 蓝色
  • g: 绿色
  • r: 红色
  • k: 黑色
  • w: 白色
  • y: 黄色
  • c: 青绿色
  • m: 洋红色
  • #000000: 此外还可以使用rgb颜色

(2)风格字符,即控制曲线样式的字符:

  • “_”:实线
  • “–”: 破折线
  • “:”: 虚线
  • " ": 无线条

(3)标记字符:即对数据坐标点的标记:

  • " .": 点标记
  • " ,": 像素标记
  • " v": 倒三角标记
  • " ^": 上三角标记
  • " >": 右三角标记
  • " <": 左三角标记
  • " 1": 下花三角标记
  • " 2": 上花三角标记
  • " 3": 左花三角标记
  • " 4": 右花三角标记
  • " s": 实心方形标记
  • " p": 实心五角标记
  • " *": 星号标记
  • " o": 实心圈标记
  • " +": +号标记
  • " x": x号标记
  • " D": 菱形标记
    import matplotlib.pyplot as plt
    import numpy as np
    
    
    a = np.arange(20)
    
    plt.plot(a,a,"r--o",a,a*2,"b:",a,a*3,"y_")
    plt.savefig("01",dpi=600)
    plt.show()

图像如下:
在这里插入图片描述

1.5 pyplot的中文显示

pyplot默认不支持中文显示,因此我们需要对其进行一下代码设置(如果不设置,输出时是一些空心的方形)。
更改字体的方法有两种,我们先来看一下第一种:

(1)通过rcparams更改全局字体
先看一下如果不进行中文设置,会是什么效果,如图

import matplotlib.pyplot as plt
import numpy as np


a = np.arange(20)

plt.plot(a,np.cos(0.02*a))
plt.xlabel("这是中文")
plt.savefig("03",dpi=600)
plt.show()

效果如下:
在这里插入图片描述

可以发现,x轴的标志是一个个的方形。接下来我们引入matplotlib的rcparams来设置全局字体属性:

    import matplotlib.pyplot as plt
    import numpy as np
    import matplotlib
    
    
    matplotlib.rcParams["font.family"] = "SimHei"   # 设置字体为黑体
    a = np.arange(20)
    
    plt.plot(a,np.cos(0.02*a))
    plt.xlabel("这是中文")
    plt.savefig("03",dpi=600)
    plt.show()

图像如下:
在这里插入图片描述

可以发现,中文可以显示出来了。除了可以设置字体类型,它还有如下属性:

  • font.style:字体风格(正常normal或斜体italic)
  • font.size: 字体大小

但是,细心观察,无论是x轴的标志还是xy轴的尺度,它们的字体全部都变为了黑体。这对全局来说很不友好,因此,我们可以对显示中文的地方单独进行设置。即第二种方法,如下:

(2)通过fontproperties参数单独设置字体:


    import matplotlib.pyplot as plt
    import numpy as np
    import matplotlib
    
    
    # matplotlib.rcParams["font.family"] = "SimHei"   # 设置字体为黑体
    a = np.arange(20)
    
    plt.plot(a,np.cos(0.02*a))
    plt.xlabel("这是中文",fontproperties="SimHei",fontsize=20)
    plt.savefig("03",dpi=600)
    plt.show()

图像的输出效果如下:

在这里插入图片描述
通过fontproperties参数我们可以方便的对所需文本进行设置,使得绘图更加灵活。

1.6 pyplot的文本显示

文本显示就是为图像添加坐标轴、图例、标题和文本注释等内容,从而使图像更加专业化。同时支持LaTeX语法,使其更加具有专业性。前面我们使用plt.xlabel()来对x轴添加文本标签,就是文本显示函数之一,全部的文本显示标签如下:

  • plt.xlabel():对x轴添加文本标签
  • plt.ylabel():对y轴添加文本标签
  • plt.tilte():对图像添加标题,位于图像上方中间位置
  • plt.text():在任意位置添加文本注释
  • plt.annotate():在图像中添加带有箭头的注解
    import matplotlib.pyplot as plt
    import numpy as np
    
    
    a = np.arange(0, 5, 0.02)
    plt.plot(a,np.cos(2*np.pi*a), "r--")
    
    plt.xlabel("时间",fontproperties="SimHei",fontsize=18,color="yellow")
    plt.ylabel("振幅",fontproperties="SimHei",fontsize=18,color="green")
    plt.title(r"正弦波图 $y=cos(2\pi x)$",fontproperties="SimHei",fontsize=26)
    plt.text(2,1,r"$\mu=100$",fontsize="15")
    
    plt.axis([-1,6,-2,2])  # x轴坐标尺度
    plt.grid(True)         # 显示网格
    plt.savefig("04",dpi=600)

图像如下:
在这里插入图片描述

我们再来看一下plt.annotate()函数,它的参数如下:

  • s: 注释文本内容
  • xy=arrow_crd: 箭头指向的位置
  • xytext=text_crd: 文本所在位置
  • arrowprops=dict: 文本属性

我们将上面的实例修改一下:

    import matplotlib.pyplot as plt
    import numpy as np
    
    
    a = np.arange(0, 5, 0.02)
    plt.plot(a,np.cos(2*np.pi*a), "r--")
    
    plt.xlabel("时间",fontproperties="SimHei",fontsize=18,color="yellow")
    plt.ylabel("振幅",fontproperties="SimHei",fontsize=18,color="green")
    plt.title(r"正弦波图 $y=cos(2\pi x)$",fontproperties="SimHei",fontsize=22)
    # plt.text(2,1,r"$\mu=100$",fontsize="15")
    plt.annotate(r"$\mu=100$",xy=(2,1),xytext=(3,1.5),arrowprops=dict(facecolor="black",shrink=0.1,width=2))
    plt.axis([-1,6,-2,2])  # x轴坐标尺度
    plt.grid(True)         # 显示网格
    plt.savefig("04",dpi=600)
    plt.show()

图像如下

在这里插入图片描述

1.7 pyplot的子绘图区域

前面我们提到通过subplot函数来绘制多规则的子图区域,但如果我们希望在区域中绘制不规则的图像应该怎样处理呢?这里提供一个plt.subplot2grid()函数,用于设计复杂的子图结构。通过设计网格、选中网格,确定选中的行列并进行延伸扩展从而形成我们想要的区域。其参数如下:

  • gridspec:设定网格结构
  • curspec: 选定网格初始位置
  • colspan: 网格扩展列数(以当前为基准)
  • rowspan:网格扩展行数(以当前为基准)

我们借助图像来进行理解:
plt.subplot((4,4)(2,0),colspan=3,rowspan=2)就是把绘图区域分成4*4个区域,然后以第3行第一列子区域(黑色)为基准,扩展2 列1行(灰色),即红色区域为但覆盖前子图区域,如图:
在这里插入图片描述

以上方法在绘图时有较为复杂的代码,因此,matplotlib为我们提供了另外一个较为简单的设计复杂子图的库gridspec(),我们通过代码及图像进行讲解;
如图,若要选中灰色及黑色部分作为一个子图区域,我们可以这样做:

    import matplotlib.pyplot as plt
    from matplotlib import gridspec
    
    gs = gridspec.GridSpec(4,4)
    
    plt.subplot(gs[2:,0:-1])

这非常类似于numpy中二维数组的切片操作。即,在gs二维数组中,我们选择一维中的下标为2及2以后的元素,然后选择二维中下标从0开始至倒数第2个结束的区域。

1.8 关于pyplot基本图表函数

pyplot的基本图表函数有很多很多种,而这些图表有的非常常用、有的很少用到(需要注意的是,少用不等于不重要)。在接下来的内容中博主仅简单介绍部分常用的图表,如若想了解更多的基本图表,可以去matplotlib的官网进行学习。这里提供一下链接:matplotlib官网

1.9 pyplot饼图的绘制

饼图,具有简洁直观的特点,常用于带有百分号的数据。饼图通过plt.pie()绘制:

 import matplotlib.pyplot as plt
    
    
    labels = "a","b","c","d","e","f","g"  # 每一块的标签
    sizes = [10,20,30,15,15,10,20]        # 每一块饼图的尺寸
    explode = (0,0.1,0,0.5,0,0.2,0)       # 指定哪一块是否突出,以及突出强度
    
    plt.pie(sizes,explode=explode,labels=labels,autopct="%1.1f%%",shadow=True,startangle=90)   # autopct 是百分数的显示格式,shadow是否带有阴影 startangle是饼图的起始角度
    plt.axis("equal")  # 画出图像是正圆形
    plt.show()

图像如下:
在这里插入图片描述

更多信息请看官方pie()文档

1.10 pyplot直方图的绘制

相信大家对直方图都不陌生,那么直方图应该如何绘制呢,我们先来看一段代码:

    import numpy as np
    import matplotlib.pyplot as plt
    
    
    np.random.seed(0)
    mu = 100
    sigma = 200
    a = np.random.normal(mu,sigma,size=100)
    
    plt.hist(a,20,histtype="stepfilled",facecolor="b",alpha=0.75)
    plt.title("直方图",fontproperties="SimHei")
    plt.show()

图像如下:
在这里插入图片描述

我们通过numpy生成一个正太分布的数组a,并利用它绘制直方图。我们绘制直方图使用plt.hist()函数,其中a是传入的数据,第二个参数bin是用于控制图像中直方的个数(这里表示共有20个直方),这里个数划分的方法是从数组中选择最大最小两个值,在其范围内均分为bin个区域。每个bin内元素的个数,就是这个直方的高度。
更多信息请看官方hist()文档

1.11 pyplot散点图的绘制

散点图的绘制我们可以通过plot或scatter,其中scatter散点图的绘制和plot类似。这里不再过多介绍。官方scatter()文档

猜你喜欢

转载自blog.csdn.net/qq_45807032/article/details/107506802