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

如何基于df.idxmax系列制作基于日期的颜色条?

如何基于df.idxmax系列制作基于日期的颜色条?

MM们 2021-10-26 16:44:38
Python初学者/第一张海报在这里。我在向散点图添加颜色条时遇到了麻烦。我有两种类型的图:一种显示按日期颜色编码的所有数据,另一种仅显示按日期颜色编码的数据的最大值。在第一种情况下,我可以使用 df.index(这是日期时间)来制作我的颜色条,但在第二种情况下,我使用 df2['col'].idxmax 来生成颜色,因为我的 df2 是一个 df我用来在我的数据中生成每日最大值的 .groupby 对象,它没有可访问的索引。对于第一种类型的图,我已经成功地使用以下代码生成了基于日期的颜色条,这些代码是从在线示例拼凑而成的:fig, ax = plt.subplots(1,1, figsize=(20,20))smap=plt.scatter(df.col1, df.col2, s=140,              c=[date2num(i.date()) for i in df.index],             marker='.')cb = fig.colorbar(smap, orientation='vertical',              format=DateFormatter('%d %b %y'))  但是,对于第二种类型的图,我尝试使用 df2['col'].idxmax 来创建日期系列而不是 df.index,以下不起作用:for n in cols1:    for m in cols2:        fig, ax = plt.subplots(1,1, figsize=(15,15))        maxTimes=df2[n].idxmax()        PlottableTimes=maxTimes.dropna() #some NaNs in the         #.idxmax series were giving date2num trouble        smap2=plt.scatter(df2[n].max(), df2[m].max(),             s=160, c=[date2num(i.date()) for i in PlottableTimes],              marker='.')        cb2 = fig.colorbar(smap2, orientation='vertical',                      format=DateFormatter('%d %b %y'))          plt.show()错误是:'rgba 序列的长度应该是 3 或 4'因为错误是抱怨颜色参数,所以我在各自的绘图命令中分别检查了颜色(即 c=)参数的输出,两者看起来都与我相似,所以我无法弄清楚为什么有一个颜色参数有效而另一个无效:一个有效的:[736809.0, 736809.0, 736809.0, 736809.0, 736809.0, 736809.0, 736809.0, 736809.0, 736809.0, 736809] ...一个不起作用:[736845.0, 736846.0, 736847.0, 736848.0, 736849.0, 736850.0, 736851.0, 736852.0, 736853.0, 736854] ...有什么建议或解释吗?我正在运行 python 3.5.2。预先感谢您帮助我理解这一点。
查看完整描述

1 回答

?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

本质上,您的Grouper调用类似于在日期时间列上建立索引并调用pandas.DataFrame.resample指定聚合函数:


df.set_index('ts').resample('D').max()

#             a  b  c  d  e  f  g  h

# ts                                

# 2018-01-01  9  9  8  9  9  9  9  9

# 2018-01-02  9  9  9  9  9  9  9  9

# 2018-01-03  9  9  9  9  9  9  9  9

# 2018-01-04  9  9  9  9  9  9  9  9

# 2018-01-05  9  9  9  9  9  9  9  9

# 2018-01-06  9  9  9  8  9  9  9  9

# 2018-01-07  9  9  9  9  9  9  9  9

# 2018-01-08  2  8  6  3  1  3  2  7

因此,返回的df2['a'].max()是 Pandas Resampler 对象,非常类似于 Pandas 系列,因此带有可用于颜色条规范的 index 属性:


df['a'].max().index


# DatetimeIndex(['2018-01-01', '2018-01-02', '2018-01-03', '2018-01-04',

#                '2018-01-05', '2018-01-06', '2018-01-07', '2018-01-08'],

#               dtype='datetime64[ns]', name='ts', freq='D')

从那里你可以在date2num没有列表理解的情况下进入:


date2num(df2['a'].max().index)


# array([736695., 736696., 736697., 736698., 736699., 736700., 736701., 736702.])

总而言之,只需在循环中使用上述内容,无需maxTimes或PlottableTimes:


fig, ax = plt.subplots(1, 1, figsize = (5,5))


smap = plt.scatter(df2[n].max(), df2[m].max(), s = 160, 

                   c = date2num(df2[n].max().index), 

                   marker = '.')

cb = fig.colorbar(smap, orientation = 'vertical',

                  format = DateFormatter('%d %b %y'))  


查看完整回答
反对 回复 2021-10-26
  • 1 回答
  • 0 关注
  • 180 浏览
慕课专栏
更多

添加回答

举报

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