Python画图小知识点
参考初高中画函数图像的步骤:画出函数
,
的函数图像
第1步:获取函数
,以及其对应的定义域
x = np.linspace(-9, 9, 1000)
y = (np.exp(x) - np.exp(- x))/(np.exp(x) + np.exp(- x))
解释一下这里为什么用np.exp( ): 如果用exp( )或者math.exp( ),会得到错误提示:only size-1 arrays can be converted to Python scalars.
第2步:取出一张纸,思考函数图像要画多大?将纸分为几部分合适?要把函数图像在哪个部分?
2.1 设置绘图对象大小
fig = plt.figure(figsize = (8, 8))
2.2 添加一个绘布对象ax,并将绘布分割成2 * 1个部分,并将fig对象放置在第1个位置
ax = axisartist.Subplot(fig, 2,1,1)
补充一下关于plt.figure(num, figsize, dpi)函数的常用参数
num:这个参数表示你图片保存文件时文件的名称,可以接受str 和 int 类型的参数,如果不设置,则默认从1自增到N
figsize:图片大小的参数,接受(a, b)这样的参数对
dpi:图片的像素密度关于axisartist.Subplot(fig, m, n, position)的参数
fig:当前绘图对象
m 和 n:表示将绘布对象分割成m*n个小块
position:表示将当前绘图对象放置在绘布的第position个小块
第3步:画坐标轴
3.1 首先允许对绘布上的当前绘图对象fig进行操作
fig.add_axes(ax)
3.2 由于python默认的坐标轴是一个矩形,所以首先让矩形四条边(top,bottom,left,right)不可见,方便添加新的坐标轴
ax.axis[:].set_visible(False)
Python默认的坐标系
3.3 向画布对象中添加两条坐标轴x和y,并让其正交
ax.axis["x"] = ax.new_floating_axis(0, 0)
ax.axis["y"] = ax.new_floating_axis(1, 0)
3.4 设置刻度的方向,x轴的刻度在bottom方向,y轴刻度在left方向
ax.axis["x"].set_axis_direction('bottom')
ax.axis["y"].set_axis_direction('left')
3.5 在x和y轴上添加箭头
ax.axis["x"].set_axisline_style("-|>", size = 2.0)
ax.axis["y"].set_axisline_style("-|>", size = 2.0)
画好的直角坐标系
3.6 为坐标轴设定范围
ax.set_xlim(-6.5, 6.5)
ax.set_ylim(-1.1, 1.1)
解释一下,为什么题目要求
的范围是[-6, 6],却将范围设置为[-6.5, 6.5],目的是使坐标轴长度比实际区间长一点,让坐标轴箭头有一定的空间,显得更加美观
3.7 为坐标轴设置自定义刻度
ax.set_xticks([-6,-3, 3, 6])
ax.set_yticks([-1, -0.5, 0.5, 1])
同样的,从之前画好的直角坐标系中看到,原点有两个标注,并不美观,因此直接把想要标的刻度生成一个列表,标注上去,如果嫌麻烦,可以尝试使用MultipleLocator方法,具体用法请自行百度。
3.8 为坐标轴标上标签
ax.axis["x"].label.set_text("x")
ax.axis["y"].label.set_text("y")
坐标轴(个人喜好没有标签)
第4步:画函数图像,并写上函数名称(标题)
4.1 画函数图像
ax.plot(x, y, linewidth = 2, color = 'red')
4.2 写上函数名称
plt.title(r'f(x)', fontstyle = 'italic', fontweight = 'medium', fontsize = 18, pad = 20)
plt.annotate(r'$f(x) = \frac{e^{x} - e^{-x}}{e^{x} + e^{-x}}$', \
xy = (0, 0), \
xycoords = 'data', \
xytext = (+110, +110), \
textcoords = 'offset points', \
fontsize = 12)
标题可以支持markdown语法
最终结果和完整的代码
import numpy as np
import matplotlib.pyplot as plt
import mpl_toolkits.axisartist as axisartist
x = np.linspace(-10, 10, 10000)
y = (np.exp(x) - np.exp(- x))/(np.exp(x) + np.exp(- x))
fig = plt.figure(num = "tanh", figsize = (8, 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_axisline_style("-|>", size = 2.0)
ax.axis["y"].set_axisline_style("-|>", size = 2.0)
ax.axis["x"].set_axis_direction('bottom')
ax.axis["y"].set_axis_direction('left')
ax.set_xticks([-6,-3, 3, 6])
ax.set_yticks([-1, -0.5, 0.5, 1])
ax.set_xlim(-6.5, 6.5)
ax.set_ylim(-1.1, 1.1)
#ax.axis["x"].label.set_text("x")
#ax.axis["y"].label.set_text("y")
plt.title(r'f(x)', fontstyle = 'italic', fontweight = 'medium', fontsize = 18, pad = 20)
plt.annotate(r'$f(x) = \frac{e^{x} - e^{-x}}{e^{x} + e^{-x}}$', xy = (0, 0), xycoords = 'data', xytext = (+110, +110), textcoords = 'offset points', fontsize = 12)
ax.plot(x, y, linewidth = 2, color = 'red')
plt.show()