如何在一个图中为不同的图形获得不同的彩色线条?

时间:2011-01-26 13:25:11

标签: python colors matplotlib

我正在使用matplotlib来创建绘图。我必须用不同的颜色识别每个绘图,这些颜色应该由Python自动生成。

请您给我一个方法,在同一图中为不同的地块添加不同的颜色?

5 个答案:

答案 0 :(得分:347)

Matplotlib默认执行此操作。

E.g:

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(10)

plt.plot(x, x)
plt.plot(x, 2 * x)
plt.plot(x, 3 * x)
plt.plot(x, 4 * x)
plt.show()

Basic plot demonstrating color cycling

而且,正如您可能已经知道的那样,您可以轻松添加图例:

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(10)

plt.plot(x, x)
plt.plot(x, 2 * x)
plt.plot(x, 3 * x)
plt.plot(x, 4 * x)

plt.legend(['y = x', 'y = 2x', 'y = 3x', 'y = 4x'], loc='upper left')

plt.show()

Basic plot with legend

如果您想控制将循环的颜色:

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(10)

plt.gca().set_color_cycle(['red', 'green', 'blue', 'yellow'])

plt.plot(x, x)
plt.plot(x, 2 * x)
plt.plot(x, 3 * x)
plt.plot(x, 4 * x)

plt.legend(['y = x', 'y = 2x', 'y = 3x', 'y = 4x'], loc='upper left')

plt.show()

Plot showing control over default color cycling

希望有所帮助!如果你不熟悉matplotlib,the tutorial is a good place to start

修改

首先,如果您想要在一个数字上绘制很多(> 5)的事物,请:

  1. 将它们放在不同的图上(考虑在一个图上使用几个子图)或
  2. 使用颜色以外的其他颜色(即标记样式或线条粗细)来区分它们。
  3. 否则,你最终会看到非常凌乱的情节!很高兴谁会去读你正在做的事情,不要试图把15种不同的东西塞进一个人物!

    除此之外,许多人在不同程度上都是色盲,区分众多微妙的不同颜色对于更多人来说比你意识到的要困难。

    有人说过,如果你真的想在一个轴上放20条线,并且有20种相对不同的颜色,这是一种方法:

    import matplotlib.pyplot as plt
    import numpy as np
    
    num_plots = 20
    
    # Have a look at the colormaps here and decide which one you'd like:
    # http://matplotlib.org/1.2.1/examples/pylab_examples/show_colormaps.html
    colormap = plt.cm.gist_ncar
    plt.gca().set_color_cycle([colormap(i) for i in np.linspace(0, 0.9, num_plots)])
    
    # Plot several different functions...
    x = np.arange(10)
    labels = []
    for i in range(1, num_plots + 1):
        plt.plot(x, i * x + 5 * i)
        labels.append(r'$y = %ix + %i$' % (i, 5*i))
    
    # I'm basically just demonstrating several different legend options here...
    plt.legend(labels, ncol=4, loc='upper center', 
               bbox_to_anchor=[0.5, 1.1], 
               columnspacing=1.0, labelspacing=0.0,
               handletextpad=0.0, handlelength=1.5,
               fancybox=True, shadow=True)
    
    plt.show()
    

    Unique colors for 20 lines based on a given colormap

答案 1 :(得分:31)

稍后设置

如果您不知道要绘制的绘图的数量,可以在绘制它们之后使用.lines直接从绘图中检索数字时更改颜色,我使用此解决方案:

一些随机数据

import matplotlib.pyplot as plt
import numpy as np

fig1 = plt.figure()
ax1 = fig1.add_subplot(111)


for i in range(1,15):
    ax1.plot(np.array([1,5])*i,label=i)

您需要的代码:

colormap = plt.cm.gist_ncar #nipy_spectral, Set1,Paired   
colors = [colormap(i) for i in np.linspace(0, 1,len(ax1.lines))]
for i,j in enumerate(ax1.lines):
    j.set_color(colors[i])


ax1.legend(loc=2)

结果如下:enter image description here

答案 2 :(得分:2)

我想对上一篇文章中给出的最后一个循环答案进行一些小改进(该帖子是正确的,仍然应该被接受)。标记最后一个示例时所隐含的假设是plt.label(LIST)将标签号X放在LIST中,并且调用了对应于第X个时间plot的行。我之前遇到过这种方法的问题。根据matplotlibs文档(http://matplotlib.org/users/legend_guide.html#adjusting-the-order-of-legend-item)构建图例和自定义标签的推荐方法是让人感觉标签与您认为的标签一致:

...
# Plot several different functions...
labels = []
plotHandles = []
for i in range(1, num_plots + 1):
    x, = plt.plot(some x vector, some y vector) #need the ',' per ** below
    plotHandles.append(x)
    labels.append(some label)
plt.legend(plotHandles, labels, 'upper left',ncol=1)

**:Matplotlib Legends not working

答案 3 :(得分:2)

Matplot用不同的颜色为您的情节着色,但以防万一您想放特定的颜色

import matplotlib.pyplot as plt
import numpy as np
        
x = np.arange(10)
        
plt.plot(x, x)
plt.plot(x, 2 * x,color='blue')
plt.plot(x, 3 * x,color='red')
plt.plot(x, 4 * x,color='green')
plt.show()

答案 4 :(得分:1)

TL; DR 不,它不能自动完成。是的,有可能。

图形(axes)中的每个图形(figure)都有自己的颜色周期-如果不为每个图形强制使用不同的颜色,则所有图形共享相同的颜色顺序。颜色。

只有当我们 stretch 有点“自动”的意思时,自动才能在每个图中具有不同的颜色。


OP写道

  

[...]我必须用[Matplotlib]自动生成的不同颜色标识每个图。

但是... Matplotlib会为每条不同的曲线自动生成不同的颜色

In [10]: import numpy as np 
    ...: import matplotlib.pyplot as plt                                                  

In [11]: plt.plot((0,1), (0,1), (1,2), (1,0));                                             
Out[11]: 

enter image description here

那么为什么要OP请求?如果我们继续阅读,我们有

  

您能给我一种方法为同一图中的不同图放置不同的颜色吗?

这是有道理的,因为每个图(按照Matplotlib的说法,每个axes都有自己的color_cycle(或者在2018年,它的prop_cycle)和每个图({{ 1}})以相同的顺序重复使用相同的颜色。

axes

enter image description here

如果这是原始问题的含义,则一种可能性是为每个图明确命名不同的颜色。

如果绘图(经常发生)是在循环中生成的,我们必须有一个附加的循环变量来自动覆盖Matplotlib选择的颜色。

In [12]: fig, axes = plt.subplots(2,3)                                                    

In [13]: for ax in axes.flatten(): 
    ...:     ax.plot((0,1), (0,1)) 

enter image description here

另一种可能性是实例化循环器对象

In [14]: fig, axes = plt.subplots(2,3)                                                    

In [15]: for ax, short_color_name in zip(axes.flatten(), 'brgkyc'): 
    ...:     ax.plot((0,1), (0,1), short_color_name)

enter image description here

请注意,from cycler import cycler my_cycler = cycler('color', ['k', 'r']) * cycler('linewidth', [1., 1.5, 2.]) actual_cycler = my_cycler() fig, axes = plt.subplots(2,3) for ax in axes.flat: ax.plot((0,1), (0,1), **next(actual_cycler)) type(my_cycler),而cycler.Cyclertype(actual_cycler)