更改图例的颜色以匹配线图matplotlib pandas

时间:2016-02-05 22:53:00

标签: pandas matplotlib colors legend line-plot

更新,编辑代码到mcve版本问题在第17行。

我正在尝试从.csv文件中绘制多线图。我已设法将绘图中的默认颜色更改为tableau20配色方案。生成图例时,图例中的颜色仍为默认颜色。如果我尝试将颜色命令添加到图例代码部分,我会收到错误。 TypeError: init ()得到了一个意外的关键字参数' color'。有没有办法将图例颜色与主图表主体中的颜色相匹配?

这是代码和几行数据。

import pandas as pd
from pandas import Series, DataFrame
import matplotlib.pyplot as plt
df=pd.read_csv('cch30.csv')
tableau20 = [(31, 119, 180), (174, 199, 232), (255, 127, 14), (255, 187, 120),    
             (44, 160, 44), (152, 223, 138), (214, 39, 40), (255, 152, 150)]
for i in range(len(tableau20)):    
    r, g, b = tableau20[i]    
    tableau20[i] = (r / 255., g / 255., b / 255.)
ax = df.plot(kind='line', x=df.columns[0],y=df.columns[1:8])
species= ['A. bellonorium', 'A. fuscolingua', 'A. mucronata', 'A. depressa', 'A. novazelandia', 'A. spp', 'A. australis']
for rank, column in enumerate(species):        
    plt.plot(df.Position.values,    
            df[column.replace("\n", " ")].values,    
            lw=1, color=tableau20[rank])
    lines, labels = ax.get_legend_handles_labels()
    #problem in the next line when i try to tell it to use tableau20 by adding color=tableau20[rank]after fontsize
    ax.legend(lines[0:8], labels[0:8], loc='best', fontsize=8, color=tableau20[rank])
plt.show()
Position,A. bellonorium,A. fuscolingua,A. mucronata,A. depressa,A. novazelandia,A. spp,A. australis
1,17,9,33,22,15,20,78
2,17,9,33,21,14,22,77
3,17,9,34,20,14,23,78
4,17,9,35,21,12,23,79
5,17,9,34,22,12,24,75
6,17,9,34,22,13,24,75
7,17,9,34,22,13,24,74
8,17,9,34,22,15,24,76
9,16,9,36,20,14,24,76
10,16,9,36,20,15,26,75
11,16,9,37,20,15,27,74
12,16,9,36,21,15,26,74
13,16,9,34,21,15,27,75
14,16,9,34,23,15,27,75
15,16,9,34,24,16,26,75
16,16,9,34,24,16,28,76
17,16,9,33,24,16,28,77
18,15,9,34,24,14,28,77
19,15,9,32,25,14,28,77
20,15,9,32,25,13,28,77
21,15,9,31,25,13,29,79
22,15,9,31,25,13,29,79
23,15,9,32,25,13,29,78
24,15,9,31,25,12,29,79
25,15,9,30,25,12,29,78
26,15,9,30,25,12,28,79
27,15,9,29,24,13,30,80
28,15,9,30,24,13,30,80
29,14,9,29,23,11,30,77

2 个答案:

答案 0 :(得分:0)

我无法运行您的确切代码,因为我无法访问您正在使用的csv,所以我只是猜测您的数据帧是什么样的。但是您应该能够根据需要调整以下代码。我尝试尽可能减少代码,因为如果遇到问题,这将更容易进行故障排除

import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame([[1, 1, 1], [.5, 1, 2]], columns=['A. bellonorium', 'A. fuscolingua', 'A. mucronata'])

tableau20 = [(31, 119, 180), (255, 152, 150), (255, 127, 14)]
tableau20 = [(r/255, g/255, b/255) for r, g, b in tableau20]

f, ax = plt.subplots()

for rank, column in enumerate(df.columns):        
    ax.plot(df.index, df[column], color=tableau20[rank], label=column)

ax.legend(loc='best')

legend方法没有颜色参数,这就是您收到错误的原因,我不确定为什么您没有在标签中获得正确的颜色,但是,您不需要明确说明颜色是什么,因为它们包含在轴对象中。您可能还希望在绘图方法中定义标签,以便它们显示在图例中。祝你好运![enter image description here] 1

答案 1 :(得分:0)

这段代码得到了我在这个阶段想要的结果。感谢所有帮助过的人

import pandas as pd
from pandas import Series, DataFrame
import matplotlib.pyplot as plt
df=pd.read_csv('coveragechart.csv')
tableau20 = [(31, 119, 180), (174, 199, 232), (255, 127, 14), (255, 187, 120),    
             (44, 160, 44), (152, 223, 138), (214, 39, 40), (255, 152, 150)]
for i in range(len(tableau20)):    
    r, g, b = tableau20[i]    
    tableau20[i] = (r / 255., g / 255., b / 255.)
f, ax = plt.subplots()
for rank, column in enumerate(df.columns[1:8]):        
    ax.plot(df.index, df[column], color=tableau20[rank], label=column)
    plt.ylabel('Coverage')
    plt.xlabel('Position')
ax.legend(loc='best', fontsize=8)
plt.savefig('cov.png', bbox_inches='tight', dpi=300)
plt.show()