【问题标题】:Change color of legend to match line plot matplotlib pandas更改图例的颜色以匹配线图 matplotlib pandas
【发布时间】:2016-05-16 01:33:59
【问题描述】:

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

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

这是代码和几行数据。

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

【问题讨论】:

  • 您好,将MCVE 代码示例放在一起可能是值得的。理想情况下,可以复制您编写的代码并重现您遇到的错误。您的示例中有很多与问题无关的代码。我无法重现您的错误,但是我也无法运行您提供的代码,因为我没有您正在使用的 csv。
  • 完成了,我想。谢谢

标签: pandas matplotlib colors legend line-plot


【解决方案1】:

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

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()

【讨论】:

    【解决方案2】:

    我无法运行您的确切代码,因为我无法访问您正在使用的 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 方法没有颜色参数,这就是您收到错误的原因,我不确定您为什么没有在标签中获得正确的颜色,但是您不需要明确说明颜色是什么,因为这些颜色包含在轴对象中。您可能还想在绘图方法中定义标签,以便它们显示在图例中。祝你好运]1

    【讨论】:

    • 谢谢。把你的一些台词和我的混合起来,让它发挥作用。
    猜你喜欢
    • 2013-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-08
    • 1970-01-01
    • 2016-01-11
    • 2013-12-01
    相关资源
    最近更新 更多