假设我有一个 for 循环,我想用不同的颜色绘制点:
for i in range(5):
plt.plot(x,y,col=i)
如何在 for 循环中自动更改颜色?
假设我有一个 for 循环,我想用不同的颜色绘制点:
for i in range(5):
plt.plot(x,y,col=i)
如何在 for 循环中自动更改颜色?
@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()
如果要控制 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
kwarg(接受 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()
Joe Kington的出色回答已经有 4 年历史了,Matplotlib 已经发生了增量变化(特别是cycler
模块的引入),新的主要版本 Matplotlib 2.0.x 引入了从以下角度来看很重要的风格差异默认使用的颜色。
单条线的颜色(以及不同绘图元素的颜色,例如散点图中的标记)由color
关键字参数控制,
plt.plot(x, y, color=my_color)
my_color
或者是
(0.,0.5,0.5)
,"#008080"
(RGB) 或"#008080A0"
),"k"
对于黑色,可能的值在 中"bgrcmykw"
),"teal"
)---又名HTML 颜色名称(在文档中也是X11/CSS4 颜色名称),'xkcd:'
(例如,'xkcd:barbie pink'
),'T10'
'tab:blue'
'tab:olive'
"C3"
"C"
"0-9"
默认情况下,不同的线使用不同的颜色绘制,这些颜色默认定义并以循环方式使用(因此名称为 颜色循环)。
颜色循环是axes
对象的一个属性,在旧版本中只是一系列有效的颜色名称(默认情况下是一个字符颜色名称的字符串,"bgrcmyk"
),您可以将其设置为
my_ax.set_color_cycle(['kbkykrkg'])
(如评论中所述,此 API 已被弃用,稍后会详细介绍)。
在 Matplotlib 2.0 中,默认的颜色循环是["#1f77b4", "#ff7f0e", "#2ca02c", "#d62728", "#9467bd", "#8c564b", "#e377c2", "#7f7f7f", "#bcbd22", "#17becf"]
Vega 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']
现在相关的属性是'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
是有效颜色面额的通用序列,现在默认情况下,它是cycler
包含标签 ( 'color'
) 和有效颜色面额序列的对象。与前一个界面相比,前进的一步是不仅可以循环线条的颜色,还可以循环其他线条属性,例如,
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}):
...
在一组不同的图中使用新cycler
的,在上下文结束时恢复为默认值。
函数的文档字符串cycler()
很有用,但关于cycler
模块和cycler()
函数的(不是那么多)血腥细节以及示例,可以在精美的文档中找到。
for color in ['r', 'b', 'g', 'k', 'm']:
plot(x, y, color=color)