使用 set_xscale 和指数函数

Use of set_xscale with exponential function

我正在尝试在 x 轴上使用指数刻度。我看过这个 post:How can I exponentially scale the Y axis with matplotlib,但没有找到简单的解决方案。

我认为 matplotlib 函数 set_xscale 可以很容易地完成这项工作。但是,以下代码会产生警告并且显示的结果与预期相去甚远:

import numpy as np
from matplotlib import pyplot as plt
from scipy import stats

def forward(x):
    return np.exp(x)

def reverse(x):
    return np.log(x)

# Define a Gaussian probability density function:
mu,std=6.6,0.75
rv = stats.norm(loc=mu,scale=std)

# x sample
x = np.linspace(mu - 3 * std, mu + 3 * std, 100)

# Display
fig, axes = plt.subplots(2, 1)
axes[0].plot(x, rv.pdf(x), color='r')
axes[0].set_title('linear scale')
axes[1].plot(x, rv.pdf(x), color='r')
axes[1].set_title('exponential scale')
axes[1].set_xscale('function', functions=(forward, reverse))

因此,我收到以下警告: RuntimeWarning: invalid value encountered in log,而且图中的x轴不好:

我猜这是因为它试图获取负值或空值的日志。但是,我绘制的曲线中没有这个值。

我知道如果显示相应的对数正态分布,我可以获得类似的图。然而,我需要按照我描述的那样做的原因是我计划显示更复杂的概率密度函数,以及更复杂的 xscale 函数。

感谢您的帮助!

自动缩放可能会对正在使用的自定义缩放感到困惑。由于 set_scale("function", ...) 是一个相当新的 API,可能不是每个细节都完美契合。

所以这里需要手动设置限制,例如通过

axes[1].set_xlim(x.min(), x.max())