ConversionError: Failed to convert value(s) to axis units: '2015-01-01'

ConversionError: Failed to convert value(s) to axis units: '2015-01-01'

我正在尝试将值转换为轴单位。我检查了有类似问题的代码,但 none 解决了这个特定的挑战。如下图所示,预期图 (A) 应该在 x 轴上显示月份(一月、二月等),但它在图 (B) 中显示日期(2015-01 等)。

下面是源码,请大家指教。谢谢

plt.rcParams["font.size"] = 18

plt.figure(figsize=(20,5))
plt.plot(df.air_temperature,label="Air temperature at Frankfurt Int. Airport in 2015")
plt.xlim(("2015-01-01","2015-12-31"))
plt.xticks(["2015-{:02d}-15".format(x) for x in range(1,13,1)],["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"])
plt.legend()
plt.ylabel("Temperature (°C)")
plt.show()

用日期时间绘制图的明智方法是使用 datetime 格式代替 str;所以,首先,你应该做这个转换:

df = pd.read_csv(r'data/frankfurt_weather.csv')
df['time'] = pd.to_datetime(df['time'], format = '%Y-%m-%d %H:%M')

然后就可以随意设置剧情了,最好按照Object Oriented Interface:

plt.rcParams['font.size'] = 18
fig, ax = plt.subplots(figsize = (20,5))

ax.plot(df['time'], df['air_temperature'], label = 'Air temperature at Frankfurt Int. Airport in 2015')

ax.legend()
ax.set_ylabel('Temperature (°C)')

plt.show()

然后你可以自定义:

  • x 刻度的标签格式和位置 matplotlib.dates:

    ax.xaxis.set_major_locator(md.MonthLocator(interval = 1))
    ax.xaxis.set_major_formatter(md.DateFormatter('%b'))
    
  • x轴限制:

    ax.set_xlim([pd.to_datetime('2015-01-01', format = '%Y-%m-%d'),
                 pd.to_datetime('2015-12-31', format = '%Y-%m-%d')])
    
  • 月份名称的 x 刻度标签的首字母大写

    fig.canvas.draw()
    ax.set_xticklabels([month.get_text().title() for month in ax.get_xticklabels()])
    

完整代码

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as md


df = pd.read_csv(r'data/frankfurt_weather.csv')
df['time'] = pd.to_datetime(df['time'], format = '%Y-%m-%d %H:%M')


plt.rcParams['font.size'] = 18
fig, ax = plt.subplots(figsize = (20,5))

ax.plot(df['time'], df['air_temperature'], label = 'Air temperature at Frankfurt Int. Airport in 2015')

ax.legend()
ax.set_ylabel('Temperature (°C)')

ax.xaxis.set_major_locator(md.MonthLocator(interval = 1))
ax.xaxis.set_major_formatter(md.DateFormatter('%b'))

ax.set_xlim([pd.to_datetime('2015-01-01', format = '%Y-%m-%d'),
             pd.to_datetime('2015-12-31', format = '%Y-%m-%d')])

fig.canvas.draw()
ax.set_xticklabels([month.get_text().title() for month in ax.get_xticklabels()])

plt.show()