我在找(但不是画画!)某些数据的等高线:
from pprint import pprint
import matplotlib.pyplot
z = [[0.350087, 0.0590954, 0.002165], [0.144522, 0.885409, 0.378515],
[0.027956, 0.777996, 0.602663], [0.138367, 0.182499, 0.460879],
[0.357434, 0.297271, 0.587715]]
cn = matplotlib.pyplot.contour(z)
我知道’cn’包含了我想要的轮廓线,但我似乎无法到达
他们。我试过几种方法:
print dir(cn)
pprint(cn.collections[0])
print dir(cn.collections[0])
pprint(cn.collections[0].figure)
print dir(cn.collections[0].figure)
无济于事。我知道“cn”是一个“轮廓集”,而且中国大陆收藏
是一个数组
我认为“LineCollection”是一个line数组
片段,但我不知道如何提取这些片段。
我的最终目标是创建一个在世界地图上绘制数据的KML文件,并且
这些数据的等高线。
然而,由于我的一些数据点离得很近,而另一些则很远
现在,我需要组成轮廓的实际多边形(线串),而不是
只是轮廓的光栅图像。
我有点惊讶“qhull”不会这样做。
使用Mathematica的“listcurtourplot”,然后将其导出为SVG可以工作,但是我
想用开源的东西。
我不能使用众所周知的CONREC算法,因为我的数据不在网格上
(对于给定的x值,并不总是有多个y值,反之亦然)。
解决方案不必使用python,但必须是开源的,并且
可在Linux上运行。
通过在集合和路径上循环并使用
的“iter_segments()”方法
matplotlib.path.Path
.
下面是一个函数,它将顶点作为
等高线、等高线截面和x、y顶点阵列:
import numpy as np
def get_contour_verts(cn):
contours = []
# for each contour line
for cc in cn.collections:
paths = []
# for each separate section of the contour line
for pp in cc.get_paths():
xy = []
# for each segment of that section
for vv in pp.iter_segments():
xy.append(vv[0])
paths.append(np.vstack(xy))
contours.append(paths)
return contours
也可以在不绘制任何东西的情况下使用
未记录的matplotlib.\u cntr
C模块:
from matplotlib import pyplot as plt
from matplotlib import _cntr as cntr
z = np.array([[0.350087, 0.0590954, 0.002165],
[0.144522, 0.885409, 0.378515],
[0.027956, 0.777996, 0.602663],
[0.138367, 0.182499, 0.460879],
[0.357434, 0.297271, 0.587715]])
x, y = np.mgrid[:z.shape[0], :z.shape[1]]
c = cntr.Cntr(x, y, z)
# trace a contour at z == 0.5
res = c.trace(0.5)
# result is a list of arrays of vertices and path codes
# (see docs for matplotlib.path.Path)
nseg = len(res) // 2
segments, codes = res[:nseg], res[nseg:]
fig, ax = plt.subplots(1, 1)
img = ax.imshow(z.T, origin='lower')
plt.colorbar(img)
ax.hold(True)
p = plt.Polygon(segments[0], fill=False, color='w')
ax.add_artist(p)
plt.show()
然而,大约PolyDP的结果包含如此多的顶点,所以我不能确定它是哪个形状。为了消除顶点,我想检测每个轮廓中的线并找到它们的交点。我怎么能为一个轮廓做到这一点?
等高线图(也称“水平图”)是一种在二维平面上显示 3D 图像的方法。等高线有时也被称为 “Z 切片”,如果您想要查看因变量 Z 与自变量 X、Y 之间的函数图像变化(即 Z=f(X,Y)),那么采用等高线图最为直观。 自变量 X 和 Y 需要被限制在矩形网格内,您可以将 x 、y 数组作为参数传递给 numpy.meshgrid() 函数来构建一个网格点矩阵。 关于 meshgrid() 函数用法
在“操作”菜单栏中点击等高线生成,弹出对话框如下。 加载要生成等高线的地形高程数据,设置导出的文件位置(最后生成为.shp文件),根据已有的地形高程数据进行设置合适的等高线间距(间距大于地形高程则无法生成),点击生成等高线。 点击查看等高线点击查看等高线如图,可以导入可加载shp格式的软件中查看。如果需要预览一片区域的等高线效果,请使用“等高线预览”功能查
在“操作”菜单栏中点击等高线预览,有绘制矩形和选择面生成两种选项,选择范围可以直接选择之前加载或绘制的一块面区域,这里讲绘制矩形生成等高线预览。 左键单击拖拽绘制矩形,再点击左键完成绘制。弹出对话框如下,框里显示的取点密度、等高线间距是系统默认计算的,可以修改。 点击预览,可以在地面上预览看到等高线了。等高线预览是根据内存中加载的地形数据进行采样动态生成的
在“操作”菜单栏中点击等高线预览,有绘制矩形和选择面生成两种选项,选择范围可以直接选择之前加载或绘制的一块面区域,这里讲绘制矩形生成等高线预览。 左键单击拖拽绘制矩形,再点击左键完成绘制。弹出对话框如下,框里显示的取点密度、等高线间距是系统默认计算的,可以修改。 点击预览,可以在地面上预览看到等高线了。等高线预览是根据内存中加载的地形数据进行采样动态生成的
在“工具”菜单栏中点击等高线生成,弹出对话框如下。 加载要生成等高线的地形高程数据,设置导出的文件位置(最后生成为.shp文件),根据已有的地形高程数据进行设置合适的等高线间距(间距大于地形高程则无法生成),点击生成等高线。 点击查看等高线点击查看等高线如图,可以导入可加载shp格式的软件中查看。如果需要预览一片区域的等高线效果,请使用“等高线预览”功能查