如何为matplotlib中的每个绘制线选择一种新颜色?

时间:2011-02-11 16:05:49

标签: matplotlib

我不想为每条绘图线指定颜色:

for i in range(20):
   ax1.plot(x, y)

如果您查看图像,matplotlib会尝试为不同的每一行选择颜色,但最终会重新使用颜色。我只是想阻止它重复使用已经使用过的颜色和/或为它提供一系列要使用的颜色。

7 个答案:

答案 0 :(得分:85)

我通常使用这3个中的第3个,我也不会检查1和2版本。

from matplotlib.pyplot import cm
import numpy as np

#variable n should be number of curves to plot (I skipped this earlier thinking that it is obvious when looking at picture - sorry my bad mistake xD): n=len(array_of_curves_to_plot)
#version 1:

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

#or version 2: - faster and better:

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

#or version 3:

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

3的例子: example plot with iter,next color

答案 1 :(得分:49)

在1.0以上版本的matplotlib中,您可以使用axes.color_cycle(请参阅example),在旧版本中使用Axes.set_default_color_cycle(请参阅example)。

答案 2 :(得分:10)

<强> 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 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.htmlhttps://stackoverflow.com/a/4971431/895245提到

在matplotlib 1.5.1中测试。

答案 3 :(得分:7)

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

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])

答案 4 :(得分:2)

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

import matplotlib
matplotlib.matplotlib_fname()

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

答案 5 :(得分:0)

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

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上测试。有关为何无法致电axes.set_prop_cycle(color=cmap)的讨论,请参见https://github.com/matplotlib/matplotlib/issues/10840

https://matplotlib.org/gallery/color/colormap_reference.html上提供了预定义的定性颜色图列表:

List of qualitative colormaps

答案 6 :(得分:0)

Ciro's answer所述,您可以使用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

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