gpt4 book ai didi

python - matplotlib clabel 上的 set_clip_path 没有正确剪裁

转载 作者:行者123 更新时间:2023-11-28 22:29:35 33 4
gpt4 key购买 nike

我正在制作一个剪裁到多边形路径的等高线图:

import matplotlib.pyplot as plt
from matplotlib.patches import Polygon
import numpy as np

fig = plt.figure()
axes = plt.subplot()
x,y = np.meshgrid( np.linspace(-10,10,51), np.linspace(-10,10,51) )
z = np.sin(np.sqrt(x**2+y**2))
CS = axes.contour(x, y, z, np.linspace(-1,1,11) )
axes.set_aspect('equal')

# clip contours by polygon
radius = 8
t = np.linspace(0,2*np.pi,101)
x_bound,y_bound = radius*np.sin(t),radius*(np.cos(t)+0.1*(np.cos(7*t)))
clip_map = Polygon(list(zip(x_bound,y_bound)),fc='#EEEEEE',ec='none')
axes.add_patch(clip_map)
for collection in CS.collections:
collection.set_clip_path(clip_map)

# label the contours
CLB = axes.clabel(CS, colors='black')
for text_object in CLB:
text_object.set_clip_path(clip_map) # Doesn't do anything!

plt.show()

令我惊讶的是,尽管 Text 对象具有不返回错误的 set_clip_path 方法,但标签并未被剪裁:

contour plot where labels aren't clipped

如何剪裁灰色多边形区域外的标签?我是否需要手动查找 X 和 Y 位置、计算多边形中的点以及为每个 Text 项设置 set_visible = False?为什么这段代码不能按原样工作?我使用的是 matplotlib 版本 1.5.1 和 python 3.5.1。

最佳答案

以防万一有一天有人遇到同样的问题,这里有一个解决方案,它必须使用 shapely 包来测试多边形中的点以设置 Text 的可见性状态 对象。它完成了工作,但如果可以使用 set_clip_path 直接在 Text 对象上工作,那就太好了。

import matplotlib.pyplot as plt
from matplotlib.patches import Polygon
import numpy as np
from shapely.geometry import Polygon as ShapelyPolygon
from shapely.geometry import Point as ShapelyPoint

fig = plt.figure()
axes = plt.subplot()
x,y = np.meshgrid( np.linspace(-10,10,51), np.linspace(-10,10,51) )
z = np.sin(np.sqrt(x**2+y**2))
CS = axes.contour(x, y, z, np.linspace(-1,1,11) )
axes.set_aspect('equal')

# clip contours by polygon
radius = 8
t = np.linspace(0,2*np.pi,101)
x_bound,y_bound = radius*np.sin(t),radius*(np.cos(t)+0.1*(np.cos(7*t)))
clip_map = Polygon(list(zip(x_bound,y_bound)),fc='#EEEEEE',ec='none')
axes.add_patch(clip_map)
for collection in CS.collections:
collection.set_clip_path(clip_map)

# label the contours
CLB = axes.clabel(CS, colors='black')
clip_map_shapely = ShapelyPolygon(clip_map.get_xy())

for text_object in CLB:
if not clip_map_shapely.contains(ShapelyPoint(text_object.get_position())):
text_object.set_visible(False)

plt.show()

enter image description here

关于python - matplotlib clabel 上的 set_clip_path 没有正确剪裁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42929534/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com