Использование set_xscale с показательной функцией - PullRequest
0 голосов
/ 02 июля 2019

Я пытаюсь использовать экспоненциальную шкалу на оси. Я посмотрел этот пост: Как я могу экспоненциально масштабировать ось Y с помощью 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

Я полагаю, это потому, что он пытается получить лог отрицательного или нулевого значения. Однако на графике I такого значения нет.

Я знаю, что мог бы получить подобный график, если бы отобразил соответствующее логнормальное распределение. Однако причина, по которой я должен сделать это, как я описал, заключается в том, что я планирую отображать более сложные функции плотности вероятности с более сложными функциями xscale.

Спасибо за помощь!

1 Ответ

1 голос
/ 02 июля 2019

Автоматическое масштабирование может привести к путанице в использовании используемого масштаба.Поскольку set_scale("function", ...) - это довольно новый API, вероятно, не все детали идеально подходят.

Так что здесь необходимо установить пределы вручную, например, с помощью

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

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...