获取 matplotlib / cartopy 轮廓自动标签坐标

问题描述

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

来自 the documentation 的 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')

enter image description here

我想做类似的事情

label_locations = CS_labels.get_label_coords()

这样我就可以从自动选择的集合开始,并根据需要手动修改。这在处理 labels in geospatial coordinates 时特​​别有用。

更新:
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()

解决方法

如果我理解正确,你可以使用这个:

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,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,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()

contourplot

要列出轮廓标签文本:-

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() 方法。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...