簡體   English   中英

使用 Python 的 matplotlib 在 x 軸上繪制日期

[英]Plotting dates on the x-axis with Python's matplotlib

我正在嘗試將 plot 信息對照日期。 我有一個格式為“01/02/1991”的日期列表。

我通過執行以下操作轉換了它們:

x = parser.parse(date).strftime('%Y%m%d'))

這給出了19910102

然后我嘗試使用 num2date

import matplotlib.dates as dates
new_x = dates.num2date(x)

繪圖:

plt.plot_date(new_x, other_data, fmt="bo", tz=None, xdate=True)

但我得到一個錯誤。 它說“ValueError:年份超出范圍”。 有什么解決辦法嗎?

您可以使用plot()而不是plot_date()更簡單地做到這一點。

首先,將您的字符串轉換為 Python datetime.date實例:

import datetime as dt

dates = ['01/02/1991','01/03/1991','01/04/1991']
x = [dt.datetime.strptime(d,'%m/%d/%Y').date() for d in dates]
y = range(len(x)) # many thanks to Kyss Tao for setting me straight here

然后情節:

import matplotlib.pyplot as plt
import matplotlib.dates as mdates

plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%m/%d/%Y'))
plt.gca().xaxis.set_major_locator(mdates.DayLocator())
plt.plot(x,y)
plt.gcf().autofmt_xdate()

結果:

在此處輸入圖片說明

我的聲譽太低,無法向 @bernie 回復添加評論,回復 @user1506145。 我遇到了同樣的問題。

1

答案是一個區間參數,它可以解決問題

2

import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import numpy as np
import datetime as dt

np.random.seed(1)

N = 100
y = np.random.rand(N)

now = dt.datetime.now()
then = now + dt.timedelta(days=100)
days = mdates.drange(now,then,dt.timedelta(days=1))

plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))
plt.gca().xaxis.set_major_locator(mdates.DayLocator(interval=5))
plt.plot(days,y)
plt.gcf().autofmt_xdate()
plt.show()

正如@KyssTao 所說, help(dates.num2date)x必須是一個浮點數,給help(dates.num2date) 0001-01-01 以來的天數加一。 因此, 19910102不是 2/Jan/1991,因為如果你從 0001-01-01 算起 19910101 天,你會得到 54513 年或類似年份的一些東西(除以 365.25,一年中的天數)。

使用datestr2num代替(參見help(dates.datestr2num) ):

new_x = dates.datestr2num(date) # where date is '01/02/1991'

改編@Jacek Szałęga 的答案以使用圖形和相應的軸fig ax

import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import numpy as np
import datetime as dt

np.random.seed(1)

N = 100
y = np.random.rand(N)

now = dt.datetime.now()
then = now + dt.timedelta(days=100)
days = mdates.drange(now,then,dt.timedelta(days=1))


fig = plt.figure()
ax = fig.add_subplot(111)
    
ax.plot(days,y)
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))
ax.xaxis.set_major_locator(mdates.DayLocator(interval=5))
ax.tick_params(axis='x', labelrotation=45)

plt.show()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM