關鍵技術點
在使用 matplotlib 作圖時,我們經常遇到如下的代碼:
fig, ax = plt.subplots()
CS = ax.contour(X, Y, Z)
即,調用畫圖接口時候,返回了一個對象 CS。要想提取等值線座標數據和屬性值,就要從 CS 對象的方法屬性入手。
通過搜索,發現 CS.collections 和 CS.levels 兩個屬性分別包含了等值線的座標數據和屬性值,並且他們的順序是一樣的。
思路來源
stackoverflow 上的兩篇重要的回答:
collections 和 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))