Matplotlib plot_日期x轴标签按天关闭,部分缺失
我有一个脚本,它使用matplotlib的plot_date函数将查询结果转换为timeseries可视化。它过去工作得很好,但在某个时候不太清楚为什么日期开始出现问题 以下是基本数据: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
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")