我可以将点的颜色列表传递给matplotlib' Axes.plot()&#39 ;?

时间:2014-11-04 20:17:39

标签: python performance matplotlib plot

我有很多要点的情节,我注意到在matplotlib中单独绘制它们的时间要长得多(超过 100倍,根据cProfile )而不是一次性绘制它们。

但是,我需要对点进行颜色编码(基于与每个点相关联的数据),并且无法弄清楚如何为给定的Axes.plot()调用绘制多种颜色。例如,我可以使用类似

的结果获得类似于我想要的结果
fig, ax = matplotlib.pyplot.subplots()
rands = numpy.random.random_sample((10000,))
for x in range(10000):
    ax.plot(x, rands[x], 'o', color=str(rands[x]))
matplotlib.pyplot.show()

但宁愿做更快的事情,比如

fig, ax = matplotlib.pyplot.subplots()
rands = numpy.random.random_sample((10000,))
# List of colors doesn't work
ax.plot(range(10000), rands, 'o', color=[str(y) for y in rands])
matplotlib.pyplot.show()

但是提供列表作为color的值不会以这种方式起作用。

有没有办法向Axes.plot()提供颜色列表(以及边缘颜色,面颜色,形状,z次序等),以便每个点都可以自定义,但是所有点都可以立即绘制?


使用Axes.scatter()似乎可以在那里获得部分,因为它允许单独设置点颜色;但颜色似乎就是这样。 (Axes.scatter()也完全不同地列出了这个数字。)

1 个答案:

答案 0 :(得分:1)

我直接创建对象(补丁)的速度大约快5倍。为了说明这个例子,我更改了限制(必须使用此方法手动设置)。圆圈本身用matplotlib.path.Path.circle绘制。最小的工作示例:

import numpy as np
import pylab as plt
from matplotlib.patches import Circle
from matplotlib.collections import PatchCollection

fig, ax = plt.subplots(figsize=(10,10))
rands = np.random.random_sample((N,))

patches = []
colors  = []

for x in range(N):
    C = Circle((x/float(N), rands[x]), .01)
    colors.append([rands[x],rands[x],rands[x]])
    patches.append(C)

plt.axis('equal')
ax.set_xlim(0,1)
ax.set_ylim(0,1)

collection = PatchCollection(patches)
collection.set_facecolor(colors)
ax.add_collection(collection)
plt.show()

enter image description here