2017-09-14 4 views
1

matplotlibとpyplotを使用してPythonで温度プロットを作成しましたが、x軸の最初の値の日付ラベルを追加する方法と、最後のラベル。私はDayLocatorの複数の反復を試みましたが、役に立たない。私は実際のプロットの範囲を同じに保ちたいと思い、プロットのように毎日のマイナーダニを保持したいのですが、enter image description hereのように、ラインプロットの最初または最後に空白がありません。データは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) 

enter image description here

答えて

1

2017-06-01が実際に一部である場合:ここでは6月1日のために非常に最初の目盛りと8月30日のための非常に最後のティックを除いて完全にプロットし、私の完全なコードは、表示されませんですそれが表示されます。 DayLocator(bymonthday=(1,15))は、毎月1日と15日に1度のティックを設定し、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

+0

私のデータは、月、日のために別々の列にCSVであり、そしてHH:MM。私の問題は、最初の日付が6 1 00:10だったと思います。私は6 1 00:00とリストの上部に列を追加しました。これはまだ仕事がありませんでした。だから私は5 31 23:59の上に別の列を追加しました、そして、それは私が欲しがっていた6/01の値を表示します。なぜこのようなことが起こっているのか、なぜ私に説明できますか?ありがとう – Jonathon

+0

私は、6時00分から深夜0時を過ぎているので(つまり深夜以降)、 '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

関連する問題