Matplotlib绘图(基础篇)

目录

一、Matplotlib绘图的编程方式: 

1、pyplot: 是 Matplotlib 的子库,提供了和 MATLAB 类似的绘图 API。(常用)

2、pylab:将Matplotlib和Numpy合并的模块,模拟Matlab的编程环境。(不推荐使用)

3、面向对象的方式:Matplotlib的精髓,更基础和底层的方式。(常用)

二、Matplotlib绘图基础

1、Matplotlib绘图标记使用plot()方法的marker参数定义

 2、Matplotlib绘图线

(1)Matplotlib线的类型用linestyle参数来定义:

 (2)Matplotlib线的颜色用color参数来定义

 (3)Matplotlib线的宽度用linewidth参数来定义

(4)Matplotlib轴标签使用xlabel()和ylabel()方法

 (5)Matplotlib标题使用title()方法

 (6)Matplotlib标题与标签的定位提供了loc参数

 (7)Matplotlib网格线使用pyplot中的grid()方法

 (8)绘制多图使用pyplot中的subplot()和subplots()方法


一、Matplotlib绘图的编程方式: 

1、pyplot: 是 Matplotlib 的子库,提供了和 MATLAB 类似的绘图 API。(常用)

import matplotlib.pyplot as plt
import numpy as np
x=np.arange(0,10)
y=np.random.randn(len(x))
plt.plot(x,y)
plt.title('plplot')
plt.show()

2、pylab:将Matplotlib和Numpy合并的模块,模拟Matlab的编程环境。(不推荐使用)

from pylab import *
x=arange(0,10)
y=randn(len(x))
plot(x,y)
title('pylab',size=15)
show()

 总结pyplot与pylab的区别:从pylab代码可以看出,通过pylab可以直接调用函数。例:arange(0,10),而不是np.arange(0,10)

3、面向对象的方式:Matplotlib的精髓,更基础和底层的方式。(常用)

import matplotlib.pyplot as plt
import numpy as np

x=np.arange(0,10)

y=np.random.randn(len(x))

fig=plt.figure()

ax=fig.add_subplot(1,1,1)

l,=plt.plot(x,y)

t=ax.set_title('object')

plt.show()

 

 总结:使用面向对象编程,需要画布(FigureCanvas)、图像(Figure)、坐标轴(Axes) 

编程方式 优势 劣势
pyplot 简单易用,交互使用方便,可以根据命令实时作图 底层定制能力不足
pylab 完全封装,环境最接近Matlab 和matplotlib设计理念不太一致,不利于学习matplotlib
面向对象 接近Matplotlib基础和底层的方式 9难度稍大

实战中,根据需求,综合使用pyplot和面向对象的方式。

二、Matplotlib绘图基础

1、Matplotlib绘图标记使用plot()方法的marker参数定义

merker样式参考:

Matplotlib marker参数样式大全_小羊快学的博客-CSDN博客一、样式大全标记类型标记样式效果o实心圆.点,像素点+加号*星号x乘号X填充乘号s正方形D胖菱形d瘦菱形p五边形h六边形H六边形8八边形^上三角v…https://blog.csdn.net/Yangyuqing_/article/details/124099762?spm=1001.2014.3001.5502

import matplotlib.pyplot as plt
import numpy as np

x=np.arange(0,10)

plt.plot(x,marker='+')

plt.show()

 2、Matplotlib绘图线

定义线的类型、颜色与大小等

(1)Matplotlib线的类型用linestyle参数来定义:

类型(简写) 说明
'-' 实线
':' 点虚线
'–' 破折线
'-.' 点划线
''或' ' 不画线
'steps' 阶梯线
import matplotlib.pyplot as plt
import numpy as np

x=np.arange(0,10)

plt.plot(x,marker='*',linestyle=':')

plt.show()

 (2)Matplotlib线的颜色用color参数来定义

颜色标记 描述
'r' 红色
'g' 绿色
'c' 青色
'y' 黄色
'k' 黑色

