Matplotlib boxplot с использованием предварительно вычисленной (сводной) статистики

Мне нужно сделать boxplot (в Python и matplotlib), но у меня нет исходных "сырых" данных. У меня есть предварительно вычисленные значения для max, min, mean, median и IQR (нормальное распределение), но все же я хотел бы сделать boxplot. Конечно, планировать выбросы невозможно, но кроме этого, я думаю, вся информация есть.

Я искал повсюду, чтобы найти ответ без успеха. Ближе всего я подошел к тому же вопросу, но для R (с которым я не знаком). См.Is можно легко построить boxplot из ранее рассчитанной статистики (в R?)

может кто-нибудь показать мне, как сделать boxplot?

большое спасибо!

2 ответов


в старых версиях вы должны вручную сделать это, изменив элементы boxplot индивидуально:

Mean=[3.4] #mean
IQR=[3.0,3.9] #inter quantile range
CL=[2.0,5.0] #confidence limit
A=np.random.random(50)
D=plt.boxplot(A) # a simple case with just one variable to boxplot
D['medians'][0].set_ydata(Mean)
D['boxes'][0]._xy[[0,1,4], 1]=IQR[0]
D['boxes'][0]._xy[[2,3],1]=IQR[1]
D['whiskers'][0].set_ydata(np.array([IQR[0], CL[0]]))
D['whiskers'][1].set_ydata(np.array([IQR[1], CL[1]]))
D['caps'][0].set_ydata(np.array([CL[0], CL[0]]))
D['caps'][1].set_ydata(np.array([CL[1], CL[1]]))
_=plt.ylim(np.array(CL)+[-0.1*np.ptp(CL), 0.1*np.ptp(CL)]) #reset the limit

enter image description here


благодаря комментарию @tacaswell я смог найти необходимую документацию и придумать пример с использованием Matplotlib 1.4.3. Однако этот пример не позволяет автоматически масштабировать фигуру до нужного размера.

import matplotlib.pyplot as plt

item = {}

item["label"] = 'box' # not required
item["mean"] = 5 # not required
item["med"] = 5.5
item["q1"] = 3.5
item["q3"] = 7.5
#item["cilo"] = 5.3 # not required
#item["cihi"] = 5.7 # not required
item["whislo"] = 2.0 # required
item["whishi"] = 8.0 # required
item["fliers"] = [] # required if showfliers=True

stats = [item]

fig, axes = plt.subplots(1, 1)
axes.bxp(stats)
axes.set_title('Default')
y_axis = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
y_values = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
plt.yticks(y_axis, y_values)

соответствующие ссылки на документацию: