我使用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)
答案 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()