Как назначить разные позиции для каждой группы на морском скрипке? - PullRequest
0 голосов
/ 09 октября 2018

Форма участка скрипки полезна для визуализации распределения данных сгруппированных данных.Размер каждой группы также можно визуализировать как область «скрипки».

Но если данные неоднородны, width определенной группы слишком мал, чтобы показать какую-либо значимую информацию (группа Пт вРисунок 1).Для увеличения размера сюжета в морской скрипке есть опция width.

Однако, как только группа малого размера будет увеличена до подходящего масштаба, большие станут «слишком большими» (группа Sat inРисунок 2) и накладываются друг на друга.

Таким образом, мой вопрос , как назначить различную зияющую дистанцию ​​для скрипки в морском заливе.

Демонстрация

Код для генерации рисунка 1:

import seaborn as sns

tips = sns.load_dataset("tips")
ax = sns.violinplot(x="day", y="total_bill", hue="sex",
                    data=tips, palette="Set2", split=True,
                    scale="count", inner="stick",
                    scale_hue=False, bw=.2)

Рисунок 1

fig1

Код для генерации рисунка 2:

import seaborn as sns

tips = sns.load_dataset("tips")
ax = sns.violinplot(x="day", y="total_bill", hue="sex",
                    data=tips, palette="Set2", split=True,
                    scale="count", inner="stick", width=2.5
                    scale_hue=False, bw=.2) 

Рисунок 2

fig2

Каково ваше решение?

  • Первая попытка - увеличить ширину фигуры, но она выглядит ужасно и оставляет слишком много пустого пространства на фигуре.

  • Я пытался отобразить данные категории по оси x в числовую форму с разным расстоянием между ними.

tips["day_n"] = tips["day"].map(dict(zip(tips["day"].unique(), [1, 2, 4, 6])))

Но кажется, что seaborn не поддерживает числовые данные, расстояние между группами остается неизменным или портится при переключении оси x, y.

Код для генерации рисунка 3:

ax = sns.violinplot(y="day_n", x="total_bill", hue="sex",
                    data=tips, palette="Set2", split=True,
                    scale="count", inner="stick", width=2.5,
                    scale_hue=False, bw=.2)

Рисунок 3

fig3

  • Аналогичный вопрос в stackoverflow, указывая, что есть опция positions для matplotlib.Но это не работает и для морского рожка.

1 Ответ

0 голосов
/ 10 октября 2018

Использование параметра order позволяет получить позиции [1, 2, 4, 6] на оси x:

import seaborn as sns, matplotlib.pyplot as plt

tips = sns.load_dataset("tips")
ax = sns.violinplot(x="day", y="total_bill", hue="sex",
                    data=tips, palette="Set2", split=True,
                    scale="count", inner="stick",
                    scale_hue=False, bw=.2, width=2.5,
                    order=('Thur', 'Fri', '', 'Sat', '', 'Sun'))

# get rid of ticks for empty columns (levels)
ax.set_xticks([0,1,3,5])
ax.set_xticklabels(['Thur', 'Fri', 'Sat', 'Sun'])

plt.show()

Вот результат: violinplot

...