Seaborn: Violinplot испытывает трудности с большим количеством переменных? - PullRequest
0 голосов
/ 29 мая 2019

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

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

fig, ax = plt.subplots(figsize=(50,5))
ax.set_ylim(-6, 6)

a = sns.violinplot(x='variable', y='value', data=pd.melt(train_norm), ax=ax)
a.set_xticklabels(a.get_xticklabels(), rotation=90);

plt.savefig('massive_violinplot.png', figsize=(50,5), dpi=220)

enter image description here

(извиняюсь за обрезанный график, все слишком велико для публикации)

Принимая во внимание следующий код, использующий тот же pd.Dataframe, но показывающий только первыйшесть переменных, отображаются правильно:

fig, ax = plt.subplots(figsize=(10,5))
ax.set_ylim(-6, 6)

a = sns.violinplot(x='variable', y='value', data=pd.melt(train_norm.iloc[:,:6]), ax=ax)
a.set_xticklabels(a.get_xticklabels(), rotation=90);

plt.savefig('massive_violinplot.png', figsize=(10,5), dpi=220)

enter image description here

Как получить график, подобный приведенному выше, для всех переменных, заполненный правильными графиками скрипки, показывающими ихв KDE?

Любой опытный совет по этому вопросу будет высоко оценен.

РЕДАКТИРОВАТЬ: ссылка на файл CSV, который я использовал для создания данных, находится здесь, yourfilelink.com/get.php?fid=2025783

1 Ответ

1 голос
/ 29 мая 2019

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

rs = np.random.RandomState(42)
data = rs.randn(100, 6)
data[:, :3] *= 20
df = pd.DataFrame(data)

Посмотрите, что произойдет, если мы построим плотность с общими осями, чтобы они были прямо сопоставимы.

df.plot(kind='kde', subplots=True, layout=(3, 2), sharex=True, sharey=True)
plt.tight_layout()

Density with common axes

Это более или менее то же самое, что вы можете увидеть на сюжете скрипки морского волка, но, конечно, транспонировано.

sns.violinplot(x='variable', y='value', data=pd.melt(df))

Default seaborn violin plot

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

Для первой задачи вы можете заставить скрипки использовать все доступное горизонтальное пространство, используя scale='width', но тогда вы больше не сможете сравнивать плотность по переменным. На пиках ширина одинаковая, а плотность - нет.

sns.violinplot(x='variable', y='value', data=pd.melt(df), scale='width')

Seaborn violin plot with scale='width'

Кстати, это то, что по умолчанию делает скрипичный сюжет matplotlib.

plt.violinplot(df.T)

Matplotlib default violin plot.

Что касается второй проблемы, я думаю, что ваш единственный вариант - нормализовать или стандартизировать переменные каким-либо образом.

sns.violinplot(x='variable', y='value', data=pd.melt((df - df.mean()) / df.std()))

Standardized violin plot

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

Мораль этой истории в том, что вы не можете видеть все сразу, вы должны выбирать в зависимости от того, что вы ищете в данных.

...