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'
,白色背景上的所有白线都会更糟。
任何帮助表示赞赏!
答案 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')
或者,您可以使用所选的色彩映射修改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')