说明:列举不全,完整样式参考颜色值

import matplotlib.pyplot as plt
import numpy as np

x=np.arange(0,10)

plt.plot(x,marker='*',linestyle=':',color='r')

plt.show()

 (3)Matplotlib线的宽度用linewidth参数来定义

说明:值除了是整数,也可以是浮点数。

import matplotlib.pyplot as plt
import numpy as np

x=np.arange(0,10)

plt.plot(x,marker='*',linestyle=':',color='r',linewidth=4.5)

plt.show()

(4)Matplotlib轴标签使用xlabel()和ylabel()方法

import matplotlib.pyplot as plt
import numpy as np

x=np.arange(0,10)

plt.plot(x,marker='*',linestyle=':',color='r',linewidth=4.5)
plt.xlabel('x-label')
plt.ylabel('y-label')

plt.show()

 说明:Matplotlib默认情况下不支持中文,可以使用rcParams显示中文

参数 字体样式
'Fangsong' 仿宋体
'STSong' 华文宋体
'SimHei' 黑体
'STKaiti' 华文楷体
'STLiti' 华文隶书

说明:字体样式列举不全

import matplotlib.pyplot as plt
import numpy as np
# 设置字体为华文隶书 显示中文
plt.rcParams['font.sans-serif']=['STLiti']

x=np.arange(0,10)

plt.plot(x,marker='*',linestyle=':',color='r',linewidth=4.5)
# 使用fontsize设置字体大小
plt.xlabel('x轴',fontsize=20)
plt.ylabel('y轴',fontsize=20)

plt.show()

 (5)Matplotlib标题使用title()方法

import matplotlib.pyplot as plt
import numpy as np
# 设置字体为华文隶书 显示中文
plt.rcParams['font.sans-serif']=['STLiti']

x=np.arange(0,10)

plt.plot(x,marker='*',linestyle=':',color='r',linewidth=4.5)
# fontsize设置字体大小
plt.xlabel('x轴',fontsize=20)
plt.ylabel('y轴',fontsize=20)
plt.title('标题',fontsize=25)
plt.show()

 (6)Matplotlib标题与标签的定位提供了loc参数

方法 参数 默认
title() 'left', 'right', 和 'center' 'center'
xlabel() 'left', 'right', 和 'center' 'center'
ylabel() 'bottom', 'top', 和 'center' 'center'
import matplotlib.pyplot as plt
import numpy as np

# 设置字体为黑体 显示中文
plt.rcParams['font.sans-serif']=['STLiti']

x=np.arange(0,10)

plt.plot(x,marker='o',color='r',linewidth=2)

# fontsize设置字体大小
# loc设置标签显示位置
plt.xlabel('x轴',fontsize=20,loc='left')
plt.ylabel('y轴',fontsize=20,loc='top')
plt.title('标题',fontsize=25,loc="left")
plt.show()

 说明:最开始我试的时候,标签一直显示没有loc参数。所以用了另一种方法,用到了rcParams(标签有loc参数的请忽略)

import matplotlib.pyplot as plt
import numpy as np

# 设置字体为黑体 显示中文
plt.rcParams['font.sans-serif']=['STLiti']

plt.rcParams['xaxis.labellocation']='right'
plt.rcParams['yaxis.labellocation']='top'

x=np.arange(0,10)

plt.plot(x,marker='o',color='r',linewidth=2)

# fontsize设置字体大小
# loc设置标签显示位置
plt.xlabel('x轴',fontsize=20)
plt.ylabel('y轴',fontsize=20)
plt.title('标题',fontsize=25,loc='right')
plt.show()

 

 (7)Matplotlib网格线使用pyplot中的grid()方法

