python绘制对数函数

上一期,我们在探讨对数函数性质的时候,我们画了几个非常漂亮的图,这一期,就把画图的python放上来,设对数函数为

y = l o g a x y=log_a x y=loga​x

其中a>0,且a≠1。对应的指数函数为 y = a x y=a^x y=ax。现在来分情况画出对数函数的图像

a>1

完整代码

# -*- coding: utf-8 -*-
"""
Created on Mon Feb 17 17:32:49 2020
project name:draw_logarithm_figure
@author: 帅帅de三叔
"""
import math
import numpy as np
import matplotlib.pyplot as plt
import mpl_toolkits.axisartist as axisartist #导入坐标轴加工模块
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False

fig=plt.figure(figsize=(6,4)) #新建画布
ax=axisartist.Subplot(fig,111) #使用axisartist.Subplot方法创建一个绘图区对象ax
fig.add_axes(ax) #将绘图区对象添加到画布中

def logarithm_func(x, a=1/2): #定义指数函数
y=math.log(x, a)
return y

X=np.linspace(0.01, 4, 100) #构造自变量组
Y=[logarithm_func(x) for x in X] #求函数值
ax.plot(X, Y, label=r'$0<a<1$') #绘制指数函数
ax.scatter(1, 0, color='red')
plt.legend()
plt.show()

print(max(X), max(Y)) #测试一下自变量最大值和因变量最大值,为后面的坐标轴设置依据
ax.axis[:].set_visible(False) #隐藏原来的实线矩形
ax.axis["x"]=ax.new_floating_axis(0, 0, axis_direction="bottom") #添加x轴
ax.axis["y"]=ax.new_floating_axis(1, 0, axis_direction="bottom") #添加y轴

ax.axis["x"].set_axisline_style("-|>", size=1.0) #给x坐标轴加箭头
ax.axis["y"].set_axisline_style("-|>", size=1.0) #给y坐标轴加箭头

ax.annotate(s='x', xy=(max(X), 0), xytext=(max(X)+1, 0.3)) #标注x轴
ax.annotate(s='y', xy=(0, 1.0), xytext=(-0.2, max(Y)+1)) #标注y轴

plt.xlim(-1, 5) #设置横坐标范围
plt.ylim(-5, 3) #设置纵坐标范围
X_lim=np.arange(int(min(X)), max(X)+1, 1)
ax.set_xticks(X_lim) #设置x轴刻度
Y_lim=np.arange(-3, max(Y)+1, 1)
ax.set_yticks(Y_lim) #设置y轴刻度
ax.annotate(s=r'$y=log_a x$',xy=(1, 1), xytext=(1, 1)) #r'$y=(\frac{1}{2})^x$'

效果图

python绘制对数函数_matplotlib

a>1

完整代码

# -*- coding: utf-8 -*-
"""
Created on Mon Feb 17 17:32:49 2020
project name:draw_logarithm_figure
@author: 帅帅de三叔
"""
import math
import numpy as np
import matplotlib.pyplot as plt
import mpl_toolkits.axisartist as axisartist #导入坐标轴加工模块
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False

fig=plt.figure(figsize=(6,4)) #新建画布
ax=axisartist.Subplot(fig,111) #使用axisartist.Subplot方法创建一个绘图区对象ax
fig.add_axes(ax) #将绘图区对象添加到画布中

def logarithm_func(x, a=2): #定义指数函数
y=math.log(x, a)
return y

X=np.linspace(0.01, 4, 100) #构造自变量组
Y=[logarithm_func(x) for x in X] #求函数值
ax.plot(X, Y, label=r'$a>1$') #绘制指数函数
ax.scatter(1, 0, color='red')
plt.legend()
plt.show()

print(max(X), max(Y)) #测试一下自变量最大值和因变量最大值,为后面的坐标轴设置依据
ax.axis[:].set_visible(False) #隐藏原来的实线矩形
ax.axis["x"]=ax.new_floating_axis(0, 0, axis_direction="bottom") #添加x轴
ax.axis["y"]=ax.new_floating_axis(1, 0, axis_direction="bottom") #添加y轴

