Pyplot / matplotlib 线图 - 相同颜色
Pyplot / matplotlib line plot - same color
我用 matplotlib/pyplot 绘制了一个简单的线图。在同一个情节中,最多有 20 行。 Matplotlib 会自动选择线条颜色。
我需要用更粗的红色绘制第一条线。
所以我尝试了:
if (i==0): # first line
plt.plot(x, y, 'r', lw=2.5)
else: # other lines
plt.plot(x, y)
到目前为止非常简单。第一行是正确的。但其中一条线也是红色的。如何避免这种情况?
有很多方法可以做到这一点。可能最简单和最明显的是为所有 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 值来生成颜色,但是大多数内置颜色图都包含红色,因此您必须选择一个不包含红色的颜色图t 包含红色,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.
默认的 jet
颜色图从蓝色变为红色。每个内置颜色图还有一个姐妹颜色图,颜色顺序相反。反转色图同名后缀_r
。因此,jet_r
从红色变为蓝色。
因此您可以通过定义
为 jet_r
颜色图中的每一行赋予独特的颜色
color = cmap(float(i)/N)
其中 cmap
是 jet_r
颜色图。
颜色图 cmap
是可调用的。当传递一个浮点数时,它 returns 一个 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()
产量
我用 matplotlib/pyplot 绘制了一个简单的线图。在同一个情节中,最多有 20 行。 Matplotlib 会自动选择线条颜色。 我需要用更粗的红色绘制第一条线。
所以我尝试了:
if (i==0): # first line
plt.plot(x, y, 'r', lw=2.5)
else: # other lines
plt.plot(x, y)
到目前为止非常简单。第一行是正确的。但其中一条线也是红色的。如何避免这种情况?
有很多方法可以做到这一点。可能最简单和最明显的是为所有 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 值来生成颜色,但是大多数内置颜色图都包含红色,因此您必须选择一个不包含红色的颜色图t 包含红色,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.
默认的 jet
颜色图从蓝色变为红色。每个内置颜色图还有一个姐妹颜色图,颜色顺序相反。反转色图同名后缀_r
。因此,jet_r
从红色变为蓝色。
因此您可以通过定义
为jet_r
颜色图中的每一行赋予独特的颜色
color = cmap(float(i)/N)
其中 cmap
是 jet_r
颜色图。
颜色图 cmap
是可调用的。当传递一个浮点数时,它 returns 一个 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()
产量