Как заставить Seaborn / Matplotlib показывать «что вам дают» на оси X и не предполагать, что я хочу, чтобы тики были равномерно распределены численно - PullRequest
0 голосов
/ 10 января 2020

У меня есть фрейм данных с одним столбцом, который содержит данные ГГГГММ в виде числа с плавающей запятой, а второй столбец содержит сводные данные за месяц.

enter image description here

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

pd.to_datetime(mthly_PL_withDate_df['YearMth'].astype(str), format='%Y%m')

Поэтому, когда я строю график, sns / mpl создает тики оси X, которые численно равномерно распределены когда мои данные 'YearMth' нет. Как мне сказать sns / mpl «просто показать, что вам дают, и не пытайтесь« украсить »это». Я бы подумал, что «показывать то, что вам дают без введения предположений», будет значение по умолчанию.

with sns.axes_style('whitegrid'):
g = sns.relplot(x='YearMth', y='PL', data=mthly_PL_withDate_df, height=5, aspect=1.5)

enter image description here

1 Ответ

1 голос
/ 10 января 2020

Вы используете поплавок по оси X. Для морского родителя нормально предположить, что данные являются числовыми, а не категориальными.

Если вы хотите сохранить даты как числа с плавающей точкой (в данном случае, кстати, строки более корректны), вы можете легко это исправить, установив свойство x_ticks и передав ему столбец YearMth как ax.set_xticks([0,2,4,6]).

Однако этим свойством управляет не seaborn, а базовый пакет matplotlib.pyplot. Таким образом, вам нужно будет немного изменить свой код, чтобы выставить объект subplot и затем передать его в seaborn.

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd

data = [(10, 1), (11, 2), (12, 3), (1000, 4)]
data = pd.DataFrame.from_records(data=data, columns=['x', 'y'])

fig, ax = plt.subplots(figsize = (12,6))
ax.set_title("Plot with controlled ticks")
ax.set_ylabel("Mode data")
ax.set_xlabel("X values with good ticks")
ax.set_xticks(range(0,len(data['x'])))
ax.set_xticklabels(list(data['x']), rotation=45)


rel_plot = sns.relplot(ax=ax, data=data, height=5, aspect=1.5)

Приведенный выше код даст вам ожидаемый результат: enter image description here

В целом, вспомогательные участки дают вам очень точный контроль над визуализацией отображаемых данных ( Вы можете посмотреть полный subplot API здесь ).

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