Matplotlib plot_日期x轴标签按天关闭,部分缺失

Matplotlib plot_日期x轴标签按天关闭,部分缺失,matplotlib,Matplotlib,我有一个脚本,它使用matplotlib的plot_date函数将查询结果转换为timeseries可视化。它过去工作得很好,但在某个时候不太清楚为什么日期开始出现问题 以下是基本数据: 0 = {list} <type 'list'>: [u'2017-07-03', 427] 1 = {list} <type 'list'>: [u'2017-07-10', 201] 2 = {list} <type 'list'>: [u'2017-07-17', 59

我有一个脚本,它使用matplotlib的plot_date函数将查询结果转换为timeseries可视化。它过去工作得很好,但在某个时候不太清楚为什么日期开始出现问题

以下是基本数据:

0 = {list} <type 'list'>: [u'2017-07-03', 427]
1 = {list} <type 'list'>: [u'2017-07-10', 201]
2 = {list} <type 'list'>: [u'2017-07-17', 594]
3 = {list} <type 'list'>: [u'2017-07-24', 525]
4 = {list} <type 'list'>: [u'2017-07-31', 239]
5 = {list} <type 'list'>: [u'2017-08-07', 437]
最后但并非最不重要的一点是,这是图表的结果:

请注意:

有6个数据点,但只有5个日期标签可见 日期上似乎有5天的轮班 我在plot_date函数之前验证了输入;我已经验证了数据上的时区,这不能解释5天的轮班,但仍然;我尝试了不同的格式,并根据建议操纵日期,但似乎没有解决这个问题

有没有人遇到过类似的问题,或者可以在我的代码中发现问题?我花了几个小时试着调试/研究,感觉到目前为止我还没有找到任何地方


[Matplotlib V2.0.2;Python 2.7.13]

要将记号位置精确地固定到数据点所在的日期,您需要使用定位器和格式化程序

定位器应该是matplotlib.ticker.FixedLocator,它根据输入数据设置位置。格式化程序可以是任何matplotlib.dates格式化程序

data = [[u'2017-07-03', 427],
        [u'2017-07-10', 201],
        [u'2017-07-17', 594],
        [u'2017-07-24', 525],
        [u'2017-07-31', 239],
        [u'2017-08-07', 437]]

import matplotlib.pyplot as plt
import matplotlib.dates
import matplotlib.ticker
import datetime

x,y = zip(*data)
f = lambda s: datetime.datetime.strptime(s, '%Y-%m-%d')
x = list(map(f, x))

fig, ax = plt.subplots()
ax.plot(x,y)

loc = matplotlib.ticker.FixedLocator(matplotlib.dates.date2num(x) )
fmt = matplotlib.dates.DateFormatter('%Y-%m-%d')
ax.xaxis.set_major_locator(loc)
ax.xaxis.set_major_formatter(fmt)

fig.autofmt_xdate()
plt.show()

这应该清楚地表明,绘图日期没有问题。我认为问题在于,您希望起始刻度与起始数据对齐,而不是沿着包含数据的相等间隔对齐。编辑:我确实看到你的数据是每周间隔的。您可以使用Locator子类根据自己的喜好操纵xtick位置

import datetime
import matplotlib as mpl
from matplotlib import pyplot as plt

import numpy

old_data = [
    ['2017-07-03', 427],
    ['2017-07-10', 201],
    ['2017-07-17', 594],
    ['2017-07-24', 525],
    ['2017-07-31', 239],
    ['2017-08-07', 437],
]

data = []
for i in old_data:
    d = datetime.datetime.strptime(i[0], '%Y-%m-%d')
    data.append([d,i[1]])

data = numpy.array(data)

fig, ax = plt.subplots(figsize=(8,3))
locator = mpl.dates.DayLocator()
ax.xaxis.set_major_locator(locator)
ax.xaxis.set_major_formatter(mpl.dates.DateFormatter('%Y-%m-%d'))
ax.grid(True)

_=ax.plot_date(data[:,0], data[:,1],linestyle='-')
for tick in ax.get_xticklabels():
    tick.set_rotation(270)
# fig.savefig("date_plot.png")

究竟是什么问题?您显示的绘图似乎完全正确,标签位置正确。如果您想将标签放置在不同的位置,您需要准确地告诉您想要放置标签的位置。正如我最初所写的-我缺少1个标签,而其他标签未与数据点对齐,不在适当的位置,也不在日期内,因此您希望在每个数据点的位置正好有一个标签,在数据点未占用的位置没有标签?我想很明显,这个要求不是默认的,因为如果绘制200个点,它将生成200个标签,这肯定是不需要的。
import datetime
import matplotlib as mpl
from matplotlib import pyplot as plt

import numpy

old_data = [
    ['2017-07-03', 427],
    ['2017-07-10', 201],
    ['2017-07-17', 594],
    ['2017-07-24', 525],
    ['2017-07-31', 239],
    ['2017-08-07', 437],
]

data = []
for i in old_data:
    d = datetime.datetime.strptime(i[0], '%Y-%m-%d')
    data.append([d,i[1]])

data = numpy.array(data)

fig, ax = plt.subplots(figsize=(8,3))
locator = mpl.dates.DayLocator()
ax.xaxis.set_major_locator(locator)
ax.xaxis.set_major_formatter(mpl.dates.DateFormatter('%Y-%m-%d'))
ax.grid(True)

_=ax.plot_date(data[:,0], data[:,1],linestyle='-')
for tick in ax.get_xticklabels():
    tick.set_rotation(270)
# fig.savefig("date_plot.png")