我有很多要点的情节,我注意到在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()
也完全不同地列出了这个数字。)
答案 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()