Python: Как напечатать коробку, усы и значения выбросов на диаграммах усов и усов? - PullRequest
0 голосов
/ 12 апреля 2019

Я построил график для блока данных и усов для моих данных

Мой код:

red_diamond = dict(markerfacecolor='r', marker='D')
fig3, ax3 = plt.subplots()
ax3.set_title('Changed Outlier Symbols')
ax3.boxplot(maximum.values[:,1], flierprops=red_diamond)

и получил график следующим образом: enter image description here

Что я хочу сделать: Вывести значения усов, выбросов (красные ромбы), квартилей и медианы на самом графике.

1 Ответ

1 голос
/ 12 апреля 2019

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()

enter image description here

...