Matplotlib/Seaborn: Boxplot сворачивается по оси X

Я создаю серию диаграмм, чтобы сравнить разные типы рака друг с другом (на основе 5 категорий). Для построения я использую seaborn/matplotlib. Он отлично работает для большинства типов рака (см. изображение справа), однако в некоторых случаях ось x слегка схлопывается (см. изображение слева) или сильно (см. изображение посередине) https://i.imgur.com/dxLR4B4

Глядя на код, как Seaborn строит график коробки/скрипки github.com/mwaskom/seaborn/blob/36964d7ffba3683de2117d25f224f8ebef015298/seaborn/categorical.py (строка 961)

violin_data = remove_na(group_data[hue_mask])

Я понял, что это происходит, когда слишком много нанов

Есть ли какая-либо возможность предотвратить это разрушение только кодом? Я не хочу изменять свой фрейм данных (замените nans на ноль)

Ниже вы найдете мой код:

boxp_df=pd.read_csv(pf_in,sep="\t",skip_blank_lines=False)
fig, ax = plt.subplots(figsize=(10, 10))
sns.violinplot(data=boxp_df, ax=ax)
plt.xticks(rotation=-45)
plt.ylabel("label")
plt.tight_layout()
plt.savefig(pf_out)

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

Обновление, пытающееся использовать предложенный параметр порядка, приводит к следующему результату: https://i.imgur.com/uSm13Qw.png

Может быть, этот игрушечный пример поможет?

|Cat1|Cat2|Cat3|Cat4|Cat5
|3.93|    |0.52|    |6.01
|3.34|    |0.89|    |2.89
|3.39|    |1.96|    |4.63
|1.59|    |3.66|    |3.75
|2.73|    |0.39|    |2.87
|0.08|    |1.25|    |-0.27

Обновление Судя по всему, проблема не в данных, а в длине заголовка https://github.com/matplotlib/matplotlib/issues/4413

Поэтому я бы закрыл вопрос @Diziet, должен ли я удалить его или моя проблема может помочь другим? Извините, что не включил строку ниже в пример кода:

ax.set_title("VERY LONG TITLE", fontsize=20)

person Ivo Leist    schedule 30.07.2019    source источник
comment
Мне не совсем понятно, как ваш код мог сгенерировать фигуру, которую вы показываете в начале. Согласно вашему коду, вы всегда должны получать цифру 10x10, независимо от содержимого ваших фреймов данных.   -  person Diziet Asahi    schedule 30.07.2019
comment
Ах, хороший улов, это может сбить с толку и других. Я сделал скриншоты двух графиков и загрузил их как одну фигуру, убрав как можно больше пробелов. Я собираюсь загрузить еще один.   -  person Ivo Leist    schedule 30.07.2019
comment
Ваш игрушечный набор данных и код не воспроизводят проблему. Просмотрите минимальный, полный и проверяемый пример.   -  person Diziet Asahi    schedule 30.07.2019
comment
@Diziet также пытался воспроизвести проблему в наборе данных игрушек ... там я понял, что проблема не в данных, а в названии сюжета (см. Обновление). В любом случае, спасибо, что подтолкнули меня привести игрушечный пример   -  person Ivo Leist    schedule 31.07.2019


Ответы (1)


Трудно быть уверенным без данных для проверки, но я думаю, что вы можете передать названия своих категорий/раков в параметр order=. Это заставляет Seaborn использовать/отображать их, даже если они пусты.

например:

tips = sns.load_dataset("tips")
ax = sns.violinplot(x="day", y="total_bill", data=tips, order=['Thur','Fri','Sat','Freedom Day','Sun','Durin\'s Day'])

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

person Diziet Asahi    schedule 30.07.2019
comment
Спасибо за вашу первую мысль, но, к сожалению, это не решило мою проблему (см. обновленный вопрос). Когда я найду время, я предоставлю несколько примеров наборов данных. Где было бы хорошим местом для их загрузки/размещения? - person Ivo Leist; 30.07.2019
comment
Если наборы данных очень большие, было бы лучше создать игрушечный набор данных (т. е. использовать такие вещи, как np.random.random() или np.random.normal(), которые создают фрейм данных с той же общей формой и воспроизводят проблему, с которой вы столкнулись. См. Минимальный, полный и проверяемый пример и Как сделать хорошие воспроизводимые примеры панд - person Diziet Asahi; 30.07.2019
comment
Я собираюсь создать игрушечный набор данных — следите за обновлениями - person Ivo Leist; 30.07.2019