【问题标题】:Indexing a dictionary by passing a list通过传递列表来索引字典
【发布时间】:2018-02-21 09:33:08
【问题描述】:

我正在尝试使用存储在字典中的颜色来绘制数据框。 此代码有效:

import matplotlib.pyplot as plt
import pandas as pd

df = pd.DataFrame(np.random.randn(100, 4), index=range(100), columns=list('ABCD'))
df = df + [-2, 0, 2, 4]
x = list(range(100, 1100, 10))
clrhex = {'abcd':'#FFA500', 'efgh':'#FF0000','ijkl':'#000000','mnop':'#6495ED'}

plt.plot(x, df, color=[clrhex['abcd'], clrhex['efgh'], clrhex['ijkl'], clrhex['mnop']])
plt.show()

但我想通过使用列表索引字典来缩短它。这个:

plt.plot(x, df, color=clrhex['abcd', 'efgh', 'ijkl', 'mnop'])

给出以下错误信息:

Invalid RGBA argument

如何从字典中获取多个值?

【问题讨论】:

    标签: python python-3.x dictionary matplotlib color-scheme


    【解决方案1】:

    如果你使用 matplotlib > 1.5,使用set_color_cycle 会弹出一条折旧消息:

    c:\Python27\lib\site-packages\matplotlib\cbook\deprecation.py:106:
    MatplotlibDeprecationWarning:set_color_cycle 属性为 在 1.5 版中已弃用。请改用 set_prop_cycle。

    所以,使用set_prop_cycle 你可以这样做:

    df = pd.DataFrame(np.random.randn(100, 4), index=range(100), columns=list('ABCD'))
    df = df + [-2, 0, 2, 4]
    x = list(range(100, 1100, 10))
    clrhex = {'abcd':'#FFA500', 'efgh':'#FF0000','ijkl':'#000000','mnop':'#6495ED'}
    
    plt.gca().set_prop_cycle('color', [clrhex[i] for i in ['abcd', 'efgh', 'ijkl', 'mnop']])
    plt.plot(x, df)
    
    plt.show()
    

    使用set_prop_cycle 的优点是您可以将它与其他东西一起使用,而不仅仅是颜色,即线条样式或线宽。下面是一些修改后的代码,展示了如何更改颜色和线宽(如果您愿意的话),并使用面向对象的 API:

    from cycler import cycler
    
    df = pd.DataFrame(np.random.randn(100, 4), index=range(100), columns=list('ABCD'))
    df = df + [-2, 0, 2, 4]
    x = list(range(100, 1100, 10))
    clrhex = {'abcd':'#FFA500', 'efgh':'#FF0000','ijkl':'#000000','mnop':'#6495ED'}
    
    fig, ax = plt.subplots()
    
    ax.set_prop_cycle(cycler('color', [clrhex[i] for i in ['abcd', 'efgh', 'ijkl', 'mnop']]) + 
        cycler('lw', [1,2,3,4]))
    
    ax.plot(x, df)
    
    plt.show()
    

    这给出了:

    【讨论】:

    • 谢谢!但是,虽然我没有收到任何错误消息,但现在出现的颜色显然不是字典中定义的颜色,而是一些随机的颜色......
    • @DusanKojic 啊,你是对的,你需要在绘制任何东西之前打电话给set_prop_cycle。我已经更新了我的答案
    【解决方案2】:

    嗯,你可以用更少的字符来理解:

    color=[clrhex[i] for i in ['abcd', 'efgh', 'ijkl', 'mnop']]
    

    编辑

    你的代码对我不起作用,所以我使用了这个:

    plt.plot(x, df)
    plt.gca().set_color_cycle([clrhex[i] for i in ['abcd', 'efgh', 'ijkl', 'mnop']])
    plt.show()
    

    【讨论】:

    • 看起来与我正在寻找的那种建议一模一样,但是错误消息仍然存在......
    猜你喜欢
    • 1970-01-01
    • 2018-11-28
    • 1970-01-01
    • 2019-07-06
    • 2018-04-24
    • 1970-01-01
    • 2016-06-28
    • 1970-01-01
    相关资源
    最近更新 更多