如何使用 matplotlib 以指数方式缩放 Y 轴

Phi*_*lip 8 python matplotlib

我正在尝试创建一个带有指数(?)Y 轴的 matplotlib 图,就像我在下面模拟的假图一样。对于我的数据,我想在它们接近最大 Y 值时将这些值展开。当 Y 接近零时,我想压缩这些值。

所有正常的“日志”示例都做相反的事情:它们在远离零时压缩值。这当然是“日志”所做的。如何创建指数(?)缩放?

图形

Imp*_*est 6

从 matplotlib 3.1 开始,您可以通过以下方式轻松定义任何自定义比例

ax.set_yscale('function', functions=(forward, inverse))
Run Code Online (Sandbox Code Playgroud)

另见https://matplotlib.org/3.1.1/gallery/scales/scales.html

在这种情况下,例如:

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(1, 40, 100)
y = np.linspace(1, 4, 100)

fig, ax = plt.subplots()
ax.plot(x, y)

exp = lambda x: 10**(x)
log = lambda x: np.log(x)

# Set y scale to exponential
ax.set_yscale('function', functions=(exp, log))
ax.set(xlim=(1,40), ylim=(1,4))
ax.set_yticks([1, 3, 3.5, 3.75, 4.0])

plt.show()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


Tom*_*mmy -1

我假设你指的是 X 轴,因为在你的模拟图中,X 轴是指数的,而不是 Y 轴。

你可以这样做:

...
ax = plt.subplot(111)
ax.plot(Xs,Ys,color='blue',linewidth=2)
....
xlabs = [pow(10,i) for i in range(0,6)]
ax.set_xticklabels(xlabs)
ax.set_xticks(xlabs)
Run Code Online (Sandbox Code Playgroud)

我在这里所做的是手动创建一个包含 6 个 X 的列表,其中每个 X 都由 表示10^i,即10^1,10^2,...。这将放置 X 个刻度线,并在 处正确标记它们[1, 10, 100, 1000, 10000, 100000]。如果您需要更多标签,请更改6.