2017-09-26 152 views
1

我發現一種方法來畫一條線在一個matplotlib情節(不是必需的垂直或水平):This建議使用添加的任意直線與X軸的日期時間一matplotlib情節

plt.plot([2, 3], [25, 10]) 

然而該不能與日期時間在x軸上的繪圖一起使用。

我得到「ValueError:ordinal必須> = 1」,並在下面的代碼中進行了所有嘗試。

import matplotlib.pyplot as plt 
from calendar import monthrange 
import datetime 

def get_datetime_range(year, month): # Create a list with all days in a month 
    nb_days = monthrange(year, month)[1] 
    return [datetime.date(year, month, day) for day in range(1, nb_days+1)]  

# Create sample data 
date = get_datetime_range(2017, 9) 
value = [d.day % 12 for d in date] 

# Draw 
plt.plot(date, value) 

plt.axvline(date[10], color='r', zorder=0) # Vertical line works 

m = len(date)-1 
print("Draw line from [%s, %s] to [%s, %s]." % (date[0], value[0], date[m], value[m])) 

# The following does NOT work 

plt.plot_date([date[0], value[0]], 
       [date[m], value[m]]) # Gives ValueError: ordinal must be >= 1 

#plt.plot([date[10], 1], 
#   [date[25], 20]) 


#plt.plot_date([date2num(date[0]), value[0]], 
#    [date2num(date[m]), value[m]]) 

#plt.plot([2, 3], [25, 10]) 

plt.plot() 

我也試圖與date2num轉換日期時間到數沒有成功(同樣的錯誤):

from matplotlib.dates import date2num 

dateNum = [date2num(d) for d in date] 
plt.plot(dateNum, value) # Works 

plt.axvline(date[10], color='r', zorder=0) # Works 

plt.plot_date([date2num(date[0]), value[0]], 
       [date2num(date[m]), value[m]]) # Gives ValueError: ordinal must be >= 1 

任何幫助嗎?

回答

0

問題出現是因爲你的座標順序有點不對。附:

plt.plot_date([date[0], value[0]], 
       [date[m], value[m]]) 

你是說你的X座標date[0]value[0]。而你的x座標實際上是date[0]date[m]。因此,你應該使用:

plt.plot_date([date[0],date[m]], 
       [value[0], value[m]]) 

的完整代碼:

def get_datetime_range(year, month): # Create a list with all days in a month 
    nb_days = monthrange(year, month)[1] 
    return [datetime.date(year, month, day) for day in range(1, nb_days+1)] 

# Create sample data 
date = get_datetime_range(2017, 9) 
value = [d.day % 12 for d in date] 

# Draw 
plt.plot(date, value) 

plt.axvline(date[10], color='r', zorder=0) # Vertical line works 

m = len(date)-1 
print("Draw line from [%s, %s] to [%s, %s]." % (date[0], value[0], date[m], value[m])) 

# changes were made here 
plt.plot_date([date[0], date[m]], [value[0], value[m]], fmt='-', color='r') 

plt.show() 

給出如下圖:

enter image description here

+0

DavidG,謝謝!我花了幾個小時玩這個... –

0

格式爲plot([x1, x2, x3, ...], [y1, y2, y3, ...])。在你的代碼中你有plot_date([x1, y1], [x2, y2]),這是不正確的。

與替換代碼:

plt.plot_date([date[0], date[m]], 
       [value[0], value[m]]) 

解決了這個問題。

但是,請注意,that the default behavior of plot_date()是繪製點(fmt='o')而不是一條線。如果你想要一行代碼,你需要改變格式參數:

plt.plot_date([date[0], date[m]], 
       [value[0], value[m]], fmt='-') 
相關問題