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

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。预先感谢您帮助我理解这一点。



MM们
浏览 183回答 1
1回答

至尊宝的传说

本质上,您的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'))  
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python