У меня есть датафрейм, который имеет количество значений на дату (поле даты и времени). Эти значения классифицируются по U ( пользователи ) и S ( сессия ) с использованием столбца Группа . Seaborn используется для визуализации двух коробочных графиков за дату, где оттенок установлен на Group .
Проблема возникает, если учесть, что значения, соответствующие U ( users ), намного больше, чем значения, соответствующие S ( session ), что делает данные S неразборчивыми. Таким образом, мне нужно найти решение, которое позволило бы мне представить обе серии (U и S) на одном и том же рисунке понятным образом.
Интересно, можно ли установить независимые оси Y (с разными масштабами) для каждого оттенка, чтобы отображались обе оси Y (как при использовании twinx
, но без потери возможностей визуализации оттенка).
Любая другая альтернатива будет приветствоваться =)
Бокс-график временного ряда S boxplot:
![The S boxplot time series boxplot](https://i.stack.imgur.com/TzOUF.png)
Комбинированные временные ряды с использованием оттенков. Очевидно, что невозможно увидеть какую-либо информацию о группе S из-за масштаба оси Y:
![The combined boxplot time series using hue. Obviously it's not possible to see any information about the S group because of the scale of the Y axis](https://i.stack.imgur.com/N4V5V.png)
Столбцы кадра данных:
| День (дата / время) | n_data (числовой) | Группа (S или U) |
Строка кода, генерирующая комбинированный блок-график:
seaborn.boxplot(ax=ax,x='Day', y='n_data', hue='Group', data=df,
palette='PRGn', showfliers=False)
Удалось найти решение с помощью twinx:
fig,ax= plt.subplots(figsize=(50,10))
tmpU = groups.copy()
tmpU.loc[tmp['Group']!='U','n_data'] = np.nan
tmpS = grupos.copy()
tmpS.loc[tmp['Group']!='S','n_data'] = np.nan
ax=seaborn.boxplot(ax=ax,x='Day', y = 'n_data', hue='Group', data=tmpU, palette = 'PRGn', showfliers=False)
ax2 = ax.twinx()
seaborn.boxplot(ax=ax2,x='Day', y = 'n_data', hue='Group', data=tmpS, palette = 'PRGn', showfliers=False)
handles,labels = ax.get_legend_handles_labels()
l= plt.legend(handles[0:2],labels[0:2],loc=1)
plt.setp(ax.get_xticklabels(),rotation=30,horizontalalignment='right')
for label in ax.get_xticklabels()[::2]:
label.set_visible(False)
plt.show()
plt.close('all')
Код выше генерирует следующий рисунок:
![the following figure.](https://i.stack.imgur.com/oqVGw.png)
Который в этом случае оказывается слишком плотным для публикации. Поэтому я бы использовал визуализацию, основанную на сюжетах, как предположил Парфе в своем ответе.
Это не было для меня очевидным решением, поэтому я хотел бы поблагодарить Парфе за его / ее ответ.