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


109

我不想为每条绘制的线指定颜色,而是让每条线获得不同的颜色。但是如果我运行:

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

plt.show()

然后我得到以下输出:

上面的代码输出的图形的图像

如果看上面的图片,您会看到matplotlib尝试为每行不同的颜色选择颜色,但最终它会重用颜色-前十行与后十行使用相同的颜色。我只是想阻止它重复使用过的颜色和/或向其提供要使用的颜色列表。

Answers:


59

matplotlib 1.5+

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

matplotlib 1.0-1.4

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

matplotlib 0.x

您可以使用Axes.set_default_color_cycle


1
我一直在寻找更多的东西...您是否有机会添加有关如何使用颜色图来生成N种颜色的列表的信息?
dlamotte 2011年

19
@xyld -不插我自己的答案太多,但有一个在这个答案底部的例子:stackoverflow.com/questions/4805048/...基本上,你只是这样做:[colormap(i) for i in np.linspace(0, 0.9, num_plots)],其中colormap在颜色表的一个matplotlib.pyplot.cmnumplots是多少您想要的独特颜色。但是请注意,这会导致难以区分的颜色!
乔·

4
乔,很好的回答,似乎可以回答xyld的问题,所以我就此解决。此外,虽然,它的值得指出的是,也有一些很好的答案的问题上产生不同的颜色,如stackoverflow.com/questions/470690/...
tom10

它适用于任何情节吗?我已经在Axes3D上尝试过set_prop_cycle,然后使用ax.plot_wireframe()将循环用于多个图,但是2个图用相同的颜色着色。
Joonho Park

112

我通常使用其中的第二个:

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)

示例2: 带有iter,下一种颜色的示例图


我使用#2。我有一个需要绘制的通道列表,但是它们的长度可以变化。我发现设置该列表的n = len对于确保选择的颜色跨越范围非常有用,您可以分辨出差异。如果该数字太大,则很难看到颜色的差异。
紫红色

我使用了#1,与enumerate(list_name)一起使用非常有用
DevX

11

prop_cycle

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中测试。


9

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

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

在这种情况下,颜色会从黑色到100%绿色不等,但是您可以根据需要对其进行调整。

请参阅matplotlib plot()文档,并寻找color关键字参数。

如果要提供颜色列表,只需确保列表足够大,然后使用循环索引选择颜色

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

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

1
是的,我有点想避免做这样的事情。我查看了“颜色贴图”,但对如何使用它们感到很困惑。
dlamotte 2011年

此解决方案无法提供一种简单的方法来控制颜色图
Ryszard Cetnarski '19

这非常好,尤其是在set_prop_cycle失败时。我不知道为什么Axes3D中的plot_wireframe()中的set_prop_cycle或自动着色失败。但这是一种基本/手动的着色解决方案。
Joonho Park

6

您可以使用预定义的“定性颜色图”,如下所示:

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://github.com/matplotlib/matplotlib/issues/10840,了解有关为什么无法致电的讨论axes.set_prop_cycle(color=cmap)

可以在https://matplotlib.org/gallery/color/colormap_reference.html上获得预定义的定性颜色图列表:

定性颜色图列表


注意,只有前3种颜色的顺序对这些
本·琼斯

2

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

import matplotlib
matplotlib.matplotlib_fname()

这将向您显示当前使用的matplotlibrc文件的路径。在该文件中,您将找到许多其他设置axes.color.cycle。只需输入所需的颜色顺序,您便会在制作的每幅图中找到它。请注意,您还可以在matplotlib中使用所有有效的html颜色名称。


0

作为Ciro的答案,您可以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()

输出:

上面的代码输出的图形

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.