set_array
的文档非常吝啬。它有什么作用?它可以采用多大的价值范围?它如何与其他与颜色相关的例程和数据结构一起使用?
在collections docpage上,它被称为“从numpy数组A设置图像数组”。它在colormap API中以相同的方式描述。就是这样。
我没有在matplotlib编程的几本畅销书中找到set_array()
(更少的例子),例如Devert(2014),McGreggor(2015),Root(2015)和Tossi(2009)。
然而,如果set_array()
是一些只在极少数情况下需要的神秘功能,为什么它在matplotlib示例和SciKit Learn网站上发布的示例中经常出现?看起来像一个非常主流的功能,所以它应该有更多的主流文档。
例如:
set_array()
in creation of a multi-colored line 通过提及set_array()
的Stack Overflow帖子进行筛选我找到了this one,其中海报声明“set_array()
处理将数据值数组映射到RGB”,以及{{3}其中海报表示在某人设置set_array()
对象时必须调用ScalarMappable
。
我尝试过在线发现的示例,例如,更改传入set_array()
的值的范围,试图弄清楚它在做什么。但是,在这一点上,我在这个愚蠢的功能上花了太多时间。那些深入到彩色地图中的人有足够的背景来猜测它的作用,但我不能绕道而行,只是为了理解这一功能。
有人可以提供快速描述,也许还有一些链接吗?
答案 0 :(得分:1)
set_array
方法本身并没有做太多。它只定义定义它的对象内部的数组的内容。例如参见 matplotlib.cm
def set_array(self, A):
"""
Set the image array from numpy array *A*.
Parameters
----------
A : ndarray
"""
self._A = A
self._update_dict['array'] = True
在 multicolored_line example of the matplotlib documentation 中,这用于映射 cmap 的颜色。
让我们举一个类似的例子,创建一组线条并将这些线段映射到颜色图中的索引颜色:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.collections import LineCollection
from matplotlib.colors import ListedColormap, BoundaryNorm
f, axes = plt.subplots(ncols=3)
y = np.arange(0,1,0.1).repeat(2)
x = np.append(y[1:], [1])
segments = np.array(list(zip(x,y))).reshape(-1, 2, 2)
cmap = ListedColormap(['r', 'g', 'b'])
norm = BoundaryNorm([-0.5, 0.5, 1.5, 2.5], cmap.N)
for ax in axes:
ax.add_collection(LineCollection(segments, cmap=ListedColormap(['r', 'g', 'b']), norm=norm))
axes[1].collections[0].set_array(np.array([0,1]))
axes[2].collections[0].set_array(np.array([0,1,2]))
axes[1].set_title('set_array to [0,1]')
axes[2].set_title('set_array to [0,1,2]')
这给出了以下输出:
所做的是将段映射到 cmap 中定义的索引颜色(这里是 0->'r', 1->'g', 2->'b')。此行为在 matpotlib.collections 源代码中指定:
<块引用>Each Collection can optionally be used as its own `.ScalarMappable` by
passing the *norm* and *cmap* parameters to its constructor. If the
Collection's `.ScalarMappable` matrix ``_A`` has been set (via a call
to `.Collection.set_array`), then at draw time this internal scalar
mappable will be used to set the ``facecolors`` and ``edgecolors``,
ignoring those that were manually passed in.