【问题标题】:Plotting different colors in matplotlib [duplicate]在matplotlib中绘制不同的颜色[重复]
【发布时间】:2013-04-07 01:25:25
【问题描述】:

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

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

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

【问题讨论】:

标签: python matplotlib


【解决方案1】:

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

最后,如果您想从existing colormap 中自动选择指定数量的颜色:

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

【讨论】:

  • 你的回答是,嗯,比我的好很多。
  • 谢谢!不过,您的主要观点分为两行。我的主要是为了过长而过长......
  • 投反对票,因为这在 P3 中已被弃用,而“MatplotlibDeprecationWarning:set_color_cycle 属性在 1.5 版中已弃用。请改用 set_prop_cycle。”
【解决方案2】:

Joe Kingtonexcellent answer已经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'])

(如 in a comment 所述,此 API 已被弃用,稍后会详细介绍)。

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

(图为https://vega.github.io/vega/docs/schemes/截图)

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 是有效颜色的通用序列 面额,现在默认情况下它是一个 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() 函数的(不是那么多)血腥细节以及示例,可以在in the fine docs 找到。

【讨论】:

  • TL;博士:plt.gca().set_prop_cycle('color', color_list)。很好的答案,顺便说一句!
【解决方案3】:
for color in ['r', 'b', 'g', 'k', 'm']:
    plot(x, y, color=color)

【讨论】:

  • 如果您手边有柜台,您也可以这样做:plot(x, y, color="rbgkm"[i])
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-10
  • 2020-07-22
  • 1970-01-01
  • 2013-09-23
  • 2014-05-24
相关资源
最近更新 更多