给线条分配颜色

7 投票
2 回答
9193 浏览
提问于 2025-04-17 13:02

我想在matplotlib中绘制多条线,这些线的X和Y数据以及颜色都存储在numpy数组里,如下所示。有没有办法把颜色数组直接传给绘图函数,这样我就不用单独为每条线指定颜色了?我需要把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 个回答

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

我觉得你想用的是 Axes 方法中的 set_color_cycle。简单来说,这个方法可以设置一系列颜色,当你在画图的时候没有指定颜色时,它会按照这个颜色列表来循环使用。下面是你例子的一个扩展版本:

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

撰写回答