Pyplot / matplotlib 折线图 - 相同颜色

12

我使用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个回答

31

默认的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()
产出(yield)

3
那个令人赏心悦目的情节又升级了。 - ManuelSchneid3r
在这行代码中,N是什么? color = cmap(float(i)/N) - anilbey
N是行数。在上面的图中是20。 - unutbu

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种不同的颜色字符串会有些麻烦!你也可以像unutbu的答案中那样绘制一个RGBA值数组来生成颜色,但是大多数内置的调色板都包含红色,因此您必须选择一个不包含红色的调色板,设计自己的调色板,或者选择一系列在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.

那么也许有机会从红色后开始itertools.cycle!你知道在循环重新开始之前集合中有多少种颜色吗? - mcatis
你是指默认的颜色循环吗?你可以通过执行[ax_color_cycle.next() for ii in xrange(10)]来测试它 - 你会发现它会给你['b', 'g', 'r', 'c', 'm', 'y', 'k', 'b', 'g', 'r'],也就是说它每8行重复一次。 - ali_m
好的,谢谢。这对我来说不利。我需要的不仅仅是一个颜色条。 - mcatis
2
我不确定你所说的“colorbar”是什么意思,但是你可以通过改变传递给cycle的列表中字符串的数量来创建自己的颜色循环,长度可以长或短。除了字符串,你还可以将RGBA元组或十六进制值传递给它(在这里查看Matplotlib中指定颜色的其他方法)。 - ali_m
我认为 _get_lines.color_cycle 已经不存在了。请参考 https://matplotlib.org/api/prev_api_changes/api_changes_1.5.0.html?highlight=color_cycle#color-cycle-deprecated - Rho Phi

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