【问题标题】:Finding largest closed 3D contour plot寻找最大的封闭 3D 等高线图
【发布时间】:2016-11-10 00:52:28
【问题描述】:

我有一个散点图和许多等高线图。有许多轮廓,有些闭合有些不闭合。如何从 [this] 中识别最大闭合轮廓的值。1

【问题讨论】:

  • 如何定义闭合轮廓的大小?任意两点之间的最大距离?长度?
  • 最大外围距离

标签: python numpy matplotlib


【解决方案1】:

找到最大的闭合轮廓可以如下完成;请注意,尽管这假设“最大”是指最大的点对点距离。

不过,其他尺寸指标也可以轻松替代。

还要注意,如果您使用extend3d=True 版本,则需要操作创建的Poly3DCollection,这有点棘手。

from mpl_toolkits.mplot3d import axes3d, art3d
import matplotlib.pyplot as plt
from matplotlib import cm
from scipy.spatial import distance_matrix
import numpy as np    

fig = plt.figure()
ax = fig.gca(projection='3d')
X, Y, Z = axes3d.get_test_data(0.05)
cset = ax.contour(X, Y, Z, cmap=cm.coolwarm)
ax.clabel(cset, fontsize=9, inline=1)

maxsize = 0
# Iterate over all the contour segments and find the largest
for i, segs in enumerate(cset.allsegs):
    for j, seg in enumerate(segs):
        # First make sure it's closed
        if (seg[0]-seg[-1]).any():
            continue
        # Now get it's size
        size = distance_matrix(seg, seg).max()
        if size > maxsize:
            maxsize = size
            maxseg = (i, j)

# Now highlight the "biggest" closed contour
cset.collections[maxseg[0]].set_color('y')
cset.collections[maxseg[0]].set_lw(5)
pts2d = cset.allsegs[maxseg[0]][maxseg[1]]
z = cset.levels[maxseg[0]]
coords = np.c_[ pts2d, z*np.ones(pts2d.shape[0]) ]
print(coords)

plt.show()

这会导致:

【讨论】:

  • 感谢@jmetz。是否有机会获得此轮廓中的数据点。 .我的意思是 x,y,z 坐标?
  • np - 数据点包含在 seg 变量中(它们是 2d),z 值在 cset.levels 的相应元素中。
  • 我更新了代码,将它们作为x,y,z 存储在变量coords 中。
  • @user6457831 - 如果您对它感到满意,请不要忘记接受答案;)
  • @user6457831 - 您可以添加多边形面积计算,例如def PolyArea(x,y): return 0.5*np.abs(np.dot(x,np.roll(y,1))-np.dot(y,np.roll(x,1))) 来自stackoverflow.com/a/30408825/537098
猜你喜欢
  • 1970-01-01
  • 2018-10-12
  • 1970-01-01
  • 2022-12-10
  • 1970-01-01
  • 1970-01-01
  • 2022-10-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多