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

pot*_*opi 181 python colors matplotlib

matplotlib用来创建情节.我必须用不同颜色识别每个绘图,这些颜色应该由Python自动生成.

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

Joe*_*ton 381

Matplotlib默认执行此操作.

例如:

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()
Run Code Online (Sandbox Code Playgroud)

显示颜色循环的基本情节

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

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()
Run Code Online (Sandbox Code Playgroud)

基本情节与传奇

如果要控制将循环的颜色:

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()
Run Code Online (Sandbox Code Playgroud)

绘图显示对默认颜色循环的控制

希望那有所帮助!如果您对matplotlib不熟悉,那么本教程是一个很好的起点.

编辑:

首先,如果你想要在一个数字上绘制很多(> 5)的东西,可以:

  1. 将它们放在不同的图上(考虑在一个图上使用一些子图),或
  2. 使用颜色以外的其他东西(即标记样式或线条粗细)来区分它们.

否则,你将陷入一个非常混乱的阴谋!很高兴谁会去读你正在做的事情,不要试图把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()
Run Code Online (Sandbox Code Playgroud)

基于给定色彩图的20行独特颜色

  • 注意最后一个例子,在较新版本的matplotlib中,`set_color_cycle`已被弃用,因此该行应为`plt.gca().set_prop_cycle(plt.cycler('color',plt.cm.jet(np. linspace(0,1,num_plots))))`并且只需更改`plt.cm.YOUR_PREFERED_COLOR_MAP`以满足您的需要. (16认同)

G M*_*G M 36

稍后设置它们

如果您不知道要绘制的绘图的数量,可以在绘制它们直接从绘图中检索数字后更改颜色.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)
Run Code Online (Sandbox Code Playgroud)

您需要的代码段:

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)
Run Code Online (Sandbox Code Playgroud)

结果如下:在此输入图像描述


gbo*_*ffi 9

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

import matplotlib.pyplot as plt
my_colors = plt.rcParams['axes.prop_cycle']() # <<< note that we CALL the prop_cycle
fig, axes = plt.subplots(2,3)
for ax in axes.flatten(): ax.plot((0,1), (0,1), **next(my_colors))
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明 图形 ( axes) 中的每个图 ( figure) 都有自己的颜色循环——如果您不为每个图强制使用不同的颜色,则所有图共享相同的颜色顺序,但是,如果我们稍微拉伸一下“自动”的含义, 可以办到。


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]:
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

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

你能给我一个方法,在同一个图中为不同的图放置不同的颜色吗?

这是有道理的,因为每个图(axes用 Matplotlib 的说法是每个图)都有自己的color_cycle(或者更确切地说,在 2018 年是它的prop_cycle),并且每个图 ( axes) 都以相同的顺序重用相同的颜色。

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

In [13]: for ax in axes.flatten():
    ...:     ax.plot((0,1), (0,1))
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

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

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

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)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

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

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))
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

请注意,type(my_cycler)cycler.Cycler但是type(actual_cycler)itertools.cycle