ax.axis["x"].set_axisline_style("-|>", size=1.0) #给x坐标轴加箭头
ax.axis["y"].set_axisline_style("-|>", size=1.0) #给y坐标轴加箭头

ax.annotate(s='x', xy=(max(X), 0), xytext=(max(X)+1, 0.3)) #标注x轴
ax.annotate(s='y', xy=(0, 1.0), xytext=(-0.2, max(Y)+1)) #标注y轴

plt.xlim(-1, 5) #设置横坐标范围
plt.ylim(-5, 3) #设置纵坐标范围
X_lim=np.arange(int(min(X)), max(X)+1, 1)
ax.set_xticks(X_lim) #设置x轴刻度
Y_lim=np.arange(-3, max(Y)+1, 1)
ax.set_yticks(Y_lim) #设置y轴刻度
ax.annotate(s=r'$y=log_a x$',xy=(1, 1), xytext=(1, 1)) #r'$y=(\frac{1}{2})^x$'

效果图

a>1

两个代码对比,可以看到,仅改了参数a的初始值和label标签,因为两个函数的定义域和值域是一致的。

对数函数vs指数函数

这两个函数虽然互为反函数,但是定义域和值域不一致,所以需要在定义函数的时候给出不同的自变量取值范围,否则会出现math domain error 。

完整代码

# -*- coding: utf-8 -*-
"""
Created on Tue Feb 18 08:49:21 2020
project name:logarithm_vs_exponential
@author: 帅帅de三叔
"""
import math
import numpy as np
import matplotlib.pyplot as plt
import mpl_toolkits.axisartist as axisartist #导入坐标轴加工模块
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False

fig=plt.figure(figsize=(6,4)) #新建画布
ax=axisartist.Subplot(fig,111) #使用axisartist.Subplot方法创建一个绘图区对象ax
fig.add_axes(ax) #将绘图区对象添加到画布中

def logarithm_func(x, a=2): #定义指数函数
y=math.log(x, a)
return y

def exponential_func(x, a=2): #定义指数函数
y=math.pow(a, x)
return y


X=np.linspace(0.01, 4, 100) #构造自变量组
Y=[logarithm_func(x) for x in X] #求函数值
ax.plot(X, Y, label='对数函数') #绘制指数函数
ax.scatter(1, 0, color='red')

X1=np.linspace(-4, 4, 100)
Y1=[exponential_func(x) for x in X1]
ax.plot(X1, Y1, label='指数函数')
ax.scatter(0, 1, color='red')

ax.plot(X1, X1, color='green', label=r'$y=x$')
plt.legend(loc=2)
plt.show()

print(max(X), max(Y)) #测试一下自变量最大值和因变量最大值,为后面的坐标轴设置依据
ax.axis[:].set_visible(False) #隐藏原来的实线矩形
ax.axis["x"]=ax.new_floating_axis(0, 0, axis_direction="bottom") #添加x轴
ax.axis["y"]=ax.new_floating_axis(1, 0, axis_direction="bottom") #添加y轴

ax.axis["x"].set_axisline_style("-|>", size=1.0) #给x坐标轴加箭头
ax.axis["y"].set_axisline_style("-|>", size=1.0) #给y坐标轴加箭头

ax.annotate(s='x', xy=(max(X), 0), xytext=(max(X)+1, 0.3)) #标注x轴
ax.annotate(s='y', xy=(0, 1.0), xytext=(-0.2, 5)) #标注y轴

plt.xlim(-5, 5) #设置横坐标范围
plt.ylim(-5, 5) #设置纵坐标范围
X_lim=np.arange(-4, 4, 1)
ax.set_xticks(X_lim) #设置x轴刻度
Y_lim=np.arange(-4, 4, 1)
ax.set_yticks(Y_lim) #设置y轴刻度

效果图

a>1

只需要在定义指数函数和对数函数的时候给a赋予不同的参数便可出现不同的形状,下图是a=1/2 时的效果图

python绘制对数函数_matplotlib_04

如果你不会写代码或者还有什么不懂的欢迎来“三行科创”微信公众号留言,同时交流群免费向大家开放,入群讲缘分。

参考文献

https://matplotlib.org/api/_as_gen/matplotlib.pyplot.html

python绘制对数函数_对数函数图形_05