ax.boxplot
возвращает словарь со всеми линиями, которые строятся при построении прямоугольника и усов. Один из вариантов - опросить этот словарь и создать метки из содержащейся в нем информации. Соответствующие ключи:
boxes
для IQR
medians
для медианы
caps
для усов
fliers
для выбросов
Обратите внимание, что приведенная ниже функция действительно работает только для одного коробочного графика (если вы создаете несколько блоков за один раз, вам нужно быть более осторожным при получении информации из словаря).
Альтернативой может быть поиск информации из самого массива данных (найти медиану и IQR очень просто). Я не уверен точно, как matplotlib определяет, что такое листовка и куда должны идти шапки Если вы хотите это сделать, вам будет достаточно легко изменить приведенную ниже функцию.
import matplotlib.pyplot as plt
import numpy as np
# Make some dummy data
np.random.seed(1)
dummy_data = np.random.lognormal(size=40)
def make_labels(ax, boxplot):
# Grab the relevant Line2D instances from the boxplot dictionary
iqr = boxplot['boxes'][0]
caps = boxplot['caps']
med = boxplot['medians'][0]
fly = boxplot['fliers'][0]
# The x position of the median line
xpos = med.get_xdata()
# Lets make the text have a horizontal offset which is some
# fraction of the width of the box
xoff = 0.10 * (xpos[1] - xpos[0])
# The x position of the labels
xlabel = xpos[1] + xoff
# The median is the y-position of the median line
median = med.get_ydata()[1]
# The 25th and 75th percentiles are found from the
# top and bottom (max and min) of the box
pc25 = iqr.get_ydata().min()
pc75 = iqr.get_ydata().max()
# The caps give the vertical position of the ends of the whiskers
capbottom = caps[0].get_ydata()[0]
captop = caps[1].get_ydata()[0]
# Make some labels on the figure using the values derived above
ax.text(xlabel, median,
'Median = {:6.3g}'.format(median), va='center')
ax.text(xlabel, pc25,
'25th percentile = {:6.3g}'.format(pc25), va='center')
ax.text(xlabel, pc75,
'75th percentile = {:6.3g}'.format(pc75), va='center')
ax.text(xlabel, capbottom,
'Bottom cap = {:6.3g}'.format(capbottom), va='center')
ax.text(xlabel, captop,
'Top cap = {:6.3g}'.format(captop), va='center')
# Many fliers, so we loop over them and create a label for each one
for flier in fly.get_ydata():
ax.text(1 + xoff, flier,
'Flier = {:6.3g}'.format(flier), va='center')
# Make the figure
red_diamond = dict(markerfacecolor='r', marker='D')
fig3, ax3 = plt.subplots()
ax3.set_title('Changed Outlier Symbols')
# Create the boxplot and store the resulting python dictionary
my_boxes = ax3.boxplot(dummy_data, flierprops=red_diamond)
# Call the function to make labels
make_labels(ax3, my_boxes)
plt.show()