我们在用matplotlib绘制图的时候总是有各种需求,比如下图为matplotlib默认设置画的正弦图
但是我们的心中想要达到的目标图为下图,那么就需要对坐标轴进行设置。
这里要介绍matplotlib绘图辅助工具包mpl_toolkits,里面包含了一系列对于坐标轴设置的方法。
首先导入辅助工具包里面的轴系设置包
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import mpl_toolkits.axisartist as axisartist
#导入辅助工具包里面的坐标轴系设置方法axisartist
新建画板,添加绘图区
fig = plt.figure('Sine Wave', (10,8))
#figure(num, figsize, dpi, facecolor, edgecolor, frameon, FigureClass, clear)
#新建了一个画板(画图视窗)
ax = axisartist.Subplot(fig, 1,1,1)
fig.add_axes(ax)
#新建一个轴系图(绘图区)对象ax,并添加到画板中
隐藏默认坐标轴(上下左右边框),并新建坐标轴X-Y,同时设置刻度标识方向
ax.axis[:].set_visible(False)
#
ax.axis["x"] = ax.new_floating_axis(0, 0)
ax.axis["y"] = ax.new_floating_axis(1, 0)
#new_floating_axis(self, nth_coord, value, axis_direction='bottom')
#新建可移动的坐标轴
ax.axis["x"].set_axis_direction('top')
ax.axis["y"].set_axis_direction('left')
创建坐标轴的方法有两种:
其中new_floating_axis()相对更加灵活,本节中采用new_floating_axis()方法来设置坐标轴位置。
加上坐标轴箭头,设置刻度标识位置
ax.axis["x"].set_axisline_style("->", size = 2.0)
ax.axis["y"].set_axisline_style("->", size = 2.0)
ax.axis["x"].set_axis_direction('top')
ax.axis["y"].set_axis_direction('left')
画上y=sin(t)折线图,设置刻度范围,设置刻度标识,设置坐标轴位置
t = np.linspace(0, 2*np.pi)
y = np.sin(t)
ax.plot(t, y, color = 'red', linewidth = 2)
plt.title('y = 2sin(2t)',fontsize = 14, pad = 20)
#
ax.set_xticks(np.linspace(0.25,1.25,5)*np.pi)
ax.set_xticklabels(['$\\frac{\pi}{4}$','$\\frac{\pi}{2}$', '$\\frac{3\pi}{4}$', '$\pi$', '$\\frac{5\pi}{4}$', '$\\frac{3\pi}{2}$'])
ax.set_yticks([0, 1, 2])
#设置刻度标识显示
ax.set_xlim(-0.5*np.pi,1.5*np.pi)
ax.set_ylim(-2, 2)
plt.show()
在matplotlib中公式打印可以使用Latex格式。
由于在新建坐标轴中设定了轴的通过点,所以通过设置坐标轴范围,可以间接移动坐标轴在图中的位置(一般放在最后作为最后的设定,如果放在前面,可能后续有方法使得值域超过该范围,系统会自动适应,导致显示不能达到我们的预想)。
import numpy as np
import matplotlib.pyplot as plt
import mpl_toolkits.axisartist as axisartist
fig = plt.figure('Sine Wave', (10,8))
ax = axisartist.Subplot(fig, 1,1,1)
fig.add_axes(ax)
ax.axis[:].set_visible(False)
ax.axis["x"] = ax.new_floating_axis(0, 0)
ax.axis["y"] = ax.new_floating_axis(1, 0)
ax.axis["x"].set_axis_direction('top')
ax.axis["y"].set_axis_direction('left')
ax.axis["x"].set_axisline_style("->", size = 2.0)
ax.axis["y"].set_axisline_style("->", size = 2.0)
t = np.linspace(0, 1*np.pi)
y = 2*np.sin(2*t)
ax.plot(t, y, color = 'red', linewidth = 2)
plt.title('y = 2sin(2t)',fontsize = 14, pad = 20)
ax.set_xticks(np.linspace(0.25,1.25,5)*np.pi)
ax.set_xticklabels(['$\\frac{\pi}{4}$','$\\frac{\pi}{2}$', '$\\frac{3\pi}{4}$', '$\pi$', '$\\frac{5\pi}{4}$', '$\\frac{3\pi}{2}$'])
ax.set_yticks([0, 1, 2])
ax.set_xlim(-0.5*np.pi,1.5*np.pi)
ax.set_ylim(-2.2, 2.2)
plt.show()