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

171 投票
8 回答
296585 浏览
提问于 2025-04-16 11:39

我想要在画图的时候,不用为每条线指定颜色,而是让每条线自动得到不同的颜色。但是当我运行下面的代码时:

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

plt.show()

我得到的结果是:

上面代码生成的图像

从上面的图片可以看到,matplotlib(一个画图工具)试图为每条线选择不同的颜色,但最终还是重复使用了颜色——上面的十条线和下面的十条线使用的是一样的颜色。我只是想让它不要重复已经用过的颜色,或者给它提供一份颜色列表来使用。

8 个回答

25

你可以使用预定义的“定性颜色图”,像这样:

import matplotlib as mpl
name = "Accent"
cmap = mpl.colormaps[name]  # type: matplotlib.colors.ListedColormap
colors = cmap.colors  # type: list
axes.set_prop_cycle(color=colors)

matplotlib.colormaps[] 是在 matplotlib 3.5(2021年发布)及以上版本中支持的,而旧的 matplotlib.cm.get_cmap() 方法已经被淘汰,并将在 matplotlib 3.9(2024年)中移除。想了解为什么你不能调用 axes.set_prop_cycle(color=cmap),可以查看这个讨论:https://github.com/matplotlib/matplotlib/issues/10840

你可以在这里找到预定义的定性颜色图列表:https://matplotlib.org/gallery/color/colormap_reference.html

定性颜色图列表

212

我通常使用这两种方法中的第二种:

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

第二种的例子: 带有迭代和下一个颜色的示例图

69

matplotlib 1.5 及以上版本

你可以使用 axes.set_prop_cycle示例)。

matplotlib 1.0 到 1.4 版本

你可以使用 axes.set_color_cycle示例)。

matplotlib 0.x 版本

你可以使用 Axes.set_default_color_cycle

撰写回答