grid()语法:

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,分别表示网格线的颜色,样式和宽度。
  • 例1:添加网格线,参数使用默认值。plt.grid() 

    import matplotlib.pyplot as plt
    import numpy as np
    
    # 设置字体为黑体 显示中文
    plt.rcParams['font.sans-serif']=['STLiti']
    
    x=np.arange(0,10)
    
    plt.plot(x,marker='o',color='r',linewidth=2)
    
    # 设置标签和标题
    # fontsize设置字体大小
    # loc设置标签显示位置
    plt.xlabel('x轴',fontsize=20,loc='center')
    plt.ylabel('y轴',fontsize=20,loc='center')
    plt.title('标题',fontsize=25,loc='center')
    
    # 设置网格线
    plt.grid()
    
    plt.show()

     例2:使用axis参数控制网格线显示方向。plt.grid(axis='x')或者plt.grid(axis='y')

    import matplotlib.pyplot as plt
    import numpy as np
    
    # 设置字体为黑体 显示中文
    plt.rcParams['font.sans-serif']=['STLiti']
    
    x=np.arange(0,10)
    
    plt.plot(x,marker='o',color='r',linewidth=2)
    
    # 设置标签和标题
    # fontsize设置字体大小
    # loc设置标签显示位置
    plt.xlabel('x轴',fontsize=20,loc='center')
    plt.ylabel('y轴',fontsize=20,loc='center')
    plt.title('标题',fontsize=25,loc='center')
    
    # 设置网格线
    # axis='x' 设置在x轴方向显示网格线 设置y就在y轴方向显示网格线
    plt.grid(axis='x')
    
    plt.show()

     例3:更改网格线样式 参数color,linestyle,linewidth等同于Matplotlib绘图线

    import matplotlib.pyplot as plt
    import numpy as np
    
    # 设置字体为黑体 显示中文
    plt.rcParams['font.sans-serif']=['STLiti']
    
    x=np.arange(0,10)
    
    plt.plot(x,marker='o',color='r',linewidth=2)
    
    # 设置标签和标题
    # fontsize设置字体大小
    # loc设置标签显示位置
    plt.xlabel('x轴',fontsize=20,loc='center')
    plt.ylabel('y轴',fontsize=20,loc='center')
    plt.title('标题',fontsize=25,loc='center')
    
    # 设置网格线
    # axis='x' 设置在x轴方向显示网格线 设置y就在y轴方向显示网格线
    # color='g'设置网格线颜色
    # linestyle='-.'设置网格线样式
    # linewidth=2设置网格线宽度
    plt.grid(axis='x',color='g',linestyle='-.',linewidth=2)
    
    plt.show()

     (8)绘制多图使用pyplot中的subplot()和subplots()方法

    两者区别:

    subplot() 方法:在绘图时需要指定位置

    subplots() 方法:可以一次生成多个,在调用时只需要调用生成对象的 ax 即可。

    subplot()实例:

    subplot语法:

    subplot(nrows, ncols, index, **kwargs)
  • nrows:默认为 1,设置图表的行数。
  • ncols:默认为 1,设置图表的列数。
  • index:默认为1,设置图表的编号。
  • import matplotlib.pyplot as plt
    import numpy as np
    
    # plot1
    xplot1=np.array([0,6])
    yplot1=np.array([0,100])
    # plt.subplot()中的三个参数分成nrows(行)、ncols(列)和index(编号)
    plt.subplot(2,2,1)  # 两行两列 第一个图
    plt.plot(xplot1,yplot1,color='g',linestyle='--',linewidth=2)
    # 小标题
    plt.title('plot 1',fontsize=20)
    
    # plot2
    xplot2=np.array([1,2,3,4,5])
    yplot2=np.array([1,4,9,16,25])
    plt.subplot(2,2,2)  # 两行两列 第二个图
    plt.plot(xplot2,yplot2,color='r',linestyle=':',linewidth=2)
    # 小标题
    plt.title('plot 2',fontsize=20)
    
    # plot3
    xplot3=np.array([1,2,3,4,5])
    yplot3=np.array([1,4,9,16,25])
    plt.subplot(2,2,3)  # 两行两列 第三个图
    plt.plot(xplot3,yplot3,color='b',linestyle='-.',linewidth=2)
    # 小标题
    plt.title('plot 3',fontsize=20)
    
    # plot4
    xplot4=np.array([1,2,3,4,5])
    yplot4=np.array([1,4,9,16,25])
    plt.subplot(2,2,4)  # 两行两列 第四个图
    plt.plot(xplot4,yplot4,color='y',linestyle='-',linewidth=2)
    # 小标题
    plt.title('plot 4',fontsize=20)
    
    # 总标题
    plt.suptitle('plots',fontsize=20)
    
    plt.show()

     subplots()实例:

    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维数组,即使它最终是1×1。
  • subplot_kw:可选,字典类型。把字典的关键字传递给 add_subplot() 来创建每个子图。
  • gridspec_kw:可选,字典类型。把字典的关键字传递给 GridSpec 构造函数创建子图放在网格里(grid)。
  • **fig_kw:把详细的关键字参数传给 figure() 函数。
  • import matplotlib.pyplot as plt
    import numpy as np
    
    # numpy.linspace作用为:在指定的大间隔内,返回固定间隔的数据(可以理解为等差数列)
    # numpy.linspace语法:numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None,axis=None)
    # start:起始点
    # stop:结束点
    # num:生成的样本数(默认50,必须是非负)
    # endpoint:默认为True(为False时,不输出结束点)
    # retstep默认为False(为True时,返回每个步骤之间的间距)(可以理解为等差数列的公差)
    # dtype:输出数组的类型
    # axis=0时,输出最开始的轴值,axis=-1时,输出最后的轴值
    
    # np.pi是一个常数表示圆周率Π
    # 2*np.pi是2 x Π
    x=np.linspace(0,2*np.pi,400)
    y=np.sin(x**2)
    
    # 创建一个画像和子图 -----图1
    # fig,ax=plt.subplots()等价于fig=plt.figure() ax=fig.add_subbplot()
    # fig代表绘图窗口(Figure)
    # fig=plt.figure()
    # figure()语法:figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True)
    # num:图像编号或名称,数字为编号 ,字符串为名称
    #figsize:指定figure的宽和高,单位为英寸;
    #dpi参数指定绘图对象的分辨率,即每英寸多少个像素,缺省值为80 ,1英寸等于2.5cm,A4纸是 21*30cm的纸张
    #facecolor:背景颜色
    #edgecolor:边框颜色
    #frameon:是否显示边
    # ax代表这个绘图窗口上的坐标系(axis)
    # ax=fig.add_subbplot()
    fig,ax=plt.subplots()
    ax.plot(x,y)
    ax.set_title('first')
    
    # 创建两个子图   -----图2
    # 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() 函数。
    
    # 创建一个画像和两个子图  一行两列 共享y轴   
    f,(ax1,ax2)=plt.subplots(1,2,sharey=True)
    ax1.plot(x,y)
    ax1.set_title('one')
    # scatter(x,y) 在向量 x 和 y 指定的位置创建一个散点图。该类型的图形也称为气泡图。
    ax2.scatter(x,y)
    ax2.set_title('two')
    
    # 创建四个子图   -----图3
    # projection='polar'等价于polar=True 极坐标图投影
    fig,axs=plt.subplots(2,2,subplot_kw=dict(projection='polar'))
    # [0,0],[1,1]散射点
    axs[0,0].plot(x,y)
    axs[1,1].scatter(x,y)
    
    # 共享x轴
    # axs.subplots(2,2,sharex='col')
    
    # 共享y轴
    # plt.subplots(2,2,sharey='row')
    
    # 共享x轴和y轴 第一种
    # plt.subplots(2,2,sharex='col',sharey='row')
    
    # 共享x轴和y轴 第二种   ------图4
    plt.subplots(2,2,sharex=True,sharey=True)
    
    plt.show()

    效果如图:

     

     

     

    来源:小羊快学

    物联沃分享整理
    物联沃-IOTWORD物联网 » Matplotlib绘图(基础篇)

    发表评论