Я хочу построить блок-график со средним значением + (-) 2 * std в качестве предельных значений Whisker. Однако boxplot() может устанавливать только верхние значения усов как значения процентилей. например
# The code below plot a boxplot that has cap values equal to 5th and 95th percentiles.
boxplot(data_list,Whis = [5,95])
Учитывая, что мое распределение не является нормальным, то 95-й/5-й процентили не будут (среднее + 2 стандартное значение)/(среднее значение - 2 стандартного значения). Следовательно, неточно использовать значения 5/95-го процентиля для представления среднего + (-) 2 * стандартное значение.
Мой вопрос: как я могу получить коробку с настраиваемыми значениями шапки усов? Большое спасибо
Я не думаю, что boxplot может удовлетворить ценности Whisker. Вот почему я спросил здесь.
Если вы думаете, что они не могут быть настроены, почему вы спросили. Прочтите Учебники по Matplotlib — почти все можно настроить, Whiskers — это Artists
— у них есть свойства и методы.
Были ли какие-либо решения из примера Boxplots в галерее полезными?
В документации boxplot есть ссылка на источник — вы сможете увидеть, как рассчитываются и позиционируются усы, что должно дать вам отправную точку.
Спасибо чувак. Я читал учебник и документацию несколько раз. Интересно, есть ли способ создать коробку с настраиваемыми значениями усов?
Извините, чувак, я не думаю, что ясно излагаю свой вопрос. Мой вопрос заключается в том, что максимальное значение boxplot (Конец усов) может быть установлено только как значение процентилей. Однако я хочу установить значение ограничения как среднее + (-) 2 * стандартное значение. среднее значение +(-) 2*std, не равное никаким процентильным значениям. Как я могу это сделать?
Matplotlib не предоставляет никаких средств для указания усов, кроме как квантилей. Если вы хотите использовать среднее значение и стандартное отклонение, умноженное на ± 2, вам нужно будет свернуть свои собственные значения, т. Е. Преобразовать эти значения в процентили и предоставить их в качестве параметров whis
.
Пример:
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(42)
data = np.random.normal(size=10_000)
mean = np.mean(data)
std = np.std(data)
whis = np.interp([mean-2*std, mean+2*std], np.sort(data), np.linspace(0,1,data.size)) * 100
fig, (axl,axr) = plt.subplots(ncols=2)
axl.set_title('Default')
axl.boxplot(data)
axr.set_title(f'μ ± 2σ ({mean-2*std:.2f}, {mean+2*std:.2f})')
axr.boxplot(data, whis=whis, usermedians=[mean])
Есть одно предостережение: усы рисуются не от заданного первого до заданного второго значения процентиля (параметр whis
), а скорее от самой низкой точки данных над первой до самой высокой точки данных ниже значения второй процентили. Вот почему для относительно небольших наборов данных усы заканчиваются на графике, чтобы не точно соответствовать μ ± 2σ.
Но имейте в виду, что это больше не сюжет с коробкой и усами, поэтому вы должны четко описать, что вы здесь замышляете, иначе люди будут введены в заблуждение.
код красивый и чистый (так что +1). Я также нахожу усы неинтуитивными и использую специально нарисованный блок-график (но в MATLAB). В любом случае: одно предупреждение (в основном для ОП): я предпочитаю, чтобы усы были на квантиле 5% и 95%. Это может быть трудно читать, если ящичковая диаграмма представляет не квантили, а кратные стандартному отклонению (которое надеется получить гауссово распределение данных...)
Большое спасибо. Ваш комментарий очень полезен.
Добро пожаловать в СО. Это не дискуссионный форум или учебник.