【发布时间】:2011-06-15 20:35:53
【问题描述】:
我正在使用matplotlib 创建绘图。我必须用 Python 自动生成的不同颜色识别每个图。
你能不能给我一个方法,在同一个图中为不同的图放置不同的颜色?
【问题讨论】:
标签: python colors matplotlib
我正在使用matplotlib 创建绘图。我必须用 Python 自动生成的不同颜色识别每个图。
你能不能给我一个方法,在同一个图中为不同的图放置不同的颜色?
【问题讨论】:
标签: python colors matplotlib
Matplotlib 默认会这样做。
例如:
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(10)
plt.plot(x, x)
plt.plot(x, 2 * x)
plt.plot(x, 3 * x)
plt.plot(x, 4 * x)
plt.show()
而且,您可能已经知道,您可以轻松添加图例:
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(10)
plt.plot(x, x)
plt.plot(x, 2 * x)
plt.plot(x, 3 * x)
plt.plot(x, 4 * x)
plt.legend(['y = x', 'y = 2x', 'y = 3x', 'y = 4x'], loc='upper left')
plt.show()
如果你想控制循环的颜色:
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(10)
plt.gca().set_color_cycle(['red', 'green', 'blue', 'yellow'])
plt.plot(x, x)
plt.plot(x, 2 * x)
plt.plot(x, 3 * x)
plt.plot(x, 4 * x)
plt.legend(['y = x', 'y = 2x', 'y = 3x', 'y = 4x'], loc='upper left')
plt.show()
如果你不熟悉 matplotlib,the tutorial is a good place to start。
编辑:
首先,如果您想在一个图形上绘制很多 (>5) 事物,则:
否则,您将得到一个非常混乱的情节!善待那些将要阅读您正在做的任何事情的人,不要试图将 15 种不同的东西塞进一个人物!
除此之外,许多人都有不同程度的色盲,而且对于更多的人来说,区分众多细微不同的颜色比您可能意识到的还要困难。
话虽如此,如果您真的想在一个轴上放置 20 条线,并使用 20 种相对不同的颜色,这里有一种方法:
import matplotlib.pyplot as plt
import numpy as np
num_plots = 20
# Have a look at the colormaps here and decide which one you'd like:
# http://matplotlib.org/1.2.1/examples/pylab_examples/show_colormaps.html
colormap = plt.cm.gist_ncar
plt.gca().set_prop_cycle(plt.cycler('color', plt.cm.jet(np.linspace(0, 1, num_plots))))
# Plot several different functions...
x = np.arange(10)
labels = []
for i in range(1, num_plots + 1):
plt.plot(x, i * x + 5 * i)
labels.append(r'$y = %ix + %i$' % (i, 5*i))
# I'm basically just demonstrating several different legend options here...
plt.legend(labels, ncol=4, loc='upper center',
bbox_to_anchor=[0.5, 1.1],
columnspacing=1.0, labelspacing=0.0,
handletextpad=0.0, handlelength=1.5,
fancybox=True, shadow=True)
plt.show()
【讨论】:
set_color_cycle 已被弃用,因此该行应为 plt.gca().set_prop_cycle(plt.cycler('color', plt.cm.jet(np.linspace(0, 1, num_plots)))),只需更改 plt.cm.YOUR_PREFERED_COLOR_MAP 以满足您的需要。跨度>
axes 中)适当地为不同的曲线着色,并询问在不同的图中改变单条线的颜色(不同 @ 987654334@)...也就是说,对一个重要问题的出色回答(可能与 OP 所问的不同,但没有人知道,因为他们问了这个问题并消失了!)- +1
如果您不知道要绘制的图的数量,您可以在绘制它们后更改颜色,使用 .lines 直接从图中检索数字,我使用此解决方案:
import matplotlib.pyplot as plt
import numpy as np
fig1 = plt.figure()
ax1 = fig1.add_subplot(111)
for i in range(1,15):
ax1.plot(np.array([1,5])*i,label=i)
colormap = plt.cm.gist_ncar #nipy_spectral, Set1,Paired
colors = [colormap(i) for i in np.linspace(0, 1,len(ax1.lines))]
for i,j in enumerate(ax1.lines):
j.set_color(colors[i])
ax1.legend(loc=2)
【讨论】:
TL;DR不,它不能自动完成。是的,有可能。
import matplotlib.pyplot as plt
my_colors = plt.rcParams['axes.prop_cycle']() # <<< note that we CALL the prop_cycle
fig, axes = plt.subplots(2,3)
for ax in axes.flatten(): ax.plot((0,1), (0,1), **next(my_colors))
图 (figure) 中的每个图 (axes) 都有自己的颜色循环——如果您不为每个图强制使用不同的颜色,所有图共享相同的颜色顺序,但是,如果我们 拉伸一点“自动”的意思,可以做到。
OP 写的
[...] 我必须用 [Matplotlib] 自动生成的不同颜色识别每个图。
但是... Matplotlib 会自动为每条不同的曲线生成不同的颜色
In [10]: import numpy as np
...: import matplotlib.pyplot as plt
In [11]: plt.plot((0,1), (0,1), (1,2), (1,0));
Out[11]:
那么为什么是 OP 请求呢?如果我们继续阅读,我们有
你能不能给我一个方法,在同一个图中为不同的情节设置不同的颜色?
这是有道理的,因为每个图(用 Matplotlib 的说法是每个 axes)都有自己的 color_cycle(或者更确切地说,在 2018 年,它的 prop_cycle)并且每个图(axes)都重复使用相同的颜色顺序相同。
In [12]: fig, axes = plt.subplots(2,3)
In [13]: for ax in axes.flatten():
...: ax.plot((0,1), (0,1))
如果这是原始问题的含义,一种可能性是为每个图明确命名不同的颜色。
如果图(经常发生)是在循环中生成的,我们必须有一个额外的循环变量来覆盖 Matplotlib 选择的颜色自动。
In [14]: fig, axes = plt.subplots(2,3)
In [15]: for ax, short_color_name in zip(axes.flatten(), 'brgkyc'):
...: ax.plot((0,1), (0,1), short_color_name)
另一种可能性是实例化循环器对象
from cycler import cycler
my_cycler = cycler('color', ['k', 'r']) * cycler('linewidth', [1., 1.5, 2.])
actual_cycler = my_cycler()
fig, axes = plt.subplots(2,3)
for ax in axes.flat:
ax.plot((0,1), (0,1), **next(actual_cycler))
注意type(my_cycler) 是cycler.Cycler 但type(actual_cycler) 是itertools.cycle。
【讨论】:
我想对上一篇文章中给出的最后一个循环答案进行小幅改进(该帖子是正确的,仍应被接受)。标记最后一个示例时的隐含假设是 plt.label(LIST) 将标签编号 X 放入 LIST 中,对应于第 X 次调用 plot 的行。我以前遇到过这种方法的问题。根据 matplotlibs 文档 (http://matplotlib.org/users/legend_guide.html#adjusting-the-order-of-legend-item) 构建图例和自定义标签的推荐方法是让标签与您认为的确切图一致:
...
# Plot several different functions...
labels = []
plotHandles = []
for i in range(1, num_plots + 1):
x, = plt.plot(some x vector, some y vector) #need the ',' per ** below
plotHandles.append(x)
labels.append(some label)
plt.legend(plotHandles, labels, 'upper left',ncol=1)
【讨论】:
Matplot 用不同的颜色为你的绘图着色,但如果你想使用特定的颜色
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(10)
plt.plot(x, x)
plt.plot(x, 2 * x,color='blue')
plt.plot(x, 3 * x,color='red')
plt.plot(x, 4 * x,color='green')
plt.show()
【讨论】:
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
from skspatial.objects import Line, Vector
for count in range(0,len(LineList),1):
Line_Color = np.random.rand(3,)
Line(StartPoint,EndPoint)).plot_3d(ax,c="Line"+str(count),label="Line"+str(count))
plt.legend(loc='lower left')
plt.show(block=True)
以上代码可能会帮助您以随机方式添加具有不同颜色的 3D 线条。您的彩色线条也可以在 label="..." 参数中提到的图例的帮助下被引用。
【讨论】: