如何获取Matplotlib等高线标签位置,在另一组等高线绘制空白区域?
提取Matplotlib等高线标签位置并在另一组等高线处绘制空白
你可以通过捕获clabel()返回的标签对象,提取每个标签的位置,然后在对应位置绘制白色图形遮挡另一组等高线,实现仅保留一组标签、且另一组等高线在标签位置留空的效果。
修改后的代码如下:
import numpy import matplotlib.pyplot as plt delta = 0.025 x = numpy.arange(-3.0, 3.0, delta) y = numpy.arange(-2.0, 2.0, delta) X, Y = numpy.meshgrid(x, y) Z1 = numpy.exp(-X**2 - Y**2) Z2 = numpy.exp(-(X - 1)**2 - (Y - 1)**2) Z = (Z1 - Z2) * 2 Z2 = Z * 1.1 # 添加等高线并捕获标签对象 fig, ax = plt.subplots() CS = ax.contour(X, Y, Z) CS2 = ax.contour(X, Y, Z2) # 调用clabel并保存返回的标签实例 labeler = ax.clabel(CS, inline=1, fmt='%1d', fontsize=10) ax.set_title('Simplest default with labels') # 提取每个标签的位置,在CS2对应位置绘制白色圆形遮挡 for label in labeler: # 获取标签的中心坐标 x_pos, y_pos = label.get_position() # 绘制白色圆形,半径可根据字体大小调整 circle = plt.Circle((x_pos, y_pos), 0.15, color='white', zorder=2) ax.add_patch(circle) plt.show()
关键步骤说明:
- 调用
ax.clabel()时保存返回值labeler,该对象包含所有添加到CS上的标签实例。 - 遍历每个标签,通过
label.get_position()获取标签的中心坐标。 - 使用
plt.Circle()创建白色圆形(也可替换为矩形plt.Rectangle()),设置zorder=2确保图形在等高线之上,完全遮挡CS2的线条。 - 圆形半径可根据字体大小和视觉需求调整,保证空白区域刚好覆盖穿过标签的CS2等高线。
如果需要更精准匹配CS2中等高线的位置,也可以根据标签对应的等高线数值,定位CS2中同数值的等高线段后进行遮挡,但上述方法已能满足大部分场景需求。
内容的提问来源于stack exchange,提问作者user2256085
相关产品推荐
相关产品推荐

