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')
添加回答
举报