如何使用Matplotlib用户定义的色彩映射找到白色?

时间:2013-02-01 21:43:33

标签: python matplotlib color-mapping

我用这个构造函数创建了一堆RegularPolygons -

        node.brushShape = RegularPolygon((node.posX, node.posY),
                            6,
                            node.radius * 0.8,
                            linewidth = 3,
                            edgecolor = (1,1,1),
                            facecolor = 'none',
                            zorder = brushz)

如您所见,我希望这些补丁的边缘是白色的。我将它们全部放入名为brushShapes的列表中,然后创建一个PatchCollection -

self.brushShapesPC = PatchCollection(self.brushShapes, match_original=True)

这种方式可以很好地保持边缘白色。但是,现在我想使用用户定义的色彩映射 -

colormap = {'red':  ((0.0, 0.0, 0.0),
               (0.25,0.0, 0.0),
               (0.5, 0.8, 1.0),
               (0.75,1.0, 1.0),
               (1.0, 0.4, 1.0)),

        'green': ((0.0, 0.0, 0.0),
               (0.25,0.0, 0.0),
               (0.5, 0.9, 0.9),
               (0.75,0.0, 0.0),
               (1.0, 0.0, 0.0)),

        'blue':  ((0.0, 0.0, 0.4),
               (0.25,1.0, 1.0),
               (0.5, 1.0, 0.8),
               (0.75,0.0, 0.0),
               (1.0, 0.0, 0.0))} 

所以现在我的PatchCollection实例化是 -

self.brushShapesPC = PatchCollection(self.brushShapes, cmap=mpl.colors.LinearSegmentedColormap('SOMcolormap', self.colormap))

但现在边缘的颜色与脸部相同!所以我需要做的是 - 使用新的colormap确定白色的值是什么......并更改

edgecolor = (1,1,1)

edgecolor = (whatever_white_is)

在这个构造函数中 -

node.brushShape = RegularPolygon((node.posX, node.posY),
                        6,
                        node.radius * 0.8,
                        linewidth = 3,
                        edgecolor = (1,1,1),
                        facecolor = 'none',
                        zorder = brushz)

是吗?我试图确定白色的价值是多么困难。当我调出一个颜色条时,它显示白色正好位于中心...所以我尝试过(0.5,0.5,0.5),(0,1,0)等等。任何人都可以帮我弄清楚我应该做什么放?是否有通用的方法来了解任何给定色图的白色是什么?

1 个答案:

答案 0 :(得分:1)

我认为你有点倒退了。没有完全通用的方法来确定色图中的白色(它可能存在多次或根本不存在)。

但是,您可以在使用PolyCollection时指定多边形的边缘应为白色,同时仍然使用面的色彩映射。只需指定edgecolors而不是edgecolor。这是一个令人困惑的问题,但这个想法是它是复数,因为你可以指定多个值。另外,请查看RegularPolygonCollection

作为一个简单的例子:

import matplotlib.pyplot as plt
from matplotlib.patches import RegularPolygon
from matplotlib.collections import PatchCollection
import numpy as np

xy = np.random.random((10,2))
z = np.random.random(10)

patches = [RegularPolygon((x,y), 5, 0.1) for x, y in xy]
collection = PatchCollection(patches, array=z, edgecolors='white', lw=2)

fig, ax = plt.subplots()
# So that the white edges show up...
ax.patch.set(facecolor='black')
ax.add_collection(collection)
ax.autoscale()

plt.show()

enter image description here