如何在 matplotlib 中为图形中的每条绘制线选择新的颜色?

我不希望为每个绘制的线指定一个颜色,并让每个线得到一个不同的颜色。但如果我逃跑:

from matplotlib import pyplot as plt
for i in range(20):
plt.plot([0, 1], [i, i])


plt.show()

然后我得到这个输出:

Image of the graph output by the code above

如果你看看上面的图片,你会发现 matplotlib 尝试为每一行选择不同的颜色,但是最终它会重复使用颜色——前十行使用的颜色和后十行相同。我只是想停止它重复已经使用的颜色和/或饲料它的颜色列表使用。

242657 次浏览

我不知道你是否可以自动改变颜色,但是你可以利用你的循环来生成不同的颜色:

for i in range(20):
ax1.plot(x, y, color = (0, i / 20.0, 0, 1)

在这种情况下,颜色会从黑色到100% 的绿色不等,但是如果你想要的话,你可以调整它。

查看 Matplotlib plot () docs并查找 color关键字参数。

如果您想提供一个颜色列表,只需确保您有一个足够大的列表,然后使用循环的索引来选择颜色

colors = ['r', 'b', ...., 'w']


for i in range(20):
ax1.plot(x, y, color = colors[i])

Matplotlib 1.5 +

你可以使用 axes.set_prop_cycle(例子)。

Matplotlib 1.0-1.4

你可以使用 axes.set_color_cycle(例子)。

Matplotlib 0. x

你可以使用 Axes.set_default_color_cycle

还可以更改 matplotlibrc文件中的默认颜色周期。 如果您不知道该文件在哪里,请在 python 中执行以下操作:

import matplotlib
matplotlib.matplotlib_fname()

这将向您显示当前使用的 matplotlibrary 文件的路径。 在这个文件中,你会发现在许多其他设置也为 axes.color.cycle的一个。只要把你想要的颜色序列,你会发现它在每一个情节你做。 注意,还可以在 matplotlib 中使用所有有效的 html 颜色名称。

我通常使用第二种方法:

from matplotlib.pyplot import cm
import numpy as np


#variable n below should be number of curves to plot


#version 1:


color = cm.rainbow(np.linspace(0, 1, n))
for i, c in zip(range(n), color):
plt.plot(x, y, c=c)


#or version 2:


color = iter(cm.rainbow(np.linspace(0, 1, n)))
for i in range(n):
c = next(color)
plt.plot(x, y, c=c)

例子二: example plot with iter,next color

螺旋桨摩托车

color_cycle在1.5中被弃用,以支持这种推广: http://matplotlib.org/users/whats_new.html#added-axes-prop-cycle-key-to-rcparams

# cycler is a separate package extracted from matplotlib.
from cycler import cycler
import matplotlib.pyplot as plt


plt.rc('axes', prop_cycle=(cycler('color', ['r', 'g', 'b'])))
plt.plot([1, 2])
plt.plot([2, 3])
plt.plot([3, 4])
plt.plot([4, 5])
plt.plot([5, 6])
plt.show()

也显示在(现在名字不好)的例子中: http://matplotlib.org/1.5.1/examples/color/color_cycle_demo.html提到在: https://stackoverflow.com/a/4971431/895245

在 matplotlib 1.5.1中测试。

你可以像下面这样使用一个预定义的“定性色彩图”:

from matplotlib.cm import get_cmap


name = "Accent"
cmap = get_cmap(name)  # type: matplotlib.colors.ListedColormap
colors = cmap.colors  # type: list
axes.set_prop_cycle(color=colors)

在 matplotlib 3.0.3上进行了测试。

预定义的定性色图清单可在 https://matplotlib.org/gallery/color/colormap_reference.html上获得:

List of qualitative colormaps

正如 西罗的回答所指出的,您可以使用 prop_cycle设置 matplotlib 循环使用的颜色列表。但有多少种颜色呢?如果您想使用相同的颜色周期为许多情节,与不同的行数?

一种策略是使用类似于 https://gamedev.stackexchange.com/a/46469/22397的公式,生成一个无限的颜色序列,其中每种颜色都试图与之前的所有颜色显著不同。

不幸的是,prop_cycle不会接受无限序列-如果你传递一个,它将永远挂起。但是我们可以把这样一个序列产生的前1000种颜色设置为颜色循环。这样,对于具有任意合理数量的线条的情节,您应该得到可区分的颜色。

例如:

from matplotlib import pyplot as plt
from matplotlib.colors import hsv_to_rgb
from cycler import cycler


# 1000 distinct colors:
colors = [hsv_to_rgb([(i * 0.618033988749895) % 1.0, 1, 1])
for i in range(1000)]
plt.rc('axes', prop_cycle=(cycler('color', colors)))


for i in range(20):
plt.plot([1, 0], [i, i])


plt.show()

产出:

Graph output by the code above

现在,所有的颜色都不一样了——尽管我承认我很难区分其中的一些!