【问题标题】:How to set dates in x axis with non-uniform interval?如何以非均匀间隔在 x 轴上设置日期?
【发布时间】:2011-11-13 05:34:34
【问题描述】:

我想使用matplotlib.dates 模块绘制时间图。从教程中,我知道如何设置定期间隔日期,如下所示:

ax.xaxis.set_major_locator(DayLocator())
ax.xaxis.set_major_formatter(DateFormatter("%Y-%m"))
ax.xaxis.set_minor_...

但是,在我的数据中,缺少几个月。我的 xaxis 日期更像是:1 月、2 月、5 月、7 月、9 月、10 月、9 月……没有形成模式……

我该如何处理这种情况?

【问题讨论】:

  • 你想创建一个散点图,x轴有月份,y轴是值吗?
  • 是的...但情节更可能是线图...
  • 那么你的 x 轴数据怎么样?你不能像plot(times, values)那样创建时间数组、价值数组和提要吗?对不起,如果不是,我不明白你的意思......
  • 是的,这也是一个很好的解决方案...但是如何将x axix设置为日期格式?我的意思是我希望 x 轴看起来像 2009-08, 2010-10 这种东西。提前致谢。
  • 我使用 ticker 手动将 xaxis.setMajorFormatter(FixedFormatter(dateStr)) 设置为我想要的日期格式。我使用 xaxis.set_major_locator(IndexLocator(1, 0)) 来设置日期 str 的位置......但是,你有更体面的方法来做同样的事情吗?

标签: python matplotlib


【解决方案1】:

如果我理解正确,您可能需要使用

matplotlib.ticker.FixedLocator

将标签放置在数据点 1、10 和最后一个的示例:

import pylab as plt
from matplotlib.ticker import FixedLocator
from matplotlib.dates import DateFormatter
import numpy as np
from datetime import datetime

# dates (unequally spaced, but works exactly same for equally spaced dates too)
dates = plt.date2num(datetime(2010,3,1))  + np.array([0, 10, 50, 100, 180, 300])
# just some data
data = dates**2
plt.plot_date(dates,data)

ax = plt.gca()
ax.xaxis.set_major_locator(FixedLocator(dates[[1, 3, len(dates)-1]]))
# for some reason this is needed to get the month displayed too
ax.xaxis.set_major_formatter(DateFormatter("%Y-%m"))
plt.show()

【讨论】:

  • 这确实改变了标签格式。我唯一需要的是from matplotlib.dates import DateFormatter
  • 嗯,AnneS的问题有点不清楚。但仅使用plot_date 将在图上放置等间距的刻度和标签,即使对于不等间距的数据也是如此。所以,我认为问题是“如何在 x 轴上以不均匀的间隔设置日期 labels”,上面给出了答案。
  • @yosukesabai 好吧,正如上面评论中所述,我认为 DateFormatter 实际上不需要,所以我从代码中删除了它。
【解决方案2】:

从 Mauro 的解决方案开始,我尝试绘制日期不规则间隔的数据对,以便将来某个时候可以找到此 QA。

import pylab as plt
from matplotlib.ticker import FixedLocator
from matplotlib.dates import DateFormatter
import numpy as np
from datetime import datetime

# dates, irregularly spaced
y = 2010, 2010, 2010, 2011, 2011
m =    9,   11,   12,    3,    4


dates = np.array([plt.date2num(datetime(yy,mm,1)) for yy,mm in zip(y,m)])
print dates


# just some data
data = dates**2
print data


plt.plot_date(dates,data)

ax = plt.gca()
# need some more thnking for properly locate which date to label
#ax.xaxis.set_major_locator(FixedLocator(dates[[1, 10, len(dates)-1]]))
ax.xaxis.set_major_formatter(DateFormatter("%Y-%m"))
plt.show()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-01
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    • 2018-01-23
    • 1970-01-01
    • 2019-10-10
    • 1970-01-01
    相关资源
    最近更新 更多