通过传递列表索引字典

时间:2018-02-21 09:33:08

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

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

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

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

2 个答案:

答案 0 :(得分:2)

如果您正在使用matplotlib> 1.5,使用set_color_cycle会显示折旧消息:

  

C:\ Python27 \ lib中\站点包\ 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()

给出了:

enter image description here

答案 1 :(得分:1)

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

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