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样式参考:
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', )
例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)
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)
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()
效果如图:
来源:小羊快学