在matplotlib中绘制不同的颜色

lor*_*d12 43 python matplotlib

假设我有一个for循环,我想绘制不同颜色的点:

for i in range(5):
 plt.plot(x,y,col=i)
Run Code Online (Sandbox Code Playgroud)

如何在for循环中自动更改颜色?

Joe*_*ton 95

@tcaswell已经回答了,但是我正在键入我的答案,所以我会继续发布它...

有许多不同的方法可以做到这一点.首先,matplotlib将自动循环显示颜色.默认情况下,它循环显示蓝色,绿色,红色,青色,品红色,黄色,黑色:

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 1, 10)
for i in range(1, 6):
    plt.plot(x, i * x + i, label='$y = {i}x + {i}$'.format(i=i))
plt.legend(loc='best')
plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

如果要控制matplotlib循环的颜色,请使用ax.set_color_cycle:

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 1, 10)
fig, ax = plt.subplots()
ax.set_color_cycle(['red', 'black', 'yellow'])
for i in range(1, 6):
    plt.plot(x, i * x + i, label='$y = {i}x + {i}$'.format(i=i))
plt.legend(loc='best')
plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

如果你想明确指定将要使用的颜色,只需将它传递给colorkwarg(接受html颜色名称,rgb元组和十六进制字符串):

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 1, 10)
for i, color in enumerate(['red', 'black', 'blue', 'brown', 'green'], start=1):
    plt.plot(x, i * x + i, color=color, label='$y = {i}x + {i}$'.format(i=i))
plt.legend(loc='best')
plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

最后,如果您想从现有的色彩映射表中自动选择指定数量的颜色:

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 1, 10)
number = 5
cmap = plt.get_cmap('gnuplot')
colors = [cmap(i) for i in np.linspace(0, 1, number)]

for i, color in enumerate(colors, start=1):
    plt.plot(x, i * x + i, color=color, label='$y = {i}x + {i}$'.format(i=i))
plt.legend(loc='best')
plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 你的答案是,比我的好得多. (21认同)
  • 谢谢!不过,你的主要内容分为两行.为了过长,我的大多数时间过长...... (2认同)
  • 之所以投票,是因为P3中不推荐使用此方法,例如“ MatplotlibDeprecationWarning:set_color_cycle属性在1.5版中已弃用。请改用set_prop_cycle。” (2认同)

gbo*_*ffi 34

Joe Kington优秀答案已有4年历史,Matplotlib已经逐渐改变(特别是cycler模块的引入),而新的主要版本Matplotlib 2.0.x引入了风格差异,这些差异非常重要.默认使用的颜色.

各条线的颜色

各个线条的颜色(以及不同绘图元素的颜色,例如散点图中的标记)由color关键字参数控制,

plt.plot(x, y, color=my_color)
Run Code Online (Sandbox Code Playgroud)

my_color 或者是

颜色周期

默认情况下,使用不同的颜色绘制不同的行,这些颜色默认定义并以循环方式使用(因此称为颜色循环).

颜色循环是'T10'对象的属性,在旧版本中只是一系列有效颜色名称(默认情况下是一个字符颜色名称的字符串'tab:blue'),您可以将其设置为

my_ax.set_color_cycle(['kbkykrkg'])
Run Code Online (Sandbox Code Playgroud)

(如评论中所述,此API已被弃用,稍后将详细介绍).

在Matplotlib 2.0的默认颜色周期'tab:olive',所述维加category10调色板.

在此输入图像描述

(图片来自https://vega.github.io/vega/docs/schemes/)

所述循环仪模块:组合的周期

以下代码显示已弃用颜色循环概念

In [1]: from matplotlib import rc_params

In [2]: rc_params()['axes.color_cycle']
/home/boffi/lib/miniconda3/lib/python3.6/site-packages/matplotlib/__init__.py:938: UserWarning: axes.color_cycle is deprecated and replaced with axes.prop_cycle; please use the latter.
  warnings.warn(self.msg_depr % (key, alt_key))
Out[2]: 
['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728', '#9467bd',
 '#8c564b', '#e377c2', '#7f7f7f', '#bcbd22', '#17becf']
Run Code Online (Sandbox Code Playgroud)

现在相关的财产是 "C3"

In [3]: rc_params()['axes.prop_cycle']
Out[3]: cycler('color', ['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728', '#9467bd', '#8c564b', '#e377c2', '#7f7f7f', '#bcbd22', '#17becf'])
Run Code Online (Sandbox Code Playgroud)

以前,它"C"是有效颜色面额的通用序列,现在默认情况下它是一个"0-9"包含label(axes)和一系列有效颜色面额的对象.相对于前一个界面的前进步骤是,不仅可以循环线的颜色,还可以循环其他线属性,例如,

In [5]: from cycler import cycler

In [6]: new_prop_cycle = cycler('color', ['k', 'r']) * cycler('linewidth', [1., 1.5, 2.])

In [7]: for kwargs in new_prop_cycle: print(kwargs)
{'color': 'k', 'linewidth': 1.0}
{'color': 'k', 'linewidth': 1.5}
{'color': 'k', 'linewidth': 2.0}
{'color': 'r', 'linewidth': 1.0}
{'color': 'r', 'linewidth': 1.5}
{'color': 'r', 'linewidth': 2.0}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,"bgrcmyk"对象是可组合的,当您在组合上迭代时["#1f77b4", "#ff7f0e", "#2ca02c", "#d62728", "#9467bd", "#8c564b", "#e377c2", "#7f7f7f", "#bcbd22", "#17becf"],在每次迭代时,都是关键字参数的字典'axes.prop_cycle'.

您可以使用每个color_cycle对象比率的新默认值,

my_ax.set_prop_cycle(new_prop_cycle)
Run Code Online (Sandbox Code Playgroud)

或者您可以临时安装新的默认值

plt.rc('axes', prop_cycle=new_prop_cycle)
Run Code Online (Sandbox Code Playgroud)

或完全更改默认编辑您的cycler文件.

最后的可能性,使用上下文管理器

with plt.rc_context({'axes.prop_cycle': new_prop_cycle}):
    ...
Run Code Online (Sandbox Code Playgroud)

'color'在一组不同的图中使用新的,在上下文结束时恢复为默认值.

cycler函数的doc字符串很有用,但是可以在精美的文档中找到关于cycler模块和plt.plot函数的(并非如此)的详细信息,以及示例.

  • TL;DR:`plt.gca().set_prop_cycle('color', color_list)`。很好的答案,顺便说一句! (3认同)

tac*_*ell 27

for color in ['r', 'b', 'g', 'k', 'm']:
    plot(x, y, color=color)
Run Code Online (Sandbox Code Playgroud)

  • 如果你有一个方便的计数器,你也可以这样做:`plot(x,y,color ="rbgkm"[i])`. (13认同)