Seaborn tsplot 不能很好地在 x 轴上显示日期时间

2024-01-01

下面我有以下脚本,它创建了一个简单的时间序列图:

%matplotlib inline
import datetime
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

fig, ax = plt.subplots()

df = []
start_date = datetime.datetime(2015, 7, 1)
for i in range(10):
    for j in [1,2]:
        unit = 'Ones' if j == 1 else 'Twos'
        date = start_date + datetime.timedelta(days=i)
        
        df.append({
                'Date': date.strftime('%Y%m%d'),
                'Value': i * j,
                'Unit': unit
            })
    
df = pd.DataFrame(df)

sns.tsplot(df, time='Date', value='Value', unit='Unit', ax=ax)
fig.autofmt_xdate()

结果如下:

正如您所看到的,x 轴的日期时间有奇怪的数字,而不是通常的“好的”表示形式matplotlib和其他绘图实用程序。我尝试了很多方法,重新格式化数据,但它从来没有干净过。有人知道解决方法吗?


Matplotlib 将日期表示为浮点数(以天为单位),因此除非您(或 pandas 或 seaborn)告诉它您的值表示日期,否则它不会将刻度格式化为日期。我不是seaborn专家,但看起来它(或pandas)确实转换了datetime对象到 matplotlib 日期,但随后没有为轴分配正确的定位器和格式化程序。这就是为什么你会得到这些奇怪的数字,实际上只是自 0001.01.01 以来的日子。因此,您必须手动处理蜱虫(在大多数情况下,无论如何,这更好,因为它给您更多的控制权)。

所以你必须分配一个日期定位器 http://matplotlib.org/api/dates_api.html#date-tickers,它决定在哪里放置刻度线,以及日期格式化程序 http://matplotlib.org/api/dates_api.html#matplotlib.dates.DateFormatter,然后它将格式化刻度标签的字符串。

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

# build up the data
df = []
start_date = datetime.datetime(2015, 7, 1)
for i in range(10):
    for j in [1,2]:
        unit = 'Ones' if j == 1 else 'Twos'
        date = start_date + datetime.timedelta(days=i)

        # I believe it makes more sense to directly convert the datetime to a
        # "matplotlib"-date (float), instead of creating strings and then let
        # pandas parse the string again
        df.append({
                'Date': mdates.date2num(date),
                'Value': i * j,
                'Unit': unit
            })
df = pd.DataFrame(df)

# build the figure
fig, ax = plt.subplots()
sns.tsplot(df, time='Date', value='Value', unit='Unit', ax=ax)

# assign locator and formatter for the xaxis ticks.
ax.xaxis.set_major_locator(mdates.AutoDateLocator())
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y.%m.%d'))

# put the labels at 45deg since they tend to be too long
fig.autofmt_xdate()
plt.show()

Result:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Seaborn tsplot 不能很好地在 x 轴上显示日期时间 的相关文章

随机推荐