【问题标题】:Matplotlib: Making a line graph's datetime x axis labels look like ExcelMatplotlib:使折线图的日期时间 x 轴标签看起来像 Excel
【发布时间】:2015-04-02 03:19:47
【问题描述】:

我有一个简单的 pandas DataFrame,我将其绘制为折线图:

import matplotlib.pyplot as plt
import pandas as pd

>>>df
            a   b
2010-01-01  9.7 9.0
2011-01-01  8.8 14.2
2012-01-01  8.4 7.6
2013-01-01  9.6 8.4
2014-01-01  8.2 5.5

X 轴的预期格式是标签不使用边距:

fig  = plt.figure(0)
ax = fig.add_subplot(1, 1, 1)
df.plot(ax = ax)

但我想强制将值绘制在年份范围的中间,就像在 excel 中所做的那样:

我已尝试设置 x 轴边距:

ax.margins(xmargin = 1)

但看不出有什么区别。

【问题讨论】:

  • 在 XL 示例中为年份大小的区域使用特定日期的日期有点奇怪。或者,在 matplotlib 示例中只使用年份很奇怪。 (两者都可能是一种不可动摇的文化规范,但它们与情节指标的其余部分不一致。)
  • 你能澄清一下吗?不太清楚你的意思。
  • mpl xlabels 描述了一整年,但与指向特定日期的刻度对齐。 excel 标签指定了一天,但在全年的中间对齐(我假设刻度是年份边界,所以 excel 标签小心地不在它们描述的点之下。)
  • 啊,好吧,所以 matplotlib 中的这种行为是因为一年中的哪一天?
  • 可能。日期时间对象的某些组合是特定日期的,以及 matplotlib 或 pandas 中的默认刻度选择。不过,我并不是真的在谈论 如何 移动刻度标签,而是在谈论如何使含义与情节的物理隐喻保持一致。

标签: python pandas matplotlib


【解决方案1】:

如果您只想移动日期,可以尝试在末尾添加这一行:

ax.set_xlim(ax.get_xlim()[0] - 0.5, ax.get_xlim()[1] + 0.5) 

如果您还需要格式化日期,您可以修改索引或更改绘制的刻度,如下所示: (假设你df.index 是一个datetime 对象)

ax.set_xticklabels(df.index.to_series().apply(lambda x: x.strftime('%d/%m/%Y')))

这将使日期的格式看起来像您的 Excel 示例。

或者您可以将index 更改为您想要的样子,然后致电.plot():

df.index = df.index.to_series().apply(lambda x: x.strftime('%d/%m/%Y'))
print df.index.tolist()

['01/01/2010', '01/01/2011', '01/01/2012', '01/01/2013', '01/01/2014']

而且,如果你 index 不是 datetime 你需要先像这样转换它:

df.index = pd.to_datetime(df.index)

【讨论】:

  • 第一个解决方案对我来说很简单。
猜你喜欢
  • 2021-06-19
  • 2020-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-28
  • 2012-09-23
  • 2015-05-02
  • 2011-01-14
相关资源
最近更新 更多