【问题标题】:Can I pass a list of colors for points to matplotlib's 'Axes.plot()'?我可以将点的颜色列表传递给 matplotlib 的“Axes.plot()”吗?
【发布时间】:2023-03-09 09:36:01
【问题描述】:

我有很多点要绘制,我注意到在 matplotlib 中单独绘制它们比绘制它们需要更长的时间(根据cProfile,超过 100 倍以上)一次全部。

但是,我需要对点进行颜色编码(基于与每个点关联的数据),并且无法弄清楚如何为给定的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() 的布局也完全不同。)

【问题讨论】:

  • 注意:在实际应用中,点需要根据与每个点关联的其他数据着色,而不仅仅是y值(因此没有依赖于它的捷径会有所帮助)。在某些情况下更改mark 也会有所帮助(所以:mark 的问题相同)。并且必须保留点的顺序。
  • 您是否考虑过使用scatter 而不是plot?在那里,您还可以使用颜色图来指定颜色。
  • @BrenBarn:我继承了代码(并且无法完全控制它)。我可以简单地将我的ax.plot()for ... ax.plot() 替换为ax.scatter() 吗?那太好了!
  • 查看 matplotlib 文档中scatter 的文档并熟悉如何使用它。然后你会知道你是否可以使用它。很难知道你是否能够在不知道你能改变什么和不能改变什么的情况下使用它。 (例如,如果您无法控制代码,您甚至可能无法更改 plot 版本以按照您想要的方式工作,对吧?)
  • @BrenBarn:基本上,我可以获得所有数据所需的列表(所有 x 和 y 坐标,以及它们应该具有的所有颜色,按顺序排列);我可以调用ax 上的任何方法(如示例中所示),而不是任何plot 调用。但是我无法更改轴的设置方式(例如,所有对 set 的调用都已经发生)。

标签: python performance matplotlib plot


【解决方案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()

【讨论】:

  • 是的,这要快得多。我对matplotlib.pyplot.axis('equal') 有一些麻烦,因为在我的实际场景中我有不同的数字比例,我不确定在这种情况下如何处理圆圈。我有类似 fig.set_size_inches(fig_ratio*fig.get_size_inches()[1], fig.get_size_inches()[1]) 的东西 fig_ratio = 1.675
  • @raxacoricofallapatorius 原始版本如此缓慢的原因是因为您正在创建N 不同的绘图对象——每个对象都有相当长的创建时间。至于比例问题,我会将您的数据重新调整为 [0,1] 并简单地更改轴上的标签(这是我过去所做的)。
  • 我试试看。出于某种原因,扩展东西是我最大的绊脚石。
  • @raxacoricofallapatorius 同样对于这么多数据点,您可能需要考虑某种类型的热图,您可能会因为重叠太多点而失去信息密度。
  • 另外,我假设有了补丁/圆圈,我可以完全控制边缘颜色、面部颜色、不透明度等。
猜你喜欢
  • 1970-01-01
  • 2016-12-11
  • 2022-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-03
相关资源
最近更新 更多