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

Python Matplotlib中图表开始/结束处的X轴标签,python,matplotlib,plot,axis,axis-labels,Python,Matplotlib,Plot,Axis,Axis Labels,我已经使用matplotlib和pyplot在Python中创建了一个温度图,但我不知道如何为x轴上的第一个值和最后一个标签添加日期标签。我尝试了DayLocator的多次迭代,但都没有成功。我希望保持实际绘图的边界不变,并且希望保持每天的小刻度与绘图中的一样,因此在直线绘图的开始或结束处没有空白。数据是从01年6月到30年8月。这是我的完整代码,除了06/01的第一个勾号和08/30的最后一个勾号没有显示外,它的绘图非常完美: import csv import pylab from date

我已经使用matplotlib和pyplot在Python中创建了一个温度图,但我不知道如何为x轴上的第一个值和最后一个标签添加日期标签。我尝试了DayLocator的多次迭代,但都没有成功。我希望保持实际绘图的边界不变,并且希望保持每天的小刻度与绘图中的一样,因此在直线绘图的开始或结束处没有空白。数据是从01年6月到30年8月。这是我的完整代码,除了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)
导入csv
进口派拉布
从日期时间导入日期时间
从matplotlib导入pyplot作为plt
将matplotlib.dates导入为mdates
filename='Summer17.csv'
打开(文件名)为f时:
读卡器=csv。读卡器(f)
标题\行=下一个(读卡器)
日期列表,温度,露点=[],[],[]
对于读取器中的行:
如果长度(世界其他地区)<4:
持续
日期字符串=(“2017/{0:}/{1:}{2:}”。格式(*行))
date_obj=datetime.strtime(日期字符串,“%Y/%m/%d%H:%m”)
日期列表。附加(日期对象)
温度=浮动(第[3]行)
温度。附加(温度)
图=plt.图(dpi=128,figsize=(10,6))
ax=图中添加的轴([0.1,0.1,0.85,0.75])
plt.绘图(日期列表,温度,线宽=0.5,c='red')
plt.xlim(日期列表[1],日期列表[-1])
myFmt=mdates.DateFormatter(“%m/%d”)
月=日期。月定位符()
days1=mdates.DayLocator(bymonthday=(1,15))35;每天
dayss=mdates.DayLocator()
ax.xaxis.set\u major\u格式化程序(myFmt)
ax.xaxis.set\u major\u定位器(第1天)
ax.xaxis.set_minor_定位器(dayss)

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

现在的问题可能是2017-08-30的
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点10分。我在列表的顶部添加了一列6:00:00。这仍然不起作用。因此,我在顶部添加了另一列5 31 23:59,现在它显示了我一直想要的6/01值。你能给我解释一下为什么会这样吗?谢谢,我知道使用
6 1 00:10
不会导致显示
6 1
,因为它仅仅是午夜后10分钟(因此是午夜之后),因此
6 1
不在图表中。您可以在上述代码中使用
datetime.datetime(2017,6,1,0,1,0)
进行测试。但是,
6 1 00:00
作为数据的一部分,它应该可以工作。或者,您当然可以使用
ax.setxlim(datetime.datetime(2017,6,1)、datetime.datetime(2017,8,30))
,独立于实际数据,以确保绘图的限制使得要标记的日期包含在图表中。