1 回答

TA貢獻(xiàn)1817條經(jīng)驗(yàn) 獲得超14個(gè)贊
關(guān)于垂直線,.axvline方法應(yīng)該可以解決問(wèn)題。如果您嘗試使用一組字符串作為索引來(lái)繪制 pandas DataFrame/Series,pandas 會(huì)在后臺(tái)執(zhí)行一些花哨的步法。
您可能會(huì)弄亂 xticks 和各種類型,但最簡(jiǎn)單的方法是將您的列轉(zhuǎn)換為datetime64
.
首先,讓我們制作一些絨毛數(shù)據(jù):
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
... ...
您可以用它代替您擁有的任何數(shù)據(jù)。如果在執(zhí)行 groupby 之前轉(zhuǎn)換列,這可能是最簡(jiǎn)單的,因此:
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)
劇情和上面類似。請(qǐng)注意,我使用 8 x 6 的尺寸,以便figsize
該圖更適合 StackOverflow 頁(yè)面。運(yùn)行代碼時(shí)將其改回 15 x 7。
我使用了%m/%d/%Y
格式,因?yàn)檫@似乎是您正在使用的格式。有關(guān)日期格式的更多信息,請(qǐng)參見(jiàn)此處:官方日期時(shí)間文檔
最后,直接使用 a 獲取垂直線datetime
:
import datetime ax.axvline(datetime.datetime(1901,01,10), color='k')
如果您想獲得最高值的垂直直線,請(qǐng)對(duì)聚合的 DataFrame 進(jìn)行排序,然后在 for 循環(huán)中重?fù)羲?/p>
for d in agg_df.sort_values('NN',ascending=False).index[:5]: ax.axvline(d, color='k')
添加回答
舉報(bào)