为线条分配颜色

7
我正在尝试在matplotlib中绘制可变数量的线条,其中X、Y数据和颜色存储在numpy数组中,如下所示。是否有办法将颜色数组传递给plot函数,这样我就不必额外为每条线分配颜色了?我应该将RGB颜色数组转换为其他颜色格式,例如HSV或其他格式,以使其工作吗?
import numpy as np
X = np.arange(1990, 1994)
Y = [[  1.50615936e+08   5.88252480e+07   2.60363587e+08]
     [  1.53193798e+08   5.91663430e+07   2.63123995e+08]
     [  1.55704596e+08   5.94899260e+07   2.65840188e+08]
     [  1.58175186e+08   5.97843680e+07   2.68559452e+08]]
colors = [(0.99609375, 0.3984375, 0.3984375) (0.796875, 0.0, 0.99609375)
          (0.59765625, 0.99609375, 0.0)]
#current way
ax.plot(X, Y)
[ax.lines[i].set_color(color) for i, color in enumerate(colors)]
#way I feel it can be done, but doesn't work currently
ax.plot(X, Y, color=colors)
plt.show()

非常感谢任何帮助。
2个回答

8
我认为你想使用Axes方法set_color_cycle。可以想象,它设置了默认情况下分配颜色时循环使用的颜色列表,即当在plot调用中没有提供颜色关键字时。以下是您示例的扩展版本:
import matplotlib.pyplot as plt
import numpy as np

X = np.arange(1990, 1994)
Y = [[  1.50615936e+08,   5.88252480e+07,   2.60363587e+08],
     [  1.53193798e+08,   5.91663430e+07,   2.63123995e+08],
     [  1.55704596e+08,   5.94899260e+07,   2.65840188e+08],
     [  1.58175186e+08,   5.97843680e+07,   2.68559452e+08]]
colors = [(0.99609375, 0.3984375, 0.3984375), 
          (0.796875, 0.0, 0.99609375),
          (0.59765625, 0.99609375, 0.0)]

fig = plt.figure()
ax1 = fig.add_subplot(211)
ax1.set_title('old way')
ax1.plot(X, Y)
[ax1.lines[i].set_color(color) for i, color in enumerate(colors)]

ax2 = fig.add_subplot(212)
ax2.set_title('new way')
ax2.set_color_cycle(colors)
ax2.plot(X, Y)

fig.savefig('manycolors.py')
plt.show()

这将导致两个子图具有相同颜色的线:

enter image description here


2
感谢您指引我使用ax.set_color_cycle()。从那里,我找到了mpl.rcParams['axes.color_cycle'] = self.colors,这正是我想要的,因为我正在绘制多个子图并需要相同的颜色。 - hotshotiguana

2

自Matplotlib版本1.5以来,仍有比@Yann建议的“新方法”更新的方法。而不是使用已弃用的set_color_cycle,您应该使用set_prop_cycle。下面是他的示例重做版。我还建议您使用Seaborn,它有许多预定义的调色板,您可以选择颜色数量。这些调色板的颜色基于Colorbrewer,这是一个选择优秀颜色映射的工具。

import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns

X = np.arange(1990, 1994)
Y = [[  1.50615936e+08,   5.88252480e+07,   2.60363587e+08],
     [  1.53193798e+08,   5.91663430e+07,   2.63123995e+08],
     [  1.55704596e+08,   5.94899260e+07,   2.65840188e+08],
     [  1.58175186e+08,   5.97843680e+07,   2.68559452e+08]]

colors = sns.color_palette("hls", len(Y[0]))

fig = plt.figure()
ax1 = fig.add_subplot(211)
ax1.set_title('old way')
ax1.plot(X, Y)
[ax1.lines[i].set_color(color) for i, color in enumerate(colors)]

ax2 = fig.add_subplot(212)
ax2.set_title('new way')
ax2.set_prop_cycle('color', colors)
ax2.plot(X, Y)

plt.show()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接