与groupby的熊猫colormap

时间:2013-11-22 09:02:00

标签: python pandas

pandas和matplotlib相当新,并且在使用groupby时无法使用色彩映射。

这是我的测试;

x=[]
for i in range(5):
   for j in range(9):
        x.append({'time':datetime(2013,1,1+i), 'col1':chr(ord('A')+j), 'col2':chr(ord('Z')-j), 'value':100+i*j})
df=pd.DataFrame(x)
df=df.set_index('time')
df

构建此数据集;

              col1 col2  value
time                       
2013-01-01    A    Z    100
2013-01-01    B    Y    100
2013-01-01    C    X    100
2013-01-01    D    W    100
2013-01-01    E    V    100
2013-01-01    F    U    100
2013-01-01    G    T    100
2013-01-01    H    S    100
2013-01-01    I    R    100
2013-01-02    A    Z    100
2013-01-02    B    Y    101
2013-01-02    C    X    102
2013-01-02    D    W    103
2013-01-02    E    V    104
2013-01-02    F    U    105
2013-01-02    G    T    106
2013-01-02    H    S    107
2013-01-02    I    R    108
2013-01-03    A    Z    100
2013-01-03    B    Y    102
2013-01-03    C    X    104
2013-01-03    D    W    106
2013-01-03    E    V    108
2013-01-03    F    U    110
2013-01-03    G    T    112
2013-01-03    H    S    114
2013-01-03    I    R    116
2013-01-04    A    Z    100
2013-01-04    B    Y    103
2013-01-04    C    X    106
2013-01-04    D    W    109
2013-01-04    E    V    112
2013-01-04    F    U    115
2013-01-04    G    T    118
2013-01-04    H    S    121
2013-01-04    I    R    124
2013-01-05    A    Z    100
2013-01-05    B    Y    104
2013-01-05    C    X    108
2013-01-05    D    W    112
2013-01-05    E    V    116
2013-01-05    F    U    120
2013-01-05    G    T    124
2013-01-05    H    S    128
2013-01-05    I    R    132

如果我照常绘制,最后几个项目颜色相同;

df.groupby(['col1','col2'])['value'].plot()
plt.legend()

http://postimg.org/image/cta2pa76f/

如果我尝试使用colourmap,它似乎不起作用;

df.groupby(['col1','col2'])['value'].plot(colormap='jet')
plt.legend()

http://postimg.org/image/8y6ompo0n/

如果我尝试'Blues',白色背景上的所有白线都会更糟。

任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:2)

它确实有效,但是因为你是从GroupBy进行绘图,所以每个组(包含1列)会相互映射,但是在相同的轴上。此单列从所选colormap获得第一种颜色。

要使色彩图工作,您需要多个列,然后每个列都会从色彩图中获得不同的颜色。

您可以将'col1'和'col2'移动到索引,然后将它们取出堆叠。假设每个时间戳只有一个(col1,col2)组合。对于您的原始df

df.set_index(['col1', 'col2'], append=True, inplace=True)
df.unstack(['col1', 'col2']).xs('value', axis=1).plot(colormap='jet')

enter image description here

或者,您可以使用所选的色彩映射修改Matplotlibs color cycle。然后你的第一个图将从colormap中获得颜色。看到: http://matplotlib.org/1.2.1/examples/api/color_cycle.html

编辑:

使用pivot可能比上面显示的取消堆叠更合适:

df = pd.pivot_table(df.reset_index(),values='value', 
                    rows=['time'],cols=['col1', 'col2'])

df.plot(colormap='jet')