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