2017-09-14 5 views
1

matplotlib 및 pyplot을 사용하여 Python에서 온도 플롯을 만들었지 만 x 축의 첫 번째 값에 대한 날짜 레이블을 추가하는 방법을 알지 못합니다. 마지막 레이블. DayLocator의 여러 반복을 시도했지만 아무 소용이 없습니다. 나는 실제 플롯의 범위를 동일하게 유지하고 플롯 enter image description here에서와 같이 각 날에 대한 작은 틱을 유지하고자하므로 라인 플롯의 시작 또는 끝에 빈 공간이 없습니다. 데이터는 06/01부터 08/30까지입니다. 2017-06-01 실제로 일부인 경우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

답변

1

: 여기에 내 전체 표시되지 않습니다 6월 1일에 대한 최초의 눈금 및 8월 30일의 맨 마지막 틱을 제외하고 완벽하게 플롯 코드입니다 플롯 할 목록의 목록이 표시됩니다. DayLocator(bymonthday=(1,15))은 매달 1 일과 15 일마다 틱을 설정하고 2017-06-01은 1 월 중 첫 번째 틱이므로 표시됩니다. (그렇지 않은 경우 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

+0

내 데이터는 월, 일에 대한 별도의 열이 CSV이며, HH : MM. 제 문제는 첫 데이트 포인트가 6 1 00:10이라는 것입니다. 6 1 00:00으로 목록 맨 위에 열을 추가했습니다. 이것은 아직도 작동하지 않았다. 그래서 5/31 23:59로 맨 위에 다른 열을 추가했습니다. 이제는 내가 원했던 6/01의 가치가 표시됩니다. 왜 이런 식으로 이런 일이 일어 났는지 설명해 주시겠습니까? 감사합니다 – Jonathon

+0

'6 1 00 : 10'을 사용하면 자정 이후 10 분 (자정 이후)이기 때문에 '6 1'이 표시되지 않으므로 '6 1'은 그래프의 일부가 아닙니다. . 위의 코드에서'datetime.datetime (201761010)'을 사용하여 테스트 할 수 있습니다. 그러나 '6 1 00 : 00'이 데이터의 일부이므로 작동해야합니다. 또는 실제 데이터와 관계없이'ax.set_xlim (datetime.datetime (2017,6,1), datetime.datetime (2017,8,30))'을 사용하여 플롯의 한계가 표시 할 날짜가 그래프에 포함됩니다. – ImportanceOfBeingErnest