matplotlib之绘制正余弦曲线
绘制正余弦曲线
绘制正弦曲线,需要用到numpy函数,生成对应的x-y值,如下代码,可以绘制出基本的正余弦曲线,曲线的线性,线宽,颜色等设置,均是在plot函数内设置的。linestyle设置线型,linewidth设置线宽,color设置颜色,而lable则添加标签。绘制效果如图,接下来借这两条曲线,再说一下其他的设置。
import numpy as np
import matplotlib.pyplot as mp
# [-π,π] 拆1000个点
x = np.linspace(-np.pi, np.pi, 1000)
sin_x = np.sin(x)
# 绘制余弦曲线 y=1/2 * cos(x)
cos_x = np.cos(x) / 2
# 绘图
mp.plot(x, sin_x, linestyle='--', linewidth=2,
color='dodgerblue', alpha=0.9,
label=r'$y=sin(x)$')
mp.plot(x, cos_x, linestyle=':', linewidth=3,
color='orangered', alpha=0.9,
label=r'$y=\frac{1}{2}cos(x)$')
修改可视范围
如图,可以根据需要选择可视范围。只要加上下面的xlim和ylim即可根据需要调整。
# mp.xlim(0, np.pi)
# mp.ylim(0, 1)
修改坐标刻度
如图:相比于第一幅图自动生成的刻度,可以自己按照自己需要的来定义刻度,定义刻度的函数是xticks和yticks,如果不定义刻度,很多时候画出来的图像会变形,尤其是x和y的刻度相差很大时,很容易出现严重变形。
x_val_list=[-np.pi, -np.pi/2, 0, np.pi/2, np.pi]
x_text_list=['-π', r'$-\frac{\pi}{2}$', '0',
r'$\frac{π}{2}$', 'π']
mp.xticks(x_val_list, x_text_list)
mp.yticks([-1, -0.5, 0.5, 1],
['-1', '-0.5', '0.5', '1'])
设置坐标轴
可以看见,matplotlib自动生成的图像,是没有一个合适的坐标系的,因此来给它加个坐标系。获取当前坐标轴mp.gca(), 修改坐标轴的颜色 axis.set_color(‘none’),移动坐标轴的位置 ,data: 基于数据坐标系进行定位 0: 把坐标轴移动到0的位置。
ax = mp.gca()
ax.spines['top'].set_color('none')
ax.spines['right'].set_color('none')
ax.spines['left'].set_position(('data',0))
ax.spines['bottom'].set_position(('data',0))
绘制两个特殊点
scatter函数是绘制点的专用函数,如图,利用scatter函数在图像的(0,π/2)和(π/2,1)绘制了两个点,其中绘制点也需要设置。
mp.scatter(
xarray, yarray, # 给出点的坐标
marker='', # 点型 'D' 's' 'o' ...
s = 60, # 点的大小
edgecolor='', # 边缘色
facecolor='', # 填充色
zorder=3 # 绘制图层编号 (编号越大,图层越靠上)
)
mp.scatter([np.pi/2, np.pi/2], [0, 1], marker='X', s=80, edgecolor='dodgerblue',facecolor='deepskyblue', zorder=3)
为点添加备注
如图,利用annotate为图像添加备注,具体参数含义如下。
mp.annotate(
r'$[x, y]$', # 备注的文本内容
xycoords='data', # 目标点的坐标系
xy=(1, 2), # 目标点的坐标
# 定位备注文本位置所使用的坐标系
textcoords='offset points',
xytext=(-10, -10), # 备注文本的坐标
fontsize=12, # 字体大小
# 箭头属性字典
arrowprops=dict(
arrowstyle : '->', # 箭头样式
connectionstyle='angle3' # 连接线的样式
)
)
ap = dict(arrowstyle='->',
connectionstyle='angle3')
mp.annotate(r'$[\frac{\pi}{2}, 1]$',
xycoords='data', xy=(np.pi/2, 1),
textcoords='offset points', xytext=(20,-10),
fontsize=12, arrowprops=ap)
mp.annotate(r'$[\frac{\pi}{2}, 0]$',
xycoords='data', xy=(np.pi/2, 0),
textcoords='offset points', xytext=(-50,-50),
fontsize=12, arrowprops=ap)
附完整代码
"""
绘制正余弦曲线
"""
import numpy as np
import matplotlib.pyplot as mp
# [-π,π] 拆1000个点
x = np.linspace(-np.pi, np.pi, 1000)
sin_x = np.sin(x)
# 绘制余弦曲线 y=1/2 * cos(x)
cos_x = np.cos(x) / 2
# 绘图
mp.plot(x, sin_x, linestyle='--', linewidth=2,
color='dodgerblue', alpha=0.9,
label=r'$y=sin(x)$')
mp.plot(x, cos_x, linestyle=':', linewidth=3,
color='orangered', alpha=0.9,
label=r'$y=\frac{1}{2}cos(x)$')
# 修改可视范围
mp.xlim(0, np.pi)
mp.ylim(0, 1)
# 修改坐标刻度
x_val_list=[-np.pi, -np.pi/2, 0, np.pi/2, np.pi]
x_text_list=['-π', r'$-\frac{\pi}{2}$', '0',
r'$\frac{π}{2}$', 'π']
mp.xticks(x_val_list, x_text_list)
mp.yticks([-1, -0.5, 0.5, 1],
['-1', '-0.5', '0.5', '1'])
# 设置坐标轴
ax = mp.gca()
ax.spines['top'].set_color('none')
ax.spines['right'].set_color('none')
ax.spines['left'].set_position(('data',0))
ax.spines['bottom'].set_position(('data',0))
# 绘制两个特殊点
mp.scatter([np.pi/2, np.pi/2], [0, 1],
marker='X', s=80, edgecolor='dodgerblue',
facecolor='deepskyblue', zorder=3)
# 为点添加备注
ap = dict(arrowstyle='->',
connectionstyle='angle3')
mp.annotate(r'$[\frac{\pi}{2}, 1]$',
xycoords='data', xy=(np.pi/2, 1),
textcoords='offset points', xytext=(20,-10),
fontsize=12, arrowprops=ap)
mp.annotate(r'$[\frac{\pi}{2}, 0]$',
xycoords='data', xy=(np.pi/2, 0),
textcoords='offset points', xytext=(-50,-50),
fontsize=12, arrowprops=ap)
# 显示图例
mp.legend(loc='best')
mp.show()