7

我正在尝试使用 Matplotlib 中的剪辑来剪辑圆形和椭圆之类的形状,但一定有我遗漏的东西.. 为什么不把圆圈剪成两半?:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Circle
from matplotlib.transforms import Bbox

clip_box = Bbox(((-2,-2),(2,0)))
circle = Circle((0,0),1,clip_box=clip_box,clip_on=True)

plt.axes().add_artist(circle)
plt.axis('equal')
plt.axis((-2,2,-2,2))
plt.show()
4

2 回答 2

7

我不知道为什么您的代码不起作用,但是,以下代码段可以按您的预期工作。

据我所知,clip_on 与将给定的剪辑应用到形状无关,但该形状是否应该在显示区域中剪辑。

import matplotlib.pyplot as plt
from matplotlib.patches import Circle, Rectangle

rect = Rectangle((-2,-2),4,2, facecolor="none", edgecolor="none")
circle = Circle((0,0),1)

plt.axes().add_artist(rect)
plt.axes().add_artist(circle)

circle.set_clip_path(rect)

plt.axis('equal')
plt.axis((-2,2,-2,2))
plt.show()
于 2012-04-17T14:27:24.150 回答
2

我一直在努力解决这个问题,所以这是我的版本:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Circle
from matplotlib.transforms import Bbox



# This is in PIXELS
# first tuple : coords of box' bottom-left corner, from the figure's bottom-left corner
# second tuple : coords of box' top-right corner, from the figure's bottom-left corner
clip_box = Bbox(((0,0),(300,300)))
circle = Circle((0,0),1)

plt.axis('equal')
plt.axis((-2,2,-2,2))
plt.axes().add_artist(circle)

# You have to call this after add_artist()
circle.set_clip_box(clip_box)

plt.show()

两个区别是框的坐标以像素为单位(?!),并且set_clip_box()仅在之后才有效add_artists()(这就是为什么clip_box=clip_box不起作用)。我很想知道应该配置什么来让它在“轴单元”中工作。

对于后代,这是我用来解决此问题的黑客。它剪辑了所有内容,包括绘图、轴等:

for o in plt.findobj():
    o.set_clip_on(True)
    o.set_clip_box(clip_box)
于 2013-05-31T15:45:34.120 回答