有时特定的轮廓水平有几个组成部分。例如:
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])
如何使用自己的颜色为每个组件着色?
答案 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'))