Самый элегантный способ изменить грязные и перекрывающиеся метки даты ниже оси X?(Сиборн, барплот) - PullRequest
0 голосов
/ 29 ноября 2018

df (Pandas DataFrame) имеет два столбца: Date (как datetime64) и Amount (как float).

Я строю значения из столбца Amount в зависимости от времени, используя график:

sns.barplot(x="Date", y="Amount", data=df)
plt.show()

Тем не менее, метки даты - ужасный беспорядок (см. Рисунок).Что было бы элегантным способом борьбы с этим в Пандах?Я рассматриваю удаление месяца и года из этикетки или поворот этикетки на 90 градусов.Как это будет сделано, или есть лучший вариант?Спасибо.

Overlapping date labels on x axis

Ответы [ 2 ]

0 голосов
/ 23 марта 2019

Другое решение, если у вас большое количество дат и вы хотите пометить их с более редким интервалом;

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

# dummy data:
df = pd.DataFrame({'Date':pd.to_datetime(['1999-12-12', '2000-12-12', '2001-12-12',
                                          '2002-12-12', '2003-12-12', '2004-12-12',
                                          '2005-12-12','2006-12-12', '2007-12-12', '2008-12-12']),
                                          'Amount':[1,2,3,4,5,6,7,8,9,10]})

fig, ax = plt.subplots()
sns.barplot(x="Date", y="Amount", data=df, ax=ax)

# set the frequency for labelling the xaxis
freq = int(2)

# set the xlabels as the datetime data for the given labelling frequency,
# also use only the date for the label
ax.set_xticklabels(df.iloc[::freq].Date.dt.date)
# set the xticks at the same frequency as the xlabels
xtix = ax.get_xticks()
ax.set_xticks(xtix[::freq])
# nicer label format for dates
fig.autofmt_xdate()

plt.tight_layout()
plt.show()

Нажмите, чтобы увидеть график

Также стоит подумать об использовании значений по умолчанию на графике морского побережья и размещении дат на яси для простоты чтения, но это более личное предпочтение.

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

# set the seaborn asthetics
sns.set()

# dummy data:
df = pd.DataFrame({'Date':pd.to_datetime(['1999-12-12', '2000-12-12', '2001-12-12',
                                          '2002-12-12', '2003-12-12', '2004-12-12',
                                          '2005-12-12','2006-12-12', '2007-12-12', '2008-12-12']),
                                          'Amount':[1,2,3,4,5,6,7,8,9,10]})

fig, ax = plt.subplots()
# plot with a horizontal orientation
sns.barplot(y="Date", x="Amount", data=df, ax=ax, orient='h')

# set the frequency for labelling the yaxis
freq = int(2)

# set the ylabels as the datetime data for the given labelling frequency,
# also use only the date for the label
ax.set_yticklabels(df.iloc[::freq].Date.dt.date)
# set the yticks at the same frequency as the ylabels
ytix = ax.get_yticks()
ax.set_yticks(ytix[::freq])

plt.tight_layout()
plt.show()

Нажмите, чтобы увидеть более приятный график

0 голосов
/ 29 ноября 2018

Я бы сделал и то и другое: вращайте свои xlabels и используйте только даты:

import seaborn as sns
import matplotlib.pyplot as plt

# dummy data:
df = pd.DataFrame({'Date':pd.to_datetime(['1999-12-12', '2000-12-12', '2001-12-12']),'Amount':[1,2,3]})

sns.barplot(x="Date", y="Amount", data=df)
# use the original locations of your xticks, and only the date for your label
# rotate the labels 90 degrees using the rotation argument
plt.xticks(plt.xticks()[0], df.Date.dt.date, rotation=90)
plt.tight_layout()
plt.show()

enter image description here

...