1 回答

TA貢獻1817條經驗 獲得超14個贊
關于垂直線,.axvline方法應該可以解決問題。如果您嘗試使用一組字符串作為索引來繪制 pandas DataFrame/Series,pandas 會在后臺執行一些花哨的步法。
您可能會弄亂 xticks 和各種類型,但最簡單的方法是將您的列轉換為datetime64
.
首先,讓我們制作一些絨毛數據:
import random
import pandas as pd
from string import ascii_lowercase
# Make some fluff
dates = [f'01/{random.randint(1,28)}/1901' for _ in range(100)]
fluff = [ascii_lowercase[random.randint(1,26):random.randint(1,26)]
for _ in range(100)]
# Pack into a DataFrame
df = pd.DataFrame({'Date': dates, 'NN': fluff})
# Aggregate
counted = df.groupby('Date').count()
快速瀏覽一下:
>>> counted
NN
Date
01/10/1901 2
01/11/1901 6
01/12/1901 2
... ...
您可以用它代替您擁有的任何數據。如果在執行 groupby 之前轉換列,這可能是最簡單的,因此:
df['Date'] = pd.to_datetime(df['Date'], format='%m/%d/%Y')
agg_df = df.groupby(['Date']).count()
fig, ax = plt.subplots(figsize=(8,6))
agg_df['NN'].plot(ax=ax)
劇情和上面類似。請注意,我使用 8 x 6 的尺寸,以便figsize
該圖更適合 StackOverflow 頁面。運行代碼時將其改回 15 x 7。
我使用了%m/%d/%Y
格式,因為這似乎是您正在使用的格式。有關日期格式的更多信息,請參見此處:官方日期時間文檔
最后,直接使用 a 獲取垂直線datetime
:
import datetime ax.axvline(datetime.datetime(1901,01,10), color='k')
如果您想獲得最高值的垂直直線,請對聚合的 DataFrame 進行排序,然后在 for 循環中重擊它。
for d in agg_df.sort_values('NN',ascending=False).index[:5]: ax.axvline(d, color='k')
添加回答
舉報