[英]get matplotlib / cartopy contour auto label coordinates
如何在下面的示例中检索自动确定的轮廓 label 坐标?
文档中的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)
Label 位置最好从CS
object 检索,而不是CS_labels
object。
笔记:
tdy 的解决方案仅适用于 matplotlib,但在使用 cartopy GeoAxes 时无效,因为ax.clabel()
为CS_labels
返回'NoneType'
,因此无法以这种方式访问CS_labels[0].get_position()
。
如果我理解正确,你可以使用这个:
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)]
对于 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()
列出轮廓 label 文本:-
CS.labelTexts
Output:
[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 ')]
要打印 position 和每个 label 的文本:-
for txobj in CS.labelTexts:
pos = txobj.get_position()
txt = txobj.get_text()
print(pos, txt)
output:
(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()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.