Matplotlib中图表开头/结尾的X轴标签

时间:2017-09-14 12:19:57

标签: python matplotlib plot axis axis-labels

我使用matplotlib和pyplot在Python中创建了温度图,但无法弄清楚如何为x轴和最后一个标签上的第一个值添加日期标签。我尝试了多次DayLocator迭代,但无济于事。我想保持实际情节的界限相同,并希望保留每天的次要刻​​度,如图enter image description here中所示,因此在线图的开头或结尾没有空格。数据时间为06/01至08/30。这是我的完整代码,除了06/01的第一个刻度以及08/30的最后一个刻度之外没有显示:

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

1 个答案:

答案 0 :(得分:2)

如果2017-06-01实际上是要绘制的列表的一部分,则会显示。 DayLocator(bymonthday=(1,15))为每个月的第一个和第十五个设置滴答,2017-06-01是一个月的第一个,因此会显示。 (如果不是,2017-06-01不是列表的一部分。)

问题现在可能是2017-08-30可能是列表的一部分,但它不是任何月份的第15个月的第1个。因此,我们的想法是使用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