如何從 matplotlib 等值圖對象中提取等值線座標數據和屬性值

關鍵技術點

在使用 matplotlib 作圖時,我們經常遇到如下的代碼:

fig, ax = plt.subplots()
CS = ax.contour(X, Y, Z)

即,調用畫圖接口時候,返回了一個對象 CS。要想提取等值線座標數據和屬性值,就要從 CS 對象的方法屬性入手。

通過搜索,發現 CS.collections 和 CS.levels 兩個屬性分別包含了等值線的座標數據和屬性值,並且他們的順序是一樣的。

思路來源

stackoverflow 上的兩篇重要的回答:

collections 和 levels 的結構相同,分別存儲了等值線和屬性值

遍歷 collection 和 levels 的方法

一個示例

參考上面的連接,我設計了一個下面的示例,可以測試提取等值圖的等值線座標數據和屬性值。

import numpy as np
import matplotlib.pyplot as plt

#從等值線中提取座標點和屬性值
def get_contour_verts(cn):
    contours = []
    idx = 0
    # for each contour line
    #print(cn.levels)
    for cc,vl in zip(cn.collections,cn.levels):
        # for each separate section of the contour line
        for pp in cc.get_paths():
            paths = {}
            paths["id"]=idx
            paths["type"]=0
            paths["value"]=float(vl) # vl 是屬性值
            xy = []
            # for each segment of that section
            for vv in pp.iter_segments():
                xy.append([float(vv[0][0]),float(vv[0][0])]) #vv[0] 是等值線上一個點的座標,是 1 個 形如 array[12.0,13.5] 的 ndarray。
            paths["coords"]=xy
            contours.append(paths)
            idx +=1
    return contours
# 等值線繪圖及提取數據示例
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)
ax.clabel(CS, inline=1, fontsize=10)
ax.set_title('Simplest default with labels')
plt.close()
# 打印提取的等值線座標點和屬性值
# 按每條線(段)提取,順序標出 id
print(get_contour_verts(CS))

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章