如何获取轮廓自动标签坐标

问题描述 投票:0回答:2

如何检索下例中自动确定的轮廓标签坐标?

文档中的 matplotlib 示例

import matplotlib
import numpy as np
import matplotlib.cm as cm
import matplotlib.pyplot as plt


delta = 0.025
x = np.arange(-3.0, 3.0, delta)
y = np.arange(-2.0, 2.0, delta)
X, Y = np.meshgrid(x, y)
Z1 = np.exp(-X**2 - Y**2)
Z2 = np.exp(-(X - 1)**2 - (Y - 1)**2)
Z = (Z1 - Z2) * 2

fig, ax = plt.subplots()
CS = ax.contour(X, Y, Z)
CS_labels = ax.clabel(CS, inline=True, fontsize=10)
ax.set_title('Simplest default with labels')

我想做类似的事情

label_locations = CS_labels.get_label_coords()

这样我就可以从自动选择的集合开始,并根据需要手动修改。这在处理地理空间坐标中的标签时特别有用。

更新: swatchai 提供的解决方案适用于 matplotlib 和 cartopy。

for txobj in CS.labelTexts: pos = txobj.get_position() txt = txobj.get_text() print(pos, txt)
标签位置最好从 

CS

 对象检索,而不是从 
CS_labels
 对象。

注: tdy 的解决方案仅适用于 matplotlib,但不适用于使用 cartopy GeoAxes 时,因为
ax.clabel()

 对于 
'NoneType'
 返回 
CS_labels
,因此无法以这种方式访问 
CS_labels[0].get_position()

python matplotlib coordinates contour cartopy
2个回答
1
投票
如果我理解正确,你可以使用这个:

label_locations = [label.get_position() for label in CS_labels] # [( 0.9499999999999864, 0.5360418495133943), # ( 1.8999999999999821, 1.755885999331959), # ( 0.15000000000000968, 0.8499999999999899), # (-0.9000000000000075, -0.75588599933193), # ( 0.4135112591682213, 0.124999999999992), # (-0.42169775490495853, -0.2750000000000066)]
    

1
投票
对于cartopy,一旦创建了轮廓标签,您可以通过

访问标签

CS.labelTexts #CS is contour_collection set
这是演示所有步骤的可运行代码。

import cartopy.crs as ccrs import matplotlib.pyplot as plt import cartopy import numpy as np delta = 0.025 x = np.arange(-3.0, 3.0, delta) y = np.arange(-2.0, 3.0, delta) X, Y = np.meshgrid(x, y) Z1 = np.exp(-X**2 - Y**2)*20 Z2 = np.exp(-(X - 1)**2 - (Y - 1)**2)*20 Z = (Z1 - Z2) * 2 fig = plt.figure() ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree()) CS = ax.contour(X, Y, Z) ax.clabel( CS, colors=['black'], manual=False, inline=True, fmt=' {:.0f} '.format ) ax.set_extent([-3,3,-2,3]) ax.gridlines(draw_labels=True) plt.show()

列出轮廓标签文本:-

CS.labelTexts
输出:

[Text(1.003030188944607, 0.7749999999999897, ' -30 '), Text(1.4249999999999843, 1.7059169688922102, ' -20 '), Text(0.30880609807150927, 0.9499999999999895, ' -10 '), Text(0.6000000000000081, 0.3999999999999915, ' 0 '), Text(-0.7000000000000091, -0.9440944811557408, ' 10 '), Text(-0.12500000000001066, -0.8102372655970758, ' 20 '), Text(-0.050000000000010925, 0.24709487906649752, ' 30 ')]
打印每个标签的位置和文本:-

for txobj in CS.labelTexts: pos = txobj.get_position() txt = txobj.get_text() print(pos, txt)
输出:

(1.003030188944607, 0.7749999999999897) -30 (1.4249999999999843, 1.7059169688922102) -20 (0.30880609807150927, 0.9499999999999895) -10 (0.6000000000000081, 0.3999999999999915) 0 (-0.7000000000000091, -0.9440944811557408) 10 (-0.12500000000001066, -0.8102372655970758) 20 (-0.050000000000010925, 0.24709487906649752) 30
如果要操作每个标签,经常使用方法 

.set_text()

.set_position()

© www.soinside.com 2019 - 2024. All rights reserved.