簡體   English   中英

獲取 matplotlib / cartopy 輪廓自動 label 坐標

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM