使用matplotlib的set_array()例程有哪些指导原则?

时间:2018-04-28 15:22:03

标签: python matplotlib color-mapping

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()的Stack Overflow帖子进行筛选我找到了this one,其中海报声明“set_array()处理将数据值数组映射到RGB”,以及{{3}其中海报表示在某人设置set_array()对象时必须调用ScalarMappable

我尝试过在线发现的示例,例如,更改传入set_array()的值的范围,试图弄清楚它在做什么。但是,在这一点上,我在这个愚蠢的功能上花了太多时间。那些深入到彩色地图中的人有足够的背景来猜测它的作用,但我不能绕道而行,只是为了理解这一功能。

有人可以提供快速描述,也许还有一些链接吗?

1 个答案:

答案 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]')

这给出了以下输出:

mapping cmap using set_array

所做的是将段映射到 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.