【问题标题】:Matplotlib with dates - changing labels and ticks for monthly data带日期的 Matplotlib - 更改每月数据的标签和刻度
【发布时间】:2017-06-16 15:46:53
【问题描述】:

我有一个这样的数据框:

data_ = list(range(106))
index_ =  pd.period_range('3/1/2004', '12/1/2012', freq='M')
df2_ = pd.DataFrame(data = data_, index = index_, columns = ['data'])

我想绘制这个数据框。目前,我正在使用:

df2_.plot()

现在我喜欢控制 x 轴上的标签(可能还有刻度)。特别是,我喜欢在轴上显示每月刻度,并且可能每隔一个月或每季度标记一个标签。我也喜欢垂直网格线。

我开始查看 this example,但我已经无法构建 timedelta。

【问题讨论】:

标签: python matplotlib


【解决方案1】:

关于构造时间增量,datetime.timdelta() 没有指定月份的参数,所以坚持pd.date_range() 可能更方便。但是,我发现 pandas.tslib.Timestamp 类型的对象不能很好地与 matplotlib 滴答作响,因此您可以将它们转换为 datetime.date 对象,就像这样

index_ = [pd.to_datetime(date, format='%Y-%m-%d').date() 
        for date in pd.date_range('2004-03-01', '2012-12-01', freq="M")]

可以添加网格线和自定义坐标轴标签,方法是首先定义一个 matplotlib 坐标轴对象,然后将其传递给DataFrame.plot()

ax = plt.axes()
df2_.plot(ax=ax)

现在您可以在绘图中添加垂直网格线

ax.xaxis.grid(True)

并通过使用matplotlib.dates.MonthLocator 并将间隔设置为 3 来指定每季度的 xticks 标签

ax.xaxis.set_major_locator(dates.MonthLocator(interval=3))

最后,我发现刻度非常拥挤,所以我对它们进行了格式化以更好地适应

ax.xaxis.set_major_formatter(dates.DateFormatter('%b %y'))
labels = ax.get_xticklabels()
plt.setp(labels, rotation=85, fontsize=8)

生成以下内容:

【讨论】:

  • 您好,谢谢。能否请您描述一下顶部的列表推导究竟是做什么的?
  • 当然,所以对于pd.date_range('2004-03-01', '2012-12-01', freq=“M”) 中的每个日期,将类型pandas.tslib.Timestamp 转换为datetime.date。我这样做是因为当作为 pandas 时间戳传入时,刻度标签在绘图上没有正确显示。
  • 无需更改索引,也无需使用 matplotlib 创建轴。改为这样做:ax = df2_.plot(x_compat=True)
猜你喜欢
  • 1970-01-01
  • 2018-01-24
  • 1970-01-01
  • 2015-06-28
  • 1970-01-01
  • 2017-07-15
  • 1970-01-01
  • 2020-03-29
相关资源
最近更新 更多