Matplotlib中图表开始/结束处的X轴标签

问题描述:

我已经使用matplotlib和pyplot在Python中创建了温度图,但无法弄清楚如何为x轴上的第一个值添加日期标签,最后的标签。我尝试了多次DayLocator迭代,但无济于事。我希望保持实际情节的边界相同,并希望保持每天的次要刻​​度,如图enter image description here所示,因此在线图的开头或结尾处没有空白空间。数据从06/01到08/30。这里是我完整的代码,它完美地绘制除了06/01最先蜱和08/30非常最后一跳没有显示出来:Matplotlib中图表开始/结束处的X轴标签

import csv 
import pylab 
from datetime import datetime 
from matplotlib import pyplot as plt 
import matplotlib.dates as mdates 

filename ='Summer17.csv' 
with open(filename) as f: 
    reader = csv.reader(f) 
    header_row = next(reader) 

dates_list, temperature, dewpoint = [], [], [] 
for row in reader: 
    if len(row) < 4: 
     continue 
    datestring = ("2017/{0:}/{1:} {2:}".format(*row)) 
    date_obj = datetime.strptime(datestring, "%Y/%m/%d %H:%M") 
    dates_list.append(date_obj) 
    temp = float(row[3]) 
    temperature.append(temp) 




fig = plt.figure(dpi=128, figsize=(10,6)) 
ax = fig.add_axes([0.1, 0.1, 0.85, 0.75]) 
plt.plot(dates_list,temperature, linewidth=0.5, c='red') 
plt.xlim(dates_list[1],dates_list[-1]) 

myFmt = mdates.DateFormatter('%m/%d') 
months = mdates.MonthLocator() 
days1 = mdates.DayLocator(bymonthday=(1,15)) # every Day 
dayss = mdates.DayLocator() 

ax.xaxis.set_major_formatter(myFmt) 
ax.xaxis.set_major_locator(days1) 
ax.xaxis.set_minor_locator(dayss) 

enter image description here

如果2017-06-01实际上是部分要列出的列表中,它将显示。 DayLocator(bymonthday=(1,15))为每个月的第一个和第十五个设置刻度,2017-06-01是一个月的第一个,因此它会显示。 (如果不是,则2017-06-01不属于列表的一部分。)

现在的问题可能是2017-08-30可能是列表的一部分,但它不是任何月份的第15位。因此,想法可以是使用DayLocator(bymonthday=(1,15))查找要显示的记号,但在显示它们之前,将额外需要的2017-08-30添加到位置列表中,并使用FixedLocator来代替。

import matplotlib.pyplot as plt 
import matplotlib.dates as mdates 
import matplotlib.ticker 
import datetime 
import numpy as np 

start = datetime.datetime(2017,6,1) 
end = datetime.datetime(2017,8,30) 
dates_list = [start + datetime.timedelta(days=x) for x in range(0, (end-start).days+1)] 

temperature = np.cumsum(np.random.randn(len(dates_list))) 

myFmt = mdates.DateFormatter('%m/%d') 
months = mdates.MonthLocator() 
days = mdates.DayLocator(bymonthday=(1,15)) 
dayss = mdates.DayLocator() 

fig = plt.figure() 
ax = fig.add_subplot(111) 
ax.plot(dates_list,temperature, linewidth=0.5, c='red') 

ax.set_xlim(dates_list[0],dates_list[-1]) 

ax.xaxis.set_major_formatter(myFmt) 
ax.xaxis.set_major_locator(days) 
ax.xaxis.set_minor_locator(dayss) 

# add the (2017,8,30) to the ticks 
locs = list(ax.get_xticks())+ [mdates.date2num(datetime.datetime(2017,8,30))] 
locator= matplotlib.ticker.FixedLocator(locs) 
ax.xaxis.set_major_locator(locator) 

plt.show() 

enter image description here

+0

我的数据是CSV与月,日单独列和HH:MM。我认为我的问题是第一个约会时间是6点00分10秒。我在6 1 00:00列表的顶部添加了一列。这仍然没有工作。因此,我在5 31 23:59的顶部添加了另一列,现在它显示我一直想要的6/01值。你能否向我解释为什么会出现这种情况?谢谢 – Jonathon

+0

我明白使用'6 1 00:10'不会导致显示'6 1',因为它仅仅是午夜十分钟(因此在午夜之后),因此'6 1'不是图的一部分。你可以在上面的代码中使用'datetime.datetime(2017,6,1,0,1,0)'进行测试。然而,作为数据的一部分,“6 1 00:00”应该有效。或者,您可以使用'ax.set_xlim(datetime.datetime(2017,6,1),datetime.datetime(2017,8,30))',与实际数据无关,以确保绘图的限制是使得要标记的日期包括在图中。 – ImportanceOfBeingErnest