Pyplot / matplotlib线图 - 相同的颜色

时间:2015-02-11 21:40:16

标签: python matplotlib plot

我用matplotlib / pyplot绘制一个简单的线图。在同一个图中,最多有20行。 Matplotlib自动选择线条颜色。 我需要用较粗的红色画出第一行。

所以我试过了:

if (i==0):                       # first line
    plt.plot(x, y, 'r', lw=2.5)
else:                            # other lines
    plt.plot(x, y)

到目前为止非常简单。第一行是正确的。但其他一条线也是红色的。怎么能避免这个?

2 个答案:

答案 0 :(得分:18)

默认的jet颜色贴图从蓝色变为红色。每个内置色彩映射也都有一个姐妹色图,颜色的顺序相反。反转颜色映射具有相同的名称,后缀为_r。因此,jet_r从红色变为蓝色。

因此,您可以通过定义

jet_r色彩图中为每一行赋予唯一的颜色
color = cmap(float(i)/N)

其中cmapjet_r色彩映射。 色图cmap是可调用的。传递一个浮点数时,它返回一个RGB元组。 因此,如果float(i)/N是每行的0到1之间的明显浮点数,那么每一行将自动获得不同的颜色。


例如,

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 5, 100)
cmap = plt.get_cmap('jet_r')
N = 20
for i, n in enumerate(np.linspace(2.0, 0, N)):
    y = np.sin(x)*x**n
    color = cmap(float(i)/N)
    lw = 2.5 if i==0 else 1
    # zorder controls the order in which the lines are drawn. 
    # The line with the highest zorder lies on top.
    plt.plot(x, y, c=color, lw=lw, zorder=-i)
plt.show()

产量

enter image description here

答案 1 :(得分:1)

有很多方法可以做到这一点。可能最简单和最明显的是为所有20行指定单独的线条颜色:

line_colors = ['r', 'g', 'b', 'c', 'm', 'y', 'k', ...]

for ii in range(20):
    plt.plot(x, y, c=line_colors[ii])

当然要输出20种不同颜色的字符串会有点痛苦!

你也可以通过从色彩图中绘制一组RGBA值来生成颜色,就像在unutbu的答案中一样,但是大多数内置的色彩图都包含红色,所以你必须选择一个不包含的色彩图。红色,design your own或选择0到1之间未映射到色图的红色区域的浮点值范围。

如果你不介意重复某些颜色,一个可能更好的选择是使用itertools.cycle来创建一个在重复周期中产生颜色的生成器对象:

from itertools import cycle

color_cycle = cycle(['g', 'b', 'c', 'm', 'y', 'k'])

for ii in range(20):
    if ii == 0:
        plt.plot(x, y, c='r')
    else:
        plt.plot(x, y, c=cycle.next())

实际上,这正是默认的matplotlib颜色循环的工作原理。每个轴对象都包含一个itertools.cycle,它按顺序更改在该轴上绘制的每条线的默认颜色:

ax = plt.axes()

ax_color_cycle = ax._get_lines.color_cycle

print(ax_color_cycle)
# <itertools.cycle object at 0x7fdb91efae60>

print(ax_color_cycle.next())
# b

print(ax_color_cycle.next())
# g

print(ax_color_cycle.next())
# r

# etc.