首页 > 解决方案 > 使用带有指数函数的 set_xscale

问题描述

我正在尝试在 xaxis 上使用指数比例。我看过这篇文章:如何使用 matplotlib 以指数方式缩放 Y 轴,但没有找到简单的解决方案。

我认为 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 函数。

谢谢您的帮助!

标签: pythonmatplotlibprobability-density

解决方案


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

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

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

在此处输入图像描述


推荐阅读