Scipy нормальная оценка PDF дает противоречивые значения - PullRequest
0 голосов
/ 27 октября 2018

Я пытаюсь записать график, показывающий, что объективная оценка не всегда является лучшей оценкой. Вот код, который я написал, чтобы получить красивую картинку:

# Set up the plot
fig, ax = plt.subplots()
# Create some data
y = np.linspace(-10, 10, 1000)
# Plot two normals, one centered around 0 but with large variance
ax.plot(y, norm.pdf(y, scale=3), 'k-', label=r"pdf of $\hat{\theta_1}$")
# One centered around 1 with small variance
ax.plot(y, norm.pdf(y, loc=1, scale=1), 'r--', label=r"pdf of $\hat{\theta_2}$")
ax.legend()
# Remove left, right and top axis, remove y axis labels and ticks
ax.spines['left'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)
ax.tick_params(axis='y', which='both', left=False, right=False, labelleft=False)
# Remove x axis ticks and labels, keep only one at x=0
ax.set_xticks([0])
ax.set_xticklabels([r"$\theta$"])
# Plot vertical line at x=0 from y=0 to the value of the first pdf
ax.axvline(x=0, ymin=0, ymax=norm.pdf(0, scale=3), linestyle=":")
# Plot second vertical line for second normal distribution
ax.axvline(x=1, ymin=0, ymax=norm.pdf(1, loc=1, scale=1), linestyle=":")
# Remove margins so that pdfs lie on the axis
ax.margins(0)
plt.show(block=True)

По сути, я хочу построить два нормальных распределения: одно с центром в 0, но с большой дисперсией, а другое с 1 и небольшой дисперсией. Затем я хочу добавить две вертикальные линии. Одна строка проходит через x = 0 и достигает значения первого нормального распределения при x = 0, а вторая проходит через x = 1 и достигает значения второго нормального распределения при x = 1. Тем не менее, эти строки намного меньше, я не знаю почему!

plot

Мое единственное предположение, что, поскольку они являются непрерывными PDF, Сципи делает что-то странное, если я оцениваю их в одной точке.

Импорт

Я забыл упомянуть мой импорт, я включил его сюда, чтобы вы могли иметь MWE

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from scipy.stats import norm

1 Ответ

0 голосов
/ 27 октября 2018

Посмотрите документы axvline:

ymax : scalar, optional, default: 1
 Should be between 0 and 1, 0 being the bottom of the plot, 1 the top of the plot.

Ваши строки определены в данных координатах, а не координатах осей.Вам нужно использовать vlines.

# Plot vertical line at x=0 from y=0 to the value of the first pdf
ax.vlines(x=0, ymin=0, ymax=norm.pdf(0, scale=3), linestyle=":")
# Plot second vertical line for second normal distribution
ax.vlines(x=1, ymin=0, ymax=norm.pdf(1, loc=1, scale=1), linestyle=":")

fixed plot

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