Python:获取与轮廓线对应的数组值

时间:2017-01-13 09:41:49

标签: python arrays matplotlib contour

有没有办法从数组中提取数据,这对应于python中的contourplot的一行?即我有以下代码:

os.fchdir(real_root)
os.chroot('.')
os.close(real_root)

其中values是带数据的2d数组(我将数据存储在文件中,但似乎无法在此处上传)。下图显示了相应的等值线图。我的问题是,如果有可能从数据中获得准确的数据,在图中的左轮廓线?

enter image description here

3 个答案:

答案 0 :(得分:3)

plt.contour返回QuadContourSet。由此,我们可以使用以下方式访问各个行:

cs.collections[0].get_paths()

返回所有单个路径。要访问实际的x, y位置,我们需要查看每个路径的vertices属性。绘制的第一个轮廓应该可以使用:

X, Y = cs.collections[0].get_paths()[0].vertices.T

请参阅下面的示例,了解如何访问任何给定的行。在示例中,我只访问第一个:

import matplotlib.pyplot as plt
import numpy as np

n = 100
x, y = np.mgrid[0:1:n*1j, 0:1:n*1j]

values = x**0.5 * y**0.5

fig1, ax1 = plt.subplots(1)
cs = plt.contour(x, y, values)

lines = []
for line in cs.collections[0].get_paths():
    lines.append(line.vertices)

fig1.savefig('contours1.png')

fig2, ax2 = plt.subplots(1)

ax2.plot(lines[0][:, 0], lines[0][:, 1])

fig2.savefig('contours2.png')

contours1.png: enter image description here

contours2.png: enter image description here

答案 1 :(得分:0)

plt.contour返回一个QuadContourSet,它保存您所追踪的数据。

请参阅documentation(此问题可能与......重复)

答案 2 :(得分:0)

在这里值得一提的是,由于这篇文章是我遇到相同问题时的热门文章,因此使用scikit-image可以比使用matplotlib更加简单。我鼓励您检查skimage.measure.find_contours。他们的示例的片段:

from skimage import measure
x, y = np.ogrid[-np.pi:np.pi:100j, -np.pi:np.pi:100j]
r = np.sin(np.exp((np.sin(x)**3 + np.cos(y)**2)))
contours = measure.find_contours(r, 0.8)

然后可以根据需要绘制/操作。我更喜欢这种方式,因为您不必进入matplotlib的深草丛中。