在Matplotlib中剪辑,为什么不起作用?

bmp9r5qi  于 2023-01-09  发布在  其他
关注(0)|答案(2)|浏览(111)

我尝试使用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()
jdzmm42g

jdzmm42g1#

我不知道为什么你的代码不工作,但是,下面的代码片段的工作正如你所期望的。
根据我的理解,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)

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

circle.set_clip_path(rect)

plt.axis('equal')
plt.axis((-2,2,-2,2))
plt.show()
g52tjvyc

g52tjvyc2#

我一直在纠结这个问题,所以我的版本是:

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)

相关问题