如何计算Python中2个等高线之间的点数

时间:2017-10-30 22:50:29

标签: python matplotlib contour

我正在使用Result来插入数据并创建轮廓。 在this回答/示例(关于如何计算轮廓中的区域)之后,我能够获得轮廓线的顶点。 有没有办法使用这些信息,即一条线的顶点,来计算两个给定轮廓之间有多少点?这些点与用于推导轮廓的数据不同。

2 个答案:

答案 0 :(得分:1)

我不确定我是否理解你要检查哪些点,但是,如果你有线顶点(两点)并且想要检查第三点是否介于两者之间,你可以采取简单的(接近并计算由三者组成的三角形的面积。如果该区域为0,则该点落在同一条线上。此外,您可以计算点之间的距离,并查看该点是在线之间还是在线之间(在扩展线上)。

希望这有帮助!

答案 1 :(得分:1)

通常,您不希望对绘图进行反向工程以获取某些数据。相反,您可以插入稍后用于绘制轮廓的数组,并找出哪些点位于某些值的区域中。

以下内容会找到-0.8-0.4级别之间的所有点,打印出来并在图表上以红色显示。

import numpy as np; np.random.seed(1)
import matplotlib.mlab as mlab
import matplotlib.pyplot as plt
from scipy.interpolate import Rbf

X, Y = np.meshgrid(np.arange(-3.0, 3.0, 0.1), np.arange(-2.4, 1.0, 0.1))
Z1 = mlab.bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0)
Z2 = mlab.bivariate_normal(X, Y, 1.5, 0.5, 1, 1)
Z = 10.0 * (Z2 - Z1)

points = np.random.randn(15,2)/1.2
levels = [-1.2, -0.8,-0.4,-0.2]

# interpolate points
f = Rbf(X.flatten(), Y.flatten(), Z.flatten()) 
zi = f(points[:,0], points[:,1])
# add interpolated points to array with columns x,y,z
points3d = np.zeros((points.shape[0],3))
points3d[:,:2] = points
points3d[:,2] = zi
# masking condition for points between levels
filt = (zi>levels[1]) & (zi <levels[2])
# print points between the second and third level
print(points3d[filt,:])

### plotting
fig, ax = plt.subplots()

CS = ax.contour(X, Y, Z, levels=levels)
ax.clabel(CS, inline=1, fontsize=10)
#plot points between the second and third level in red:
ax.scatter(points[:,0], points[:,1], c=filt.astype(float), cmap="bwr" )

plt.show()

enter image description here