Pull to refresh

Comments 8

На КДПВ бессмысленный график.

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

Привет) сетка на графиках очень дискуссионная тема - зачастую считается, что ей лучше пренебречь... Графики в данной статье визуализируют тренды, диапазоны метрик, периоды и не призваны дать быструю оценку значений в конкретной точке) Давай посмотрим как они будут выглядеть с сеткой:

Блок кода
plt.figure(figsize=(10,5), dpi=300) # Изменим размер подложки графика и качество

sns.lineplot(data=df_predict, x='month', y='metrics1', hue='year', palette=own_palette, hue_order=df_predict.year.unique()[::-1]) # Отрисуем график

x_unique = df_predict.month.unique()
plt.xticks(ticks=x_unique, fontsize=6) # Изменим подписи делений оси абсцисс
plt.xlim(x_unique.min(), x_unique.max()) # Ограничим ось абсцисс
plt.xlabel('Месяц', fontsize=10) # Изменим подпись оси абсцисс

y_ticks, y_label = plt.yticks() # Получим индексы и подписи оси ординат
plt.yticks(ticks=y_ticks, labels=['{:.0f}'.format(i) for i in y_ticks/10**3], fontsize=8) # Изменим подписи делений оси ординат
plt.ylim(4*10**4, 13*10**4) # Ограничим ось ординат
plt.ylabel('Метрика №1, тыс.шт.', fontsize=12) # Изменим подпись оси ординат

plt.title('Годовое изменение метрики №1 в период 2006-2011 годов', fontsize=16) # Изменим название графика
plt.legend(title='Год', loc='upper right', fontsize=8) # Укажем название и положение легенды и порядок категорий
plt.tight_layout() # Растянем график на всю подложку
plt.grid(True) # Отобразим сетку

Блок кода
plt.figure(figsize=(10,5), dpi=300) # Изменим размер подложки графика и качество

sns.scatterplot(
    data=df_predict, x='metrics2', y='metrics1', hue='year', hue_order=df_predict.year.unique()[::-1], palette=own_palette,
    size='metrics3', sizes=(10, 150),
) # Отрисуем график

x_ticks, x_label = plt.xticks() # Получим индексы и подписи оси ординат
plt.xticks(ticks=x_ticks, labels=['{:.1f}'.format(i) for i in x_ticks/10**6], fontsize=6) # Изменим подписи делений оси абсцисс
plt.xlim(0.1*10**6, 1*10**6) # Ограничим ось абсцисс
plt.xlabel('Метрика №2, млн.шт.', fontsize=10) # Изменим подпись оси абсцисс

y_ticks, y_label = plt.yticks() # Получим индексы и подписи оси ординат
plt.yticks(ticks=y_ticks, labels=['{:.0f}'.format(i) for i in y_ticks/10**3], fontsize=8) # Изменим подписи делений оси ординат
plt.ylim(4*10**4, 13*10**4) # Ограничим ось ординат
plt.ylabel('Метрика №1, тыс.шт.', fontsize=12) # Изменим подпись оси ординат

plt.title('Зависимость метрики №1 от метрики №2', fontsize=16) # Изменим название графика
legend_handles, legend_labels = plt.gca().get_legend_handles_labels() # Получим индексы и подписи оси ординат
# Изменим подписи легенды
legend_labels[0] = 'Год'
legend_labels[7] = 'Метрика №3, млн.шт.'
legend_labels[8:] = ['{:.0f}'.format(float(l)*100) for l in legend_labels[8:]]
plt.legend(legend_handles, legend_labels, loc='lower right', fontsize=8) # Укажем название и положение легенды и порядок категорий
plt.tight_layout() # Растянем график на всю подложку
plt.grid(True) # Отобразим сетку

Я согласен, что так проще и быстрее оценить значение в точке, но вопрос в том, что нужно ли нам это? В любом случае всё зависит от твоего вкуса и запроса заказчика)

Дополнительно хочу показать, как можно акцентировать внимание на некоторых значениях, которые могут нести инсайты)

Блок кода
plt.figure(figsize=(10,5), dpi=300) # Изменим размер подложки графика и качество

sns.lineplot(data=df_predict, x='month', y='metrics1', hue='year', palette=own_palette, hue_order=df_predict.year.unique()[::-1]) # Отрисуем график
plt.axvline(8, 0, 1, color='black', alpha=0.5, dashes=(5, 5))

x_unique = df_predict.month.unique()
plt.xticks(ticks=x_unique, fontsize=6) # Изменим подписи делений оси абсцисс
plt.xlim(x_unique.min(), x_unique.max()) # Ограничим ось абсцисс
plt.xlabel('Месяц', fontsize=10) # Изменим подпись оси абсцисс

y_ticks, y_label = plt.yticks() # Получим индексы и подписи оси ординат
plt.yticks(ticks=y_ticks, labels=['{:.0f}'.format(i) for i in y_ticks/10**3], fontsize=8) # Изменим подписи делений оси ординат
plt.ylim(4*10**4, 13*10**4) # Ограничим ось ординат
plt.ylabel('Метрика №1, тыс.шт.', fontsize=12) # Изменим подпись оси ординат

plt.title('Годовое изменение метрики №1 в период 2006-2011 годов', fontsize=16) # Изменим название графика
plt.legend(title='Год', loc='upper right', fontsize=8) # Укажем название и положение легенды и порядок категорий
plt.tight_layout() # Растянем график на всю подложку

plt.savefig(f'../plot_combine_advanced_line.jpeg') # Сохраним график

Например, здесь мы хотим сказать, что практически внутри каждого года пиковое значение метрики №1 пришлось на восьмой месяц, а затем происходило резкое снижение... Поэтому мы на 2011 год спрогнозировали пик в этом же месяце, хотя год назад пик был в июле)

На мой взгляд, самая грубая и самая распространенная ошибка при построении любого графика - мелкий шрифт подписей. Он обесценивает любые находки для визуализации данных. На всех примерах здесь - текст для меня, человека с хорошим зрением не читаем. Помимо чисто утилитарного недостатка, непропорционально мелкий текст ещё и эстетически неприятен. А вообще статья интересная. В общем, по моим наблюдениям люди довольно редко пользуются возможностями упростить восприятие данных через цветовые мотивы. А это очень мощный инструмент воздействия.

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

Многие аспекты в визуализации это очень субъективные вещи и в конечном итоге важно восприятие конечного заказчика. Если он лучше воспринимает (условно) крупный кегль, цветные подписи осей, столбчатые диаграммы - важно к этому прислушаться)

Возможно, подписи оси абсцисс можно было бы сделать крупнее.. Учту замечание для будущих статей)

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

За картинку с котиком отдельный лайк.

Sign up to leave a comment.