在matplotlib中绘制不同颜色的图形

74

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

for i in range(5):
 plt.plot(x,y,col=i)

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


IMO 如何在单个图中为不同的绘图获取不同颜色的线? 是关于在每个不同的axes中重新启动的颜色循环的。我可能是错的... - gboffi
3个回答

127

@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()

enter image description here

如果您想控制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()

输入图像描述

如果您想明确指定要使用的颜色,只需将其传递给color关键字参数(可以接受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()

在这里输入图片描述

最后,如果您想从一个现有的色图中自动选择指定数量的颜色:

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

enter image description here


31
你的答案,嗯,比我的好了很多。 - tacaswell
3
谢谢!你的两行话已经表达了主要观点。我的内容则是为了冗长而冗长,没有太大必要。 - Joe Kington
4
因为在P3中已经被弃用,所以被downvoted,即“MatplotlibDeprecationWarning: set_color_cycle属性在1.5版本中已被弃用,请改用set_prop_cycle。” - Mark Mullin

64

乔·金顿优秀回答已经有4年历史了, Matplotlib已经逐步改变(特别是引入cycler模块), 新的主要版本Matplotlib 2.0.x引入了样式上的不同,从默认使用的颜色的角度来看,这些差异很重要。

个别线条的颜色

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

plt.plot(x, y, color=my_color)

my_color 要么是

颜色循环

默认情况下,不同的线条使用不同的颜色进行绘制,这些颜色是默认定义的,并且以循环方式使用(因此得名颜色循环)。

颜色循环是axes对象的属性,在早期版本中它只是一系列有效的颜色名称(默认为一个字符颜色名称字符串"bgrcmyk"),你可以像下面这样设置它:

my_ax.set_color_cycle(['kbkykrkg'])

(正如评论中所提到的,此API已被弃用,稍后会有更多信息)。

在Matplotlib 2.0中,默认的颜色循环是["#1f77b4", "#ff7f0e", "#2ca02c", "#d62728", "#9467bd", "#8c564b", "#e377c2", "#7f7f7f", "#bcbd22", "#17becf"],即Vega category10调色板

enter image description here

(该图片是来自https://vega.github.io/vega/docs/schemes/的截图)

E.g.,

for i in range(12):plt.plot((0,1),(i/12,i/6),lw=8) # last 2 colors are repeated

enter image description here

cycler 模块:可组合的循环

以下代码表明颜色循环概念已被弃用。

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

现在相关的属性是'axes.prop_cycle'
In [3]: rc_params()['axes.prop_cycle']
Out[3]: cycler('color', ['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728', '#9467bd', '#8c564b', '#e377c2', '#7f7f7f', '#bcbd22', '#17becf'])

之前,color_cycle是一种通用的有效颜色序列,现在默认情况下它是一个包含标签('color')和有效颜色序列的cycler对象。相对于以前的接口,向前迈出的一步是可以循环不仅在线条的颜色上,而且在其他线条属性上,例如,

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}

正如您所见,cycler对象是可组合的,当您在组合的cycler上进行迭代时,每次迭代得到的是一个plt.plot关键字参数的字典。
您可以在每个axes对象上使用新的默认值比例。
my_ax.set_prop_cycle(new_prop_cycle)

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

plt.rc('axes', prop_cycle=new_prop_cycle)

或者直接更改默认编辑器,修改您的.matplotlibrc文件。
最后一种可能性是使用上下文管理器。
with plt.rc_context({'axes.prop_cycle': new_prop_cycle}):
    ...

为了在一组不同的图形中使用新的,并在上下文结束时恢复默认值。

()函数的文档字符串很有用,但关于模块和()函数的细节(不是太多),以及示例,可以在fine docs中找到。


6
TL;DR: plt.gca().set_prop_cycle('color', color_list)。顺便说一句,答案很好! - Jan Kukacka

33
for color in ['r', 'b', 'g', 'k', 'm']:
    plot(x, y, color=color)

20
如果你手头有一个计数器,也可以这样做:plot(x, y, color="rbgkm"[i]) - Lenar Hoyt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接