Боксплот с гистограммой размера распределения сверху и срединной регрессией - PullRequest
0 голосов
/ 13 декабря 2018

Я пытаюсь создать сгруппированный блокпост, представляющий несколько дистрибутивов с разными размерами.Эти размеры должны быть показаны в гистограмме сверху.

Мой текущий код:

import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import numpy.random as rnd

some_x=[1,2,3,7,9,10,11,12,15,18]
x_appearances=[]
data_for_each_x=[]

for i in range(0, len(some_x)):
    rand_int=rnd.randint(10,30)
    data_for_each_x.append([np.random.randn(rand_int)])
    for j in range(0, rand_int):
        x_appearances.append(i)

f, (ax_hist, ax_box) = plt.subplots(2, sharex=True, gridspec_kw={"height_ratios": (.15, .85)})
ax_hist=sns.distplot(x_appearances, kde=False, hist_kws=dict(alpha=0.7), ax=ax_hist, bins=len(some_x))
ax_box = sns.boxplot(data=data_for_each_x, showfliers=False)
plt.xticks(plt.xticks()[0], some_x)

plt.show()

Как это выглядит

Теперь это почтичто я хочу.Однако отметки оси гистограммы не совпадают с отметками прямоугольника.

Также было бы замечательно, если бы был способ включить кривую регрессии высшего порядка (скажем, порядка 3)из медиан.

1 Ответ

0 голосов
/ 13 декабря 2018

Проблема заключалась в том, что у вас было на один номер меньше, чем количество ящиков.Чтобы исправить это, вы должны добавить 1 к числу бинов, а затем вычесть 0,5, чтобы выровнять их (центрированные столбцы) по прямоугольникам прямоугольника.

Теперь я использую arange для создания корзин и затем центрирую их.

f, (ax_hist, ax_box) = plt.subplots(2, sharex=True, gridspec_kw={"height_ratios": (.15, .85)})
ax_hist=sns.distplot(x_appearances, kde=False, hist_kws=dict(alpha=0.7), ax=ax_hist, bins=np.arange(len(some_x)+1)-0.5)
ax_box = sns.boxplot(data=data_for_each_x, showfliers=False)
plt.xticks(plt.xticks()[0], some_x)

enter image description here

...