你可以做log计算然后绘制数据,如果你想要相同的刻度标签,你可以使用FuncFormatter:
import sympy
import matplotlib.pyplot as plt
from matplotlib.ticker import FuncFormatter
x = [0, 1, 2]
y = [sympy.Float('1e-20'), sympy.Float('1e-100'), sympy.Float('1e-700')]
def log_formatter(x, pos):
return "$10^{{{:d}}}$".format(int(x))
formatter = FuncFormatter(log_formatter)
fig, ax = plt.subplots()
y2 = list(map(lambda x:sympy.log(x, 10), y))
ax.plot(x, y2)
ax.yaxis.set_major_formatter(formatter)
ax.grid();
编辑
要添加对数刻度的次要刻度,您可以创建一个Locator:
import sympy
import matplotlib.pyplot as plt
from matplotlib.ticker import FuncFormatter, Locator
x = [0, 1, 2]
y = [sympy.Float('1e-20'), sympy.Float('1e-100'), sympy.Float('1e-700')]
def log_formatter(x, pos):
return "$10^{{{:d}}}$".format(int(x))
class LogMinorLocator(Locator):
def __call__(self):
majorlocs = self.axis.get_majorticklocs()
step = majorlocs[1] - majorlocs[0]
res = majorlocs[:, None] + np.log10(np.linspace(1, 0.1, 10)) * step
return res.ravel()
formatter = FuncFormatter(log_formatter)
fig, ax = plt.subplots(figsize=(12, 8))
y2 = list(map(lambda x:sympy.log(x, 10), y))
ax.plot(x, y2)
ax.minorticks_on()
ax.yaxis.set_major_formatter(formatter)
ax.yaxis.set_minor_locator(LogMinorLocator())
ax.grid();
这是输出: