为了账号安全,请及时绑定邮箱和手机立即绑定

如何绘制对应于最高值的直线?

如何绘制对应于最高值的直线?

达令说 2023-03-16 16:38:08
我有以下数据:Date01/27/2020    5503/03/2020    4402/25/2020    3903/11/2020    3901/28/2020    3902/05/2020    3803/17/2020    3703/16/2020    3703/19/2020    3703/14/2020    3503/09/2020    3503/26/2020    3303/06/2020    3301/29/2020    3303/23/2020    2703/15/2020    2702/26/2020    2703/27/2020    2603/02/2020    2502/28/2020    2503/24/2020    2403/04/2020    2401/21/2020    2303/01/2020    2102/27/2020    2101/22/2020    2102/18/2020    1801/31/2020    1803/22/2020    1801/26/2020    1803/31/2020    1802/24/2020    1701/20/2020    1601/23/2020    1603/12/2020    1603/21/2020    1502/29/2020    1403/28/2020    1302/19/2020    1303/08/2020    1302/04/2020    1302/12/2020    1202/01/2020    1202/07/2020    1203/30/2020    1202/20/2020    1103/07/2020    1103/29/2020    1102/09/2020    1102/06/2020    11使用分组。在右边,我有按日期排列的值的频率。情节是产生于fig, ax = plt.subplots(figsize=(15,7))df.groupby(['Date']).count()['NN'].plot(ax=ax)我想有对应于第一个最高值的垂直直线,即01/27/2020    5503/03/2020    4402/25/2020    3903/11/2020    3901/28/2020    39我怎么能在我的情节中添加这些线?
查看完整描述

1 回答

?
大话西游666

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)

//img1.sycdn.imooc.com//6412d5af0001984b04780386.jpg

剧情和上面类似。请注意,我使用 8 x 6 的尺寸,以便figsize该图更适合 StackOverflow 页面。运行代码时将其改回 15 x 7。

我使用了%m/%d/%Y格式,因为这似乎是您正在使用的格式。有关日期格式的更多信息,请参见此处:官方日期时间文档

最后,直接使用 a 获取垂直线datetime

import datetime
ax.axvline(datetime.datetime(1901,01,10), color='k')

//img1.sycdn.imooc.com//6412d5bc000122e204780391.jpg

如果您想获得最高值的垂直直线,请对聚合的 DataFrame 进行排序,然后在 for 循环中重击它。

for d in agg_df.sort_values('NN',ascending=False).index[:5]:
    ax.axvline(d, color='k')


查看完整回答
反对 回复 2023-03-16
  • 1 回答
  • 0 关注
  • 97 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信