Как расширить ящики на ящике Seaborn?

Я пытаюсь создать сгруппированный коробчатый график с помощью Seaborn (Ссылка) , и все поля невероятно узкие - слишком узкие, чтобы увидеть группирующие цвета.

g = seaborn.factorplot("project_code",y="num_mutations",hue="organ",
        data=grouped_donor, kind="box", aspect=3)

введите описание изображения здесь

Если я увеличиваю масштаб или растягиваю изображение в несколько раз по ширине экрана, я вижу поля, но, очевидно, это бесполезно в качестве стандартного изображения.

Похоже, это зависит от количества моих данных; если я рисую только первые 500 точек (из 6000), я получаю видимые, но маленькие прямоугольники. Это могло быть, в частности, связано с большим разбросом моих данных; согласно документации matplotlib boxplot,

По умолчанию [ширина] составляет 0,5 или 0,15x (расстояние между крайними положениями), если оно меньше.

Независимо от причины, на самом графике есть достаточно места для более широких прямоугольников, если бы я мог их просто расширить.

К сожалению, ключевое слово boxplot widths, которое контролирует ширину поля, не является допустимым ключевым словом factorplot, и я не могу найти функцию matplotlib, которая изменяет ширину полосы или поля за пределами самой функции построения графика. Я даже не могу найти никого, кто бы это обсуждал; ближайшим, что я нашел, была ширина линии прямоугольной диаграммы. Какие-либо предложения?


person Lanthala    schedule 26.06.2015    source источник
comment
Можете ли вы дать ссылку на сюжет, который видите? Ящики Seaborn занимают столько горизонтального пространства, сколько могли, поэтому я не уверен, в чем может быть проблема.   -  person mwaskom    schedule 26.06.2015
comment
Также, если вы не можете поделиться своими фактическими данными, попробуйте поделиться кодом, который будет генерировать случайные данные, воспроизводящие проблему; это также может дать вам представление о том, в чем проблема.   -  person mwaskom    schedule 26.06.2015
comment
Похоже, что уровни оттенка идеально вложены в переменную x, я думаю, что это ваша проблема. Просто удали hue="organ".   -  person mwaskom    schedule 26.06.2015
comment
Кроме того, приведенный выше снимок экрана был сделан после запуска plt.yscale ('log') для изменения масштаба оси.   -  person Lanthala    schedule 26.06.2015
comment
Вы правы, удаление hue = organ привело к тому, что все поля расширились, чтобы заполнить доступную ширину! Означает ли это, что нет возможности использовать factorplot для цветовой кодировки моих проектов по органам?   -  person Lanthala    schedule 26.06.2015
comment
Если вы передадите имя цветовой палитры в аргумент ключевого слова palette, он раскрасит переменную x.   -  person mwaskom    schedule 26.06.2015
comment
К сожалению, в данном случае цветовое кодирование по X мне не поможет, потому что каждый орган связан с несколькими проектами. Я надеялся использовать сгруппированные коробчатые диаграммы, чтобы прояснить, какой проект от какого органа, но похоже, что независимо от того, каким образом я группирую вещи (оттенок = орган или оттенок = project_id), прямоугольники получаются слишком тонкими. Спасибо за вашу помощь!   -  person Lanthala    schedule 26.06.2015
comment
... подождите, я думаю, я понимаю, что вы имеете в виду. Я могу жестко запрограммировать палитру, которая раскрашивает проекты по органам, и передавать ее в factorplot. Утомительно, но это сработает! Спасибо!   -  person Lanthala    schedule 26.06.2015
comment
palette = df["organ"].map(pal_dict) где pal_dict имеет органы как ключи и цвета как значения, должно помочь.   -  person mwaskom    schedule 27.06.2015
comment
Это действительно помогло! Я добавил легенду, используя код из последнего ответа здесь, и все именно так, как я представил это :)   -  person Lanthala    schedule 27.06.2015
comment
Не могли бы вы рассказать, как вы добавили легенду? У меня такая же проблема с коробчатым сюжетом морского дна. Я решил это с помощью решения в этом посте (удалив «оттенок»), но я не могу добавить легенду ...   -  person Nicole Goebel    schedule 24.03.2016


Ответы (2)


Для справки в будущем, вот соответствующие фрагменты кода, которые образуют правильный рисунок с легендой: (очевидно, что здесь отсутствуют важные вещи и на самом деле не работает как есть, но, надеюсь, он показывает сложные части)

import matplotlib.pylab as pyp
import seaborn as sns

def custom_legend(colors,labels, legend_location = 'upper left', legend_boundary = (1,1)):
    # Create custom legend for colors
    recs = []
    for i in range(0,len(colors)):
        recs.append(mpatches.Rectangle((0,0),1,1,fc=colors[i]))
    pyp.legend(recs,labels,loc=legend_location, bbox_to_anchor=legend_boundary)

# Color boxplots by organ
organ_list = sorted(df_unique(grouped_samples,'type'))
colors = sns.color_palette("Paired", len(organ_list))
color_dict = dict(zip(organ_list, colors))
organ_palette = grouped_samples.drop_duplicates('id')['type'].map(color_dict)

# Plot grouped boxplot
g = sns.factorplot("id","num_mutations",data=grouped_samples, order=id_list, kind="box", size=7, aspect=3, palette=organ_palette)
sns.despine(left=True)
plot_setup_pre()
pyp.yscale('log')
custom_legend(colors,organ_list)    
person Lanthala    schedule 26.03.2016

Когда используется sns.boxplot, добавление dodge=False решит эту проблему начиная с версии 0.9.

sns.factorplot() устарел с версии 0.9 и был заменен на catplot(), который также имеет параметр dodge.

person ilyas    schedule 22.10.2018