matplotlib 是 Python 的一个绘图库,使用它可以很方便地绘制出版质量级别的图形图片。本节主要介绍的是 matplotlib 的基本绘图功能,即在二维平面坐标系中绘制连续的曲线。
matplotlib.pyplot
绘图核心API
import numpy as np
import matplotlib.pyplot as plt
# x_array:<序列> 水平坐标序列
# y_array:<序列> 竖直坐标序列
plt.plot(x_array, y_array)
# 显示图表
plt.show()
案例:绘制一条正弦曲线
import numpy as np
import matplotlib.pyplot as plt
# 在-2pi到2pi之间等间隔生成100个点
x_array = np.linspace(-2 * np.pi, 2 * np.pi, 100)
y_array = np.sin(x_array)
plt.plot(x_array, y_array)
# 将图像以.jpg的格式保存
plt.savefig("sinx.jpg")
plt.show()
1、绘制水平线与垂直线
import numpy as np
import matplotlib.pyplot as plt
# vertical lines 绘制垂直线
plt.vlines(xval, ymin, ymax, ...)
# horizotal lines 绘制水平线
plt.hlines(yval, xmin, xmax, ...)
# 显示图表
plt.show()
import numpy as np
import matplotlib.pyplot as plt
# 等间隔拆分1000个点
x = np.linspace(-np.pi, np.pi, 1000)
y = np.sin(x)
plt.plot(x, y)
# 绘制一条水平线和垂直线(线条颜色是黑色)
# 同时绘制多条竖直线
plt.vlines([-2, -1, 0, 1, 2], -1, 1, colors='blue')
plt.hlines(0, -3, 3, color='red')
plt.show()
图中绘制了 5 条垂直线( x = [-2, -1, 0, 1, 1], ymin = -1, ymax = 1 )和 1 条水平线( y = 0, xmin = -3, xmax = 3 ).
2、线型、线宽和颜色
线型:linestyle = [ ’ - ', ’ – ', ’ -. ', ’ : ’ ];
线宽:linewidth = 数字;
颜色:color = 英文颜色单词 或 常用颜色的英文首字母 或 #495434 或 (56,54,20);
透明度:alpha = 浮点数值;
比如:plt.plot(x_array, y_array, linestyle='--', linewidth=2, color='r', alpha=0.5)
import numpy as np
import matplotlib.pyplot as plt
# 线性拆分1000个点
x = np.linspace(-np.pi, np.pi, 1000)
sinx = np.sin(x)
cosx = np.cos(x)
plt.plot(x, sinx, linestyle="-.", linewidth=2, color="dodgerblue", alpha=0.8)
plt.plot(x, cosx, linestyle='--', linewidth=2, color='orangered', alpha=1)
plt.savefig("cosx.png")
plt.show()
3、设置坐标轴范围
案例:以 sigmoid 函数为例,设置 x x x 轴和 y y y 轴的坐标轴范围
# x_limt_min: x轴范围最小值
# x_limt_max: x轴范围最大值
plt.xlim(x_limt_min, x_limt_max)
# y_limt_min: y轴范围最小值
# y_limt_max: y轴范围最大值
plt.ylim(y_limt_min, y_limt_max)
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-10, 10, 1000)
y = 1/(1 + np.exp(-x))
# 设置坐标轴的范围
plt.xlim(-8, 8) # 将x轴的范围设为[-8, 8]
plt.ylim(-0.01, 1.01) # 将y轴的范围设为[-0.01, 1.01]
plt.plot(x, y, linestyle='-', linewidth=2, color='red', alpha=0.8)
plt.show()
4、设置坐标刻度
案例:把正弦函数 y = s i n x y=sinx y=sinx 的横坐标刻度设置为:0、 π 2 \dfrac{\pi}{2} 2π、 π \pi π、 3 π 2 \dfrac{3\pi}{2} 23π 和 2 π 2\pi 2π.
# x_val_list:x轴刻度值序列
# x_text_list:x轴刻度标签文本序列[可选]
plt.xticks(x_val_list, x_text_list )
# y_val_list:y轴刻度值序列
# y_text_list:y轴刻度标签文本序列[可选]
plt.yticks(y_val_list, y_text_list)
【推荐】:设置刻度值的时候,数值序列与文本序列的长度要一一对应且相同。
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-np.pi, np.pi, 1000)
sinx = np.sin(x)
# 设置坐标刻度
x_val_list = [-np.pi, -1/2*np.pi, 0, 1/2*np.pi, np.pi]
x_text_list = [r'-$\pi$', r'-$\dfrac{\pi}{2}$', r'$0$', r'$\dfrac{\pi}{2}$', r'-$\pi$']
plt.xticks(x_val_list, x_text_list)
plt.plot(x, sinx, linestyle="-", linewidth=2, color="orangered", alpha=0.9)
plt.savefig("ysinx.jpg")
plt.show()
5、设置坐标轴
从上面绘制的曲线可以看到,坐标轴有上下左右,而实际绘制数学函数的图象时,我们的直角坐标系都是通过原点且相互垂直的。因此,matplotlib 设置有四个坐标轴名:left / right / top / bottom。
# 获取当前坐标轴
ax = plt.gca()
# 获取其中某个坐标轴(无非就是top/bottom/left/right)
axis = ax.spines['坐标轴名']
# 设置坐标轴的位置
# val:参照值
axis.set_position((type, val))
# 设置坐标轴的颜色
# color: 颜色值字符串
axis.set_color(color)
例如:ax.spines['left'].set_position(('data', 0))
,先获取到当前的坐标轴,然后设置坐标轴的位置或颜色值。
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-np.pi, np.pi, 1000)
sinx = np.sin(x)
plt.plot(x, sinx, linestyle='-.',linewidth=2, color='red', alpha=0.9)
# 设置坐标刻度
x_val_list = [-np.pi, -1/2*np.pi, 0, 1/2*np.pi, np.pi]
x_text_list = [r'-$\pi$', r'-$\frac{\pi}{2}$', r'$0$', r'$\frac{\pi}{2}$', r'-$\pi$']
plt.xticks(x_val_list, x_text_list)
# 注意:这里我没有设置纵坐标的文本序列
plt.yticks([-1, -0.5, 0.5, 1])
# 修改坐标轴
ax = plt.gca()
ax.spines['top'].set_color('none') # 表示不显示top坐标轴
ax.spines['right'].set_color('none')
ax.spines['left'].set_position(('data', 0))
ax.spines['bottom'].set_position(('data', 0))
plt.show()
6、图例
案例:显示两条曲线的图例,并测试 loc 属性;
设置图例的位置:loc : <关键字参数>制定图例的显示位置(如果不设置 loc,则显示默认位置)
plt.plot(x, y, ... label='', ...)
plt.legend(loc='')
Location String | Location Code |
---|---|
best | 0 |
upper right | 1 |
upper left | 2 |
lower left | 3 |
lower right | 4 |
right | 5 |
center left | 6 |
center right | 7 |
lower center | 8 |
upper center | 9 |
center | 10 |
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-np.pi, np.pi, 1000)
sinx = np.sin(x)
cosx = 1/2 * np.cos(x)
plt.plot(x, sinx, linestyle='-.', linewidth=2, color='dodgerblue', label=r'$y=sin(x)$')
plt.plot(x, cosx, linestyle='--', linewidth=2, color='orangered', label=r'$y=\frac{1}{2}cos(x)$')
# 设置坐标刻度
x_val_list = [-np.pi, -1/2*np.pi, 0, 1/2*np.pi, np.pi]
x_text_list = [r'-$\pi$', r'-$\frac{\pi}{2}$', r'$0$', r'$\frac{\pi}{2}$', r'-$\pi$']
plt.xticks(x_val_list, x_text_list)
plt.yticks([-1, -0.5, 0.5, 1])
# 修改坐标轴
ax = plt.gca()
ax.spines['top'].set_color('none') # 不显示top坐标轴
ax.spines['right'].set_color('none')
# 这里的data表示的是数据坐标系
ax.spines['left'].set_position(('data',0))
ax.spines['bottom'].set_position(('data',0))
plt.legend(loc='upper left')
plt.show()
7、特殊点
案例:绘制激活函数 sigmoid 曲线上的特殊点;
# xarray: <序列> 所有需要标注点的水平坐标组成的序列
# yarray: <序列> 所有需要标注点的垂直坐标组成的序列
plt.scatter(xarray, yarray,
marker='', # 点型 ~ matplotlib.markers
s=70, # 大小
edgecolor='', # 边缘色
facecolor='', # 填充色
zorder=3 # 绘制图层编号 (编号越大,图层越靠上)
)
说明:标注特殊点用到了 pyplot 的散点图绘制方法
Matplotlib Point 样式(marker 属性)
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-20, 20, 1000)
y = 1/(1+np.exp(-x))
plt.plot(x, y, linestyle='-',linewidth=2, color='red', alpha=0.9, label=r'$\frac{1}{1+e^{-x}}$')
# 设置坐标刻度
plt.yticks([0.5, 1])
# 修改坐标轴
ax = plt.gca()
ax.spines['top'].set_color('none') # 不显示top坐标轴
ax.spines['right'].set_color('none')
ax.spines['left'].set_position(('data',0))
ax.spines['bottom'].set_position(('data',0))
# 绘制特殊点(列表)
pointx = [0]
pointy = [0.5]
plt.scatter(pointx, pointy, marker='o', s=50, color='red', label='sample points',zorder=3)
# 给图像设置标题
plt.title(r"Function : $y=\dfrac{1}{1+e^{-x}}$")
plt.legend()
plt.show()
8、备注
案例:在某条曲线上的点添加备注,指明函数方程与值。
# 在图表中为某个点添加备注
plt.annotate(
r'($\frac{\pi}{2}, 0)$', # 备注显示的文本内容
xycoords='data', # 备注目标点所使用的坐标系(data表示数据坐标系)
xy=(x, y), # 目标点的坐标
textcoords='offset points', # 参照点的偏移坐标系
xytext=(x, y), # 备注文本的坐标
fontsize=14, # 备注文本的字体大小
arrowprops=dict() # 使用字典定义文本指向目标点的箭头样式
)
# arrowprops字典参数的常用key
arrowprops = dict(
arrowstyle='->', # 定义箭头样式
connectionstyle='' # 定义连接线的样式(angle3、arc3、bar)
)
个人觉得,arrowstyle
的参数很多,只需要记住 ->
就足够了。
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-np.pi, np.pi, 1000)
sinx = np.sin(x)
cosx = 1/2 * np.cos(x)
plt.plot(x, sinx, linestyle='-.', linewidth=2, color='dodgerblue', label=r'$y=sin(x)$')
plt.plot(x, cosx, linestyle='--', linewidth=2, color='orangered', label=r'$y=\frac{1}{2}cos(x)$')
# 设置坐标刻度
x_val_list = [-np.pi, -1/2*np.pi, 0, 1/2*np.pi, np.pi]
x_text_list = [r'-$\pi$', r'-$\frac{\pi}{2}$', r'$0$', r'$\frac{\pi}{2}$', r'-$\pi$']
plt.xticks(x_val_list, x_text_list)
plt.yticks([-1, -0.5, 0.5, 1])
# 修改坐标轴
ax = plt.gca()
ax.spines['top'].set_color('none') # 不显示top坐标轴
ax.spines['right'].set_color('none')
ax.spines['left'].set_position(('data',0))
ax.spines['bottom'].set_position(('data',0))
plt.legend(loc='upper left')
# 绘制特殊点(列表)
pointx = [np.pi / 2, np.pi / 2]
pointy = [1, 0]
plt.scatter(pointx, pointy, marker='o', s=50, color='red', label='sample points',zorder=3)
# 在图表中为某个点添加备注
plt.annotate(
r'$(\frac{\pi}{2}, 1)$',
xycoords='data',
xy=(np.pi / 2, 1),
textcoords='offset points',
xytext=(50, 30),
fontsize=14,
arrowprops=dict(
arrowstyle='->',
connectionstyle='angle3'
)
)
plt.annotate(
r'$(\frac{\pi}{2}, 0)$',
xycoords='data',
xy=(np.pi / 2, 0),
textcoords='offset points',
xytext=(-50, -30),
fontsize=14,
arrowprops=dict(
# 箭头样式
arrowstyle='->',
# 设置连接线样式
connectionstyle='arc3'
)
)
plt.show()