Как создать график для визуализации правила 68–95–99,7?

Я создал график нормального распределения следующим образом:

fig, ax = plt.subplots()
ax.set_title('Плотнось распределения вероятности')
ax.set_xlabel('x')
ax.set_ylabel('f(x)')
x = np.linspace(148, 200, 100) # X от 148 до 200
y = (1 / (5 * math.sqrt(2*math.pi))) * np.exp((-(x-178)**2) / (2*5**2))
ax.plot(x, y)
plt.show()

Но мне также нужно добавить вертикальные линии внутри области графика, раскрасить внутренние сегменты и добавить метки, как на картинке, на оси = 0.

Как создать график для визуализации правила 68–95–99,7?

Как я могу сделать это на питоне, используя matplotlib?

Я пытался использовать plt.axvline, но вертикальные линии выходят за пределы моего основного сюжета:

plt.axvline(x = 178, color = 'g', label = 'axvline - full height')
plt.axvline(x = 178+5, color = 'b', label = 'axvline - full height')
plt.axvline(x = 178-5, color = 'b', label = 'axvline - full height')
plt.axvline(x = 178+5*2, color = 'r', label = 'axvline - full height')
plt.axvline(x = 178-5*2, color = 'r', label = 'axvline - full height')

Как создать график для визуализации правила 68–95–99,7?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Линейную версию можно реализовать с помощью vlines , но обратите внимание, что ваш эталонный рисунок может быть лучше воспроизведен с помощью fill_between.


Линейная версия

Вместо axvline используйте vlines, который поддерживает границы ymin и ymax.

Измените свой y на лямбда f(x, mu, sd) и используйте его для определения границ ymax:

# define y as a lambda f(x, mu, sd)
f = lambda x, mu, sd: (1 / (sd * (2*np.pi)**0.5)) * np.exp((-(x-mu)**2) / (2*sd**2))

fig, ax = plt.subplots(figsize=(8, 3))
x = np.linspace(148, 200, 200)
mu = 178
sd = 5
ax.plot(x, f(x, mu, sd))

# define 68/95/99 locations and colors
xs = mu + sd*np.arange(-3, 4)
colors = [*'yrbgbry']

# draw lines at 68/95/99 points from 0 to the curve
ax.vlines(xs, ymin=0, ymax=[f(x, mu, sd) for x in xs], color=colors)

# relabel x ticks
plt.xticks(xs, [f'${n}\sigma$' if n else '0' for n in range(-3, 4)])

line version


Затененная версия

Используйте fill_between, чтобы лучше воссоздать образец фигуры. Определите заштрихованные границы с помощью параметра where:

fig, ax = plt.subplots(figsize=(8, 3))
x = np.linspace(148, 200, 200)
mu = 178
sd = 5
y = (1 / (sd * (2*np.pi)**0.5)) * np.exp((-(x-mu)**2) / (2*sd**2))
ax.plot(x, y)

# use `where` condition to shade bounded regions
bounds = mu + sd*np.array([-np.inf] + list(range(-3, 4)) + [np.inf])
alphas = [0.1, 0.2, 0.5, 0.8, 0.8, 0.5, 0.2, 0.1]
for left, right, alpha in zip(bounds, bounds[1:], alphas):
    ax.fill_between(x, y, where=(x >= left) & (x < right), color='b', alpha=alpha)

# relabel x ticks
plt.xticks(bounds[1:-1], [f'${n}\sigma$' if n else '0' for n in range(-3, 4)])

shaded version

Чтобы обозначить проценты области, добавьте текстовые объекты в середине ограниченных областей:

midpoints = mu + sd*np.arange(-3.5, 4)
percents = [0.1, 2.1, 13.6, 34.1, 34.1, 13.6, 2.1, 0.1]
colors = [*'kkwwwwkk']
for m, p, c in zip(
    midpoints, # midpoints of bounded regions
    percents,  # percents captured by bounded regions
    colors,    # colors of text labels
):
    ax.text(m, 0.01, f'{p}%', color=c, ha='center', va='bottom')

shaded version labeled

Другие вопросы по теме