将set_xscale与指数函数一起使用

时间:2019-07-02 10:24:19

标签: python matplotlib probability-density

我正在尝试在x轴上使用指数标度。我看过这篇文章: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轴不好: enter image description here

我猜这是因为它试图获取负值或null值的对数。但是,我绘制的曲线中没有这样的值。

我知道,如果我显示对应的对数正态分布,则可以获得相似的图。但是,如上所述,我需要这样做的原因是我打算显示更复杂的概率密度函数和更复杂的xscale函数。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

自动缩放可能会与正在使用的自定义缩放混淆。由于set_scale("function", ...)是一个非常新的API,因此可能不是每个细节都完美无缺。

因此,这里需要手动设置限制,例如通过

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

enter image description here