• Python零基础速成班-第16讲-Python for Matplotlib 线图、散点图、柱形图、饼图


    Python零基础速成班-第16讲-Python for Matplotlib 线图、散点图、柱形图、饼图

    学习目标

    1. Matplotlib 线图
    2. Matplotlib 散点图
    3. Matplotlib 柱状图
    4. Matplotlib 饼图
    5. 课后作业(6必做)

    友情提示:将下文中代码拷贝到JupyterNotebook中直接执行即可,部分代码需要连续执行。

    1、Matplotlib 线图

    matplotlib

    1.1 Matplotlib 介绍:

    1. Matplotlib 是 Python 的绘图库,它能让使用者很轻松地将数据图形化,并且提供多样化的输出格式。
    2. Matplotlib 可以用来绘制各种静态,动态,交互式的图表。
    3. Matplotlib 是一个非常强大的 Python 画图工具,我们可以使用该工具将很多数据通过图表的形式更直观的呈现出来。
    4. Matplotlib 可以绘制线图、散点图、等高线图、条形图、柱状图、3D 图形、甚至是图形动画等等。

    1.2 安装并引入Matplotlib 包

    在线安装命令:pip install matplotlib
    清华镜像安装:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple matplotlib
    引入相关包:import matplotlib.pyplot as plt

    1.3 线图:画单线条图

    简单理解,只需要设置X轴和Y轴的数据,就可以画一个最基础的单线条图了,例如我们要绘制坐标 (1, 3) 到 (8, 10) 的线,我们就需要传递两个数组 [1, 8] 和 [3, 10] 给 plot 函数。

    import matplotlib.pyplot as plt
    import numpy as np
    #设置X轴和Y轴数据
    xpoints = np.array([1, 8])
    ypoints = np.array([3, 10])
    #将X轴和Y轴数据放入图中
    plt.plot(xpoints, ypoints)
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    out3

    画单条线图语法

    plot([x], y, [fmt], * , data=None, ** kwargs)
    参数说明:

    • x, y:点或线的节点,x 为 x 轴数据,y 为 y 轴数据,数据可以列表或数组。
    • fmt:可选,定义基本格式(如颜色、标记和线条样式)。
    • ** kwargs:可选,用在二维平面图上,设置指定属性,如标签,线的宽度等。

    [fmt]颜色、线形、标记字符参数

    • 颜色字符:‘b’ 蓝色,‘m’ 洋红色,‘g’ 绿色,‘y’ 黄色,‘r’ 红色,‘k’ 黑色,‘w’ 白色,‘c’ 青绿色,‘#008000’ RGB 颜色符串。多条曲线不指定颜色时,会自动选择不同颜色。
    • 线形字符:‘‐’ 实线,‘‐‐’ 破折线,‘‐.’ 点划线,‘:’ 虚线。
    • 标记字符:‘.’ 点标记,‘,’ 像素标记(极小点),‘o’ 实心圈标记,‘v’ 倒三角标记,‘^’ 上三角标记,‘>’ 右三角标记,‘<’ 左三角标记…等等。
    import matplotlib.pyplot as plt
    import numpy as np
    
    xpoints = np.array([1, 2, 6, 8])
    ypoints = np.array([3, 8, 1, 10])
    
    plt.plot(xpoints, ypoints,'>')
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    ou5

    import matplotlib.pyplot as plt
    import numpy as np
    
    x = np.arange(0,4*np.pi,0.1) # start,stop,step
    y = np.sin(x)
    z = np.cos(x)
    plt.plot(x,y,x,z)
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    ou6

    注意:如果我们不指定 x 轴上的点,则 x 会根据 y 的值来设置为 0, 1, 2, 3…N-1,如下例:

    import matplotlib.pyplot as plt
    import numpy as np
    
    ypoints = np.array([1,3,4,5,8,9,6,1,3,4,5,2,4])
    
    plt.plot(ypoints, marker = 'o')
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    out8

    加入丰富的 fmt 参数

    fmt = “[marker] [line] [color]” 定义了基本格式,如标记、线条样式和颜色。

    import matplotlib.pyplot as plt
    import numpy as np
    
    ypoints = np.array([6, 2, 13, 10])
    # o 代表实心圈  : 代表虚线 r 代表red红色
    plt.plot(ypoints, 'o:r')
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    out10

    标记符号的大小与颜色

    我们可以自定义标记的大小与颜色,使用的参数分别是:
    markersize,简写为 ms:定义标记的大小。
    markerfacecolor,简写为 mfc:定义标记内部的颜色。
    markeredgecolor,简写为 mec:定义标记边框的颜色。

    import matplotlib.pyplot as plt
    import numpy as np
    
    ypoints = np.array([6, 2, 13, 10])
    
    plt.plot(ypoints, marker = 'o', ms = 20, mfc ='g')
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    out12

    Matplotlib 绘图线

    线的类型可以使用 linestyle 参数来定义,简写为 ls。

    类型简写说明
    'solid' (默认)'-'实线
    'dotted'':'点虚线
    'dashed''--'破折线
    'dashdot''-.' 点划线
    'None''' 或 ' '不画线
    线的颜色可以使用 color 参数来定义,简写为 c。当然也可以自定义颜色类型,例如:SeaGreen、#8FBC8F 等,完整样式可以参考 HTML 颜色值。
    颜色标记描述
    'r'红色
    'g'绿色
    'b'蓝色
    'c'青色
    'm'品红
    'y'黄色
    'k'黑色
    'w'白色

    线的宽度 线的宽度可以使用 linewidth 参数来定义,简写为 lw,值可以是浮点数,如:1、2.0、5.67 等。
    import matplotlib.pyplot as plt
    import numpy as np
    
    ypoints = np.array([6, 2, 13, 10])
    
    plt.plot(ypoints, ls = 'dashdot',color = '#8FBC8F',linewidth = '5.5')
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    out16

    1.4 画多条线图

    画多条线图语法

    plot([x], y, [fmt], [x2], y2, [fmt2], …, **kwargs)

    import matplotlib.pyplot as plt
    import numpy as np
    
    x1 = np.array([0, 1, 2, 3])
    y1 = np.array([3, 7, 5, 9])
    x2 = np.array([0, 1, 2, 3])
    y2 = np.array([6, 2, 13, 10])
    
    plt.plot(x1, y1,'o-.r', x2, y2,'LightGreen',linewidth =3)
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    out18

    1.5 轴标签和标题

    • plt.title() 设置标题
    • plt.xlabel() 设置X轴标签
    • plt.ylabel() 设置Y轴标签
    • 轴标签和标题常用的参数有fontproperties设置字体,fontdict设置样式,loc设置位置
    import numpy as np
    import matplotlib.pyplot as plt
    
    x = np.array([1, 2, 3, 4])
    y = np.array([1, 4, 9, 16])
    plt.plot(x, y)
    
    plt.title("title")
    plt.xlabel("x - label")
    plt.ylabel("y - label")
    
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    out20

    注意:Matplotlib 默认情况不支持中文,我们可以通过下面两种方式解决:

    1. 下载某一个字体,将路径添加进配置文件matplotlib.font_manager.FontProperties(fname=“字体路径”),然后在标题、轴标签中通过fontproperties参数设置一下该字体即可。
    2. 直接设置全局字体,如通过plt.rcParams[‘font.family’]=[‘FangSong_GB2312’]将全局字体设置为仿宋_GB2312。

    第1种方式,我们下载一款开源字体《思源黑体》,下载地址 https://source.typekit.com/source-han-serif/cn/ ,下载到D盘根目录,然后引用即可,如下例:

    import numpy as np 
    from matplotlib import pyplot as plt 
    import matplotlib
     
    # fname 为你下载的字体库路径
    zhfont1 = matplotlib.font_manager.FontProperties(fname="D://SourceHanSans-Bold.otf") 
     
    x = np.arange(1,11) 
    y =  2  * x +  5 
    plt.title("思源黑体 - 测试标题", fontproperties=zhfont1) # 设置使用该字体
     
    plt.xlabel("x 轴", fontproperties=zhfont1) # 设置使用该字体
    plt.ylabel("y 轴", fontproperties=zhfont1) # 设置使用该字体
    plt.plot(x,y) 
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    out23

    第2种方式,设置全局字体

    首先我们通过循环查询 Matplotlib 支持可设置的字体。

    from matplotlib import pyplot as plt
    import matplotlib
    
    for i in sorted(set([f.name for f in matplotlib.font_manager.fontManager.ttflist])):
        print(i)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    Windows中我们常用的汉字字体名称为:
    黑体 SimHei
    微软雅黑 Microsoft YaHei
    微软正黑体 Microsoft JhengHei
    新宋体 NSimSun
    新细明体 PMingLiU
    细明体 MingLiU
    标楷体 DFKai-SB
    仿宋 FangSong
    楷体 KaiTi
    仿宋_GB2312 FangSong_GB2312

    接下来我们通过plt.rcParams[‘font.family’]=[“字体名称”]来设置全局中文字体。

    from matplotlib import pyplot as plt
    plt.rcParams['font.family']=['SimHei'] #设置全局字体为黑体
    
    • 1
    • 2

    fontdict 参数可以使用 css 来设置字体样式

    如下例,设置font1和font2两种字体样式:

    import numpy as np
    from matplotlib import pyplot as plt
    import matplotlib
    # 设置两种字体样式
    font1 = {'color':'blue','size':20}
    font2 = {'color':'darkred','size':15}
    x = np.arange(1,11)
    y =  2  * x +  5
    
    # fontdict 参数可以使用 css 来设置字体样式
    plt.title("CSS样式 - 测试标题", fontdict = font1)
     
    plt.xlabel("x 轴黑体", fontdict = font2)
    plt.ylabel("y 轴黑体", fontdict = font2)
    plt.plot(x,y)
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    out29

    loc 参数可以设置轴标签和标题位置

    • title() 方法提供了 loc 参数来设置标题显示的位置,可以设置为: ‘left’, ‘right’, 和 ‘center’, 默认值为 ‘center’。
    • xlabel() 方法提供了 loc 参数来设置 x 轴显示的位置,可以设置为: ‘left’, ‘right’, 和 ‘center’, 默认值为 ‘center’。
    • ylabel() 方法提供了 loc 参数来设置 y 轴显示的位置,可以设置为: ‘bottom’, ‘top’, 和 ‘center’, 默认值为 ‘center’。
    import numpy as np
    from matplotlib import pyplot as plt
    import matplotlib
     
    x = np.arange(1,11)
    y =  2  * x +  5
    
    plt.title("左对齐 - 测试标题", loc="left")
     
    plt.xlabel("x 轴下", loc="left")
    plt.ylabel("y 轴左", loc="bottom")
    plt.plot(x,y)
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    out31

    1.6 Matplotlib 网格线

    语法:matplotlib.pyplot.grid(b=None, which=‘major’, axis=‘both’,)

    参数说明:

    • b:可选,默认为 None,可以设置布尔值,true 为显示网格线,false 为不显示,如果设置 **kwargs 参数,则值为 true。
    • which:可选,可选值有 ‘major’、‘minor’ 和 ‘both’,默认为 ‘major’,表示应用更改的网格线。
    • axis:可选,设置显示哪个方向的网格线,可以是取 ‘both’(默认),‘x’ 或 ‘y’,分别表示两个方向,x 轴方向或 y 轴方向。
    • **kwargs:可选,设置网格样式,可以是 color=‘r’, linestyle=‘-’ 和 linewidth=2,分别表示网格线的颜色,样式和宽度。
    import numpy as np
    import matplotlib.pyplot as plt
    
    x = np.array([1, 2, 3, 4])
    y = np.array([1, 4, 9, 16])
    
    plt.title("grid() Test")
    plt.xlabel("x - label")
    plt.ylabel("y - label")
    
    plt.plot(x, y)
    #加入网格线
    plt.grid()
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    out33

    以下实例添加一个简单的网格线,并设置网格线的样式,格式如下:

    grid(axis=‘x/y’ color = ‘color’, linestyle = ‘linestyle’, linewidth = number)
    参数说明:

    color:‘b’ 蓝色,‘m’ 洋红色,‘g’ 绿色,‘y’ 黄色,‘r’ 红色,‘k’ 黑色,‘w’ 白色,‘c’ 青绿色,‘#008000’ RGB 颜色符串。

    linestyle:‘‐’ 实线,‘‐‐’ 破折线,‘‐.’ 点划线,‘:’ 虚线。

    linewidth:设置线的宽度,可以设置一个数字。

    axis:设置 ‘y’ 则垂直于y轴显示,设置 ‘x’ 则垂直于x轴显示。

    import numpy as np
    import matplotlib.pyplot as plt
    
    x = np.array([1, 2, 3, 4])
    y = np.array([1, 4, 9, 16])
    
    
    plt.title("grid() Style Test")
    plt.xlabel("x - label")
    plt.ylabel("y - label")
    
    plt.plot(x, y,'k-',linewidth=2.5)
    plt.grid(axis='y' ,color = 'grey', linestyle = '--', linewidth = 2)
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    out35

    1.7 Matplotlib 绘制多图

    我们可以使用 pyplot 中的 subplot() 和 subplots() 方法来绘制多个子图。
    subplot() 方法在绘图时需要指定位置,subplots() 方法可以一次生成多个,在调用时只需要调用生成对象的 ax 即可。

    subplot()绘制多图,语法:subplot(nrows, ncols, index, **kwargs)

    即将整个绘图区域分成 nrows 行和 ncols 列,然后从左到右,从上到下的顺序对每个子区域进行编号 1…N ,左上的子区域的编号为 1、右下的区域编号为 N,编号可以通过参数 index 来设置。

    如下例:设置 numRows = 2,numCols = 2,就是将图表绘制成 2x2 的图片区域, 对应的坐标为:

    (1, 1), (1, 2)
    (2, 1), (2, 2)
    
    • 1
    • 2

    plotNum = 1, 表示的坐标为(1, 1), 即第一行第一列的子图。
    plotNum = 2, 表示的坐标为(1, 2), 即第一行第二列的子图。
    plotNum = 3, 表示的坐标为(2, 1), 即第二行第一列的子图。
    plotNum = 4, 表示的坐标为(2, 2), 即第二行第二列的子图。

    import matplotlib.pyplot as plt
    import numpy as np
    
    #plot 1:
    x = np.array([0, 6])
    y = np.array([0, 100])
    
    plt.subplot(2, 2, 1)
    plt.plot(x,y)
    plt.title("plot 1")
    
    #plot 2:
    x = np.array([1, 2, 3, 4])
    y = np.array([1, 4, 9, 16])
    
    plt.subplot(2, 2, 2)
    plt.plot(x,y)
    plt.title("plot 2")
    
    #plot 3:
    x = np.array([1, 2, 3, 4])
    y = np.array([3, 5, 7, 9])
    
    plt.subplot(2, 2, 3)
    plt.plot(x,y)
    plt.title("plot 3")
    
    #plot 4:
    x = np.array([1, 2, 3, 4])
    y = np.array([4, 5, 6, 7])
    
    plt.subplot(2, 2, 4)
    plt.plot(x,y)
    plt.title("plot 4")
    
    plt.suptitle("subplot Test")
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    out37

    subplots()绘制多图,语法:matplotlib.pyplot.subplots(nrows=1, ncols=1, * , sharex=False, sharey=False, squeeze=True, subplot_kw=None, gridspec_kw=None, **fig_kw)

    • nrows:默认为 1,设置图表的行数。
    • ncols:默认为 1,设置图表的列数。
    • sharex、sharey:设置 x、y 轴是否共享属性,默认为 false,可设置为 ‘none’、‘all’、‘row’ 或 ‘col’。 False 或 none 每个子图的 x 轴或 y 轴都是独立的,True 或 ‘all’:所有子图共享 x 轴或 y 轴,‘row’ 设置每个子图行共享一个 x 轴或 y 轴,‘col’:设置每个子图列共享一个 x 轴或 y 轴。
    • squeeze:布尔值,默认为 True,表示额外的维度从返回的 Axes(轴)对象中挤出,对于 N * 1 或 1 * N 个子图,返回一个 1 维数组,对于 N * M,N>1 和 M>1 返回一个 2 维数组。如果设置为 False,则不进行挤压操作,返回一个元素为 Axes 实例的2维数组,即使它最终是1x1。
    • subplot_kw:可选,字典类型。把字典的关键字传递给 add_subplot() 来创建每个子图。
    • gridspec_kw:可选,字典类型。把字典的关键字传递给 GridSpec 构造函数创建子图放在网格里(grid)。
    • ** fig_kw:把详细的关键字参数传给 figure() 函数。

    进阶提示,Matplotlib 除了上述写法,还有一种面向对象的写法:

    fig,ax = plt.subplots() 是面向对象写法,fig为画布,ax为对象,其等价于:
    fig = plt.figure()
    ax = fig.add_subplot(1,1,1)

    import matplotlib.pyplot as plt
    import numpy as np
    
    # 创建一些测试数据 
    x = np.linspace(0, 2*np.pi, 400)
    y = np.sin(x**2)
    t = np.linspace(-1,1,200)
    # 创建一个画像和子图 -- 图1
    fig, ax = plt.subplots(1,1)#fig 画布
    ax.plot(x, y)
    ax.set_title('Simple plot')
    ax.set_ylabel('y - label')
    
    # 创建两个子图 ,设置Y轴共享 -- 图2
    f, (ax1, ax2) = plt.subplots(1, 2, sharey=True)
    ax1.plot(x, y)
    ax1.set_title('Sharing Y axis')
    ax2.scatter(x, y)
    ax2.set_title('Sharing Y axis 2')
    ax1.set_ylabel('share - y - label')
    
    # 创建四个子图 -- 图3
    fig, axs = plt.subplots(2, 2, subplot_kw=dict(projection="polar"))
    axs[0, 0].plot(x, y)
    axs[1, 1].scatter(x, y)
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    out39

    out391

    out392

    创建4个子图,测试共享X轴,共享Y轴和同时共享X轴Y轴的效果,如下例:

    import matplotlib.pyplot as plt
    # 共享 x 轴
    plt.subplots(2, 2, sharex='col')
    # 共享 y 轴
    plt.subplots(2, 2, sharey='row')
    # 同时共享 x 轴和 y 轴
    plt.subplots(2, 2, sharex='all', sharey='all')
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    out410

    out411

    out412

    2、Matplotlib 散点图

    2.1 我们可以使用 pyplot 中的 scatter() 方法来绘制散点图。

    scatter() 方法语法格式如下:

    matplotlib.pyplot.scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, * , edgecolors=None, plotnonfinite=False, data=None, ** kwargs)

    参数说明:

    • x,y:长度相同的数组,也就是我们即将绘制散点图的数据点,输入数据。
    • s:点的大小,默认 20,也可以是个数组,数组每个参数为对应点的大小。
    • c:点的颜色,默认蓝色 ‘b’,也可以是个 RGB 或 RGBA 二维行数组。
    • marker:点的样式,默认小圆圈 ‘o’。
    • cmap:Colormap,默认 None,标量或者是一个 colormap 的名字,只有 c 是一个浮点数数组的时才使用。如果没有申明就是 image.cmap。
    • norm:Normalize,默认 None,数据亮度在 0-1 之间,只有 c 是一个浮点数的数组的时才使用。
    • vmin,vmax::亮度设置,在 norm 参数存在时会忽略。
    • alpha::透明度设置,0-1 之间,默认 None,即不透明。
    • linewidths::标记点的长度。
    • edgecolors::颜色或颜色序列,默认为 ‘face’,可选值有 ‘face’, ‘none’, None。
    • plotnonfinite::布尔值,设置是否使用非限定的 c ( inf, -inf 或 nan) 绘制点。
    • ** kwargs::其他参数。

    指定大小、颜色,如下例:

    import matplotlib.pyplot as plt
    import numpy as np
    
    x = np.array([1, 2, 3, 4, 5, 6, 7, 8])
    y = np.array([1, 4, 9, 16, 7, 11, 23, 18])
    sizes = np.array([20,50,100,200,500,1000,60,90])
    colors = np.array(["red","green","black","orange","purple","beige","cyan","magenta"])
    
    plt.scatter(x, y, c=colors,s=sizes)
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    out43

    设置两组散点图,如下例:

    import matplotlib.pyplot as plt
    import numpy as np
    
    x = np.array([5,7,8,7,2,17,2,9,4,11,12,9,6])
    y = np.array([99,86,87,88,111,86,103,87,94,78,77,85,86])
    plt.scatter(x, y, color = 'hotpink')
    
    x = np.array([2,2,8,1,15,8,12,9,7,3,11,4,7,14,12])
    y = np.array([100,105,84,105,90,99,90,95,94,100,79,112,91,80,85])
    plt.scatter(x, y, color = '#88c999')
    
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    out45

    2.2 随机数设置散点图,加入颜色条

    如下例,我们通过随机函数生成50样本,坐标、颜色和大小均根据样本随机设置,坐标0-1,颜色0-100,大小0-900,alpha=0.5设置透明度,plt.colorbar()加入颜色渐变条。

    import numpy as np
    import matplotlib.pyplot as plt
    # 随机数生成器的种子
    np.random.seed(19680801)
    
    N = 50 #样本数
    # 返回一组服从“0~1”均匀分布的随机样本值
    x = np.random.rand(N)
    y = np.random.rand(N)
    colors = np.random.rand(N)*100 # 将颜色范围设定在0到100
    sizes = (30 * np.random.rand(N))**2  # 将大小泛微设定在0到900
    
    plt.scatter(x, y, s=sizes, c=colors, alpha=0.5) # 设置大小,颜色及透明度
    plt.title("Random Scatter Test") # 设置标题
    plt.colorbar() # 添加 颜色条或渐变色条
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    out47

    2.3 颜色条 Colormap

    Matplotlib 模块提供了很多可用的颜色条。

    颜色条就像一个颜色列表,其中每种颜色都有一个范围从 0 到 100 的值。
    设置颜色条需要使用 cmap 参数,默认值为 ‘viridis’,之后颜色值设置为 0 到 100 的数组。

    import matplotlib.pyplot as plt
    import numpy as np
    
    x = np.array([5,7,8,7,2,17,2,9,4,11,12,9,6])
    y = np.array([99,86,87,88,111,86,103,87,94,78,77,85,86])
    colors = np.array([0, 10, 20, 30, 40, 45, 50, 55, 60, 70, 80, 90, 100])
    
    plt.scatter(x, y, c=colors, cmap='viridis')
    #plt.scatter(x, y, c=colors, cmap='afmhot_r')
    plt.colorbar()
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    out49

    3、Matplotlib 柱形图

    3.1 我们可以使用 pyplot 中的 bar() 方法来绘制柱形图。

    bar() 方法语法格式如下:

    matplotlib.pyplot.bar/barh(x, height, width=0.8, bottom=None, *, align=‘center’, data=None, ** kwargs)

    参数说明:

    • bar:竖状。
    • barh:横状。
    • x:浮点型数组,柱形图的 x 轴数据。
    • height:浮点型数组,柱形图的高度。
    • width:浮点型数组,柱形图的宽度。
    • bottom:浮点型数组,底座的 y 坐标,默认 0。
    • align:柱形图与 x 坐标的对齐方式,‘center’ 以 x 位置为中心,这是默认值。 ‘edge’:将柱形图的左边缘与 x 位置对齐。要对齐右边缘的条形,可以传递负数的宽度值及 align=‘edge’。
    • **kwargs::其他参数。

    竖状,加入颜色参数color和柱宽度参数width,如下例:

    import matplotlib.pyplot as plt
    import numpy as np
    
    x = np.array(["season-1", "season-2", "season-3", "season-4"])
    y = np.array([12, 22, 6, 18])
    
    plt.bar(x,y,color="#8696a7",width=0.6)
    plt.title("Year Bar Test")
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    out51

    横状,加入多颜色和柱高度height参数(在这里是等同于竖状图中的柱宽度参数width),如下例:

    import matplotlib.pyplot as plt
    import numpy as np
    
    x = np.array(["season-1", "season-2", "season-3", "season-4"])
    y = np.array([12, 22, 6, 18])
    
    plt.barh(x,y,color = ["#dadad8","#f8ebd8","#965454","#6b5152"],height = [0.3,0.4,0.5,0.6])
    plt.title("Year Barh Test")
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    out53

    4、 Matplotlib 饼图

    4.1 我们可以使用 pyplot 中的 pie() 方法来绘制饼图。

    pie()方法语法格式如下:

    matplotlib.pyplot.pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, shadow=False, labeldistance=1.1, startangle=0, radius=1, counterclock=True, wedgeprops=None, textprops=None, center=0, 0, frame=False, rotatelabels=False, * , normalize=None, data=None)[source]

    参数说明:

    • x:浮点型数组,表示每个扇形的面积。
    • explode:数组,表示各个扇形之间的间隔,默认值为0。
    • labels:列表,各个扇形的标签,默认值为 None。
    • colors:数组,表示各个扇形的颜色,默认值为 None。
    • autopct:设置饼图内各个扇形百分比显示格式,%d%% 整数百分比,%0.1f 一位小数, %0.1f%% 一位小数百分比, %0.2f%% 两位小数百分比。
    • labeldistance:标签标记的绘制位置,相对于半径的比例,默认值为 1.1,如 <1则绘制在饼图内侧。
    • pctdistance::类似于 labeldistance,指定 autopct 的位置刻度,默认值为 0.6。
    • shadow::布尔值 True 或 False,设置饼图的阴影,默认为 False,不设置阴影。
    • radius::设置饼图的半径,默认为 1。
    • startangle::起始绘制饼图的角度,默认为从 x 轴正方向逆时针画起,如设定 =90 则从 y 轴正方向画起。
    • counterclock:布尔值,设置指针方向,默认为 True,即逆时针,False 为顺时针。
    • wedgeprops :字典类型,默认值 None。参数字典传递给 wedge 对象用来画一个饼图。例如:wedgeprops={‘linewidth’:5} 设置 wedge 线宽为5。
    • textprops :字典类型,默认值为:None。传递给 text 对象的字典参数,用于设置标签(labels)和比例文字的格式。
    • enter :浮点类型的列表,默认值:(0,0)。用于设置图标中心位置。
    • frame :布尔类型,默认值:False。如果是 True,绘制带有表的轴框架。
    • rotatelabels :布尔类型,默认为 False。如果为 True,旋转每个 label 到指定的角度。

    设置饼图标签labels,标签距离圆心距离labeldistance,饼图颜色colors,如下例:

    import matplotlib.pyplot as plt
    import numpy as np
    
    y = np.array([35, 25, 25, 15])
    
    plt.pie(y,
            labels=['A','B','C','D'], # 设置饼图标签
            labeldistance=0.7, # 标签距离圆心的距离
            colors=["#d5695d", "#5d8ca8", "#65a479", "#a564c9"], # 设置饼图颜色
           )
    plt.title("Pie Test") # 设置标题
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    out55

    设置饼图各个扇形之间的间隔explode(突出显示),扇形百分比显示autopct,如下例:

    进阶提示:默认情况下,第一个扇形的绘制是从 X 轴开始并逆时针移动绘制的。

    import matplotlib.pyplot as plt
    import numpy as np
    
    y = np.array([35, 25, 25, 15])
    
    plt.pie(y,
            labels=['A','B','C','D'], # 设置饼图标签
            colors=["#d5695d", "#5d8ca8", "#65a479", "#a564c9"], # 设置饼图颜色
            explode=(0, 0.2, 0, 0.4), # 第二部分突出显示,值越大,距离越远
            autopct='%.2f%%', # 格式化输出百分比显示
           )
    # 默认情况下,第一个扇形的绘制是从 x 轴开始并逆时针移动
    plt.title("Pie Test")
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    out57

    Matplotlib更多用法请参看

    https://matplotlib.org/stable/tutorials/introductory/usage.html

    5、课后作业,答案在下一讲

    1、完成一个简单的单线条图满足以下要求:

    公式:$ f(x) = sin^2(x - 2)e^{ -x^2} $

    要求:

    1. 将[0,2]等分30次写入x轴,使用上述公式得出y轴值
    2. 标题为公式(公式显示用法请自行搜索),X轴label为 asis-X,Y轴label为 asis-Y
    3. 线条样式要求:黑色、破折线、粗细2
    4. 其他样式要求:X轴Y轴标签单独定义font:均为darkred色,字体大小15,X轴标签左对齐,Y轴标签靠上对齐
    5. 加入灰色网格线,粗细1,垂直于x轴

    out61

    您的代码:
    
    • 1

    2、完成一个简单的多线条图满足以下要求:

    1. 将[0,2]等分100次写入x轴,y轴分别为x,x平方,x立方
    2. 在一张画布中展示出三个线条x(蓝色),x平方(橙色),x立方(绿色)
    3. 三条曲线图例标题"linear",“quadratic”,“cubic”
    4. x轴命名x-label,y轴命名y-label,标题为Simple Plot,画布大小8 * 5

    提示:

    1. 使用plt.figure(figsize=(8,5))定义画布大小
    2. 使用plt.legend()显示图例标题

    out63

    您的代码:
    
    • 1

    3、使用面向对象写法fig,ax =plt.subplots()绘制多图满足以下要求:

    1. 完成一个2行1列子画布图形上下展示,画布整体大小8 * 8,上图数据来源于x,y和x,w,下图数据来源于x,z,整体共享x轴
    2. x轴为[0,0.5]按0.01递增的数组,y轴为公式 c o s ( 2 ∗ π ∗ x ) cos(2 * \pi * x) cos(2πx),z轴为range(len(x)),w轴为公式 c o s ( 1.5 ∗ π ∗ x ) cos(1.5 * \pi * x) cos(1.5πx)
    3. 上图中x,y图例标题为2pi,x,w图例标题为1.5pi,下图中线条颜色为红色

    提示:

    1. 子画布可以使用fig,ax = subplots(),ax[0],ax[1],ax[3]…的方式展现或fig,(ax1,ax2,ax3…) = subplots(),ax1,ax2,ax3…的方式展现
    2. 定义画布大小可以在plt.subplots()中使用figsize=(m,n)参数
    3. 显示图例仍然使用legend()

    out65

    您的代码:
    
    • 1

    4、使用面向对象写法fig,ax =plt.subplots()绘制多图满足以下要求:

    1. 完成一个1行2列子画布图形左右展示,左图为线图,右图为散点图,画布整体大小10 * 4,数据data1~4来源于4组0-1随机取样100个
    2. 左图直接输出四组数据,分别使用点状o、菱形d、倒三角v、正方形s,显示图例标题data1 data2 data3 data4,标题为My Plot
    3. 右图x轴为data1,y轴为data2,颜色为data3(0-100),大小为data4(0-900),透明度0.4,需要输出渐变色条,标题为My Scatter

    提示:

    1. 数据定义可以使用data1, data2, data3, data4 = np.random.rand(4, 100)
    2. 左图画布输出可以使用ax1.plot(data1,“o”,label=“data1”) ax2.plot(data2,“d”,label=“data2”)…
    3. 右图颜色定义可以使用colors = data3 * 100,大小定义可以使用sizes = (data4 * 30) ** 2
    4. 右图画布输出可以使用ax2array = ax2.scatter(data1,data2,s=sizes,c=colors)
    5. 输出渐变色条可以使用fig.colorbar(ax2array)

    out67

    您的代码:
    
    • 1

    5、完成A公司销售数据柱状图满足以下要求:

    1. 销售数据为
      data = {‘Barton LLC’: 109438.50,
      ‘Frami, Hills and Schmidt’: 103569.59,
      ‘Fritsch, Russel and Anderson’: 112214.71,
      ‘Jerde-Hilpert’: 112591.43,
      ‘Keeling LLC’: 100934.30,
      ‘Koepp Ltd’: 103660.54,
      ‘Kulas Inc’: 137351.96,
      ‘Trantow-Barrows’: 123381.38,
      ‘White-Trantow’: 135841.99,
      ‘Will LLC’: 104437.60}

    2. 横向,x轴为销售额,y轴为分公司名
      销售额 group_data = list(data.values())
      分公司名 group_names = list(data.keys())
      销售平均值 group_mean = np.mean(group_data)

    3. 标题为Company Revenue

    4. 显示平均线,红色,虚线

    5. 分公司名为’Jerde-Hilpert’,‘Koepp Ltd’,'White-Trantow’的在y轴右侧显示注释文本"New Comany"

    提示:

    1. 平均线设置可以使用plt.axvline(group_mean,color=“red”,linestyle=“–”)
    2. 在y轴右侧显示注释文本可以使用下列语法:
      for group in [3,5,8]:
      plt.text(145000,group,“New Company”)

    out69

    您的代码:
    
    • 1

    6、完成西南5省2021GDP饼状图满足以下要求:

    1. GDP数据为
      data = {‘四川省’: 53850,
      ‘重庆市’: 27894,
      ‘云南省’: 27146,
      ‘贵州省’: 19568,
      ‘西藏自治区’: 2000}

    2. 省份及gdp
      province = list(data.keys())
      gdp = list(data.values())

    3. 饼状图标签为省份名字,标题为"西南5省2021GDP统计"

    4. 输出百分比%.2f%%,重庆市突出显示,突出距离0.1

    5. 字体均为黑体

    提示:

    1. 设置全局字体可使用 plt.rcParams[‘font.family’]=[‘SimHei’]

    out71

    您的代码:
    
    • 1
  • 相关阅读:
    STM8S芯片问题,批量生产时,板子烧录完程序,放置半个月,1%的板子就开不开机了或者1秒开关机一次,300次内板子必死机
    【论文通读】CLIP改进工作综述
    m低信噪比下GPS信号的捕获算法研究,分别使用matlab和FPGA对算法进行仿真和硬件实现
    Linux基本常用命令大全(附案例实战)
    2023,阿里巴巴走向了中年的十字路口
    门牌制作-蓝桥杯?-Lua 中文代码解题第3题
    Leetcode 35. 搜索插入位置(二分)
    P01 单元测试
    愿你放飞梦想,国庆快乐!Wish you a happy National Day!
    112. Path Sum刷题笔记
  • 原文地址:https://blog.csdn.net/m0_59562547/article/details/125406853