为matplotlib中的每个轮廓组件选取一种新颜色

时间:2015-05-16 10:13:45

标签: matplotlib

有时特定的轮廓水平有几个组成部分。例如:

import numpy as np
import matplotlib.pyplot as plt
delta = 1./100  
x = np.arange(-2.0, 3.0, delta)  
y = np.arange(-3.0, 3.0, delta)  
X, Y = np.meshgrid(x, y)  
Z = Y * Y - X * X * X + X  
plt.figure()  
CS = plt.contour(X, Y, Z, [0])  

Contour

如何使用自己的颜色为每个组件着色?

1 个答案:

答案 0 :(得分:1)

我找到了办法! :)但它很骇客,所以我不会接受我的回答,直到有人提出更好的方法。这是我的解决方案(matplotlib 1.4.3)。

正如评论中所指出的,我所问的并不是 matplotlib.contour 知道如何做的事情。但是在对代码进行调查之后,我想出了一个有效的解决方案,但并不是太糟糕。

在幕后,一个名为 QuadContourSet 的类用于存储"线集合"中的所有轮廓路径,每个级别一个行集合。线条集合一起设置。

我的想法是对这个类进行子类化,并将函数 _get_allsegs_and_allkinds 替换为一个函数,该函数将行集合分成每个组件的一个行集合,而不是每个级别。这很hacky所以我把它命名为 HackyContourSet ,但它对我的目的来说足够好。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import contour

class HackyContourSet(contour.QuadContourSet):
    def _get_allsegs_and_allkinds(self):
        allkinds = None
        allsegs = []
        for level in self.levels:
            nlist = self.Cntr.trace(level)
            nseg = len(nlist) // 2
            segs = nlist[:nseg]
            # Original code: allsegs.append(segs) - put all level segments in a
            # collection. New code: Put each segment in a separate collection.
            for seg in segs:
                allsegs.append([seg])
        # The following line is needed to make QuadContourSet think there are
        # more levels, so it would actually draw the additional collections.
        self.levels = [0] * len(allsegs)
        return allsegs, allkinds

####################

delta = 1./100
x = np.arange(-2.0, 3.0, delta)
y = np.arange(-3.0, 3.0, delta)
X, Y = np.meshgrid(x, y)
Z = Y * Y - X * X * X + X

plt.figure()
plt.cla()
axes = plt.gca()
CS = HackyContourSet(axes, X, Y, Z, [0], colors=list('rb'))

enter image description here