python KDE将轮廓和路径转换为特定的json格式传单友好

Posted

技术标签:

【中文标题】python KDE将轮廓和路径转换为特定的json格式传单友好【英文标题】:python KDE get contours and paths into specific json format leaflet-friendly 【发布时间】:2017-10-24 10:51:20 【问题描述】:

我正在 Python 中进行核密度估计并获得如下所示的轮廓和路径。 (这是我的示例数据:https://pastebin.com/193PUhQf)。

from numpy import *
from math import *
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

x_2d = []
y_2d = []
data = 
data['nodes'] = []

# here is the sample data:
# https://pastebin.com/193PUhQf
X =  [.....]

for Picker in xrange(0, len(X)):
    x_2d.append(X[Picker][0])
    y_2d.append(X[Picker][1])

# convert to arrays
m1 = np.array([x_2d])
m2 = np.array([y_2d])

x_min = m1.min() - 30
x_max = m1.max() + 30
y_min = m2.min() - 30
y_max = m2.max() + 30

x, y = np.mgrid[x_min:x_max:200j, y_min:y_max:200j]
positions = np.vstack([x.ravel(), y.ravel()])
values = np.vstack([m1, m2])

kde = stats.gaussian_kde(values)

z = np.reshape(kde(positions).T, x.shape)

fig = plt.figure(2, dpi=200)
ax = fig.add_subplot(111)

pc = ax.pcolor(x, y, z)
cb = plt.colorbar(pc)
cb.ax.set_ylabel('Probability density')

c_s = plt.contour(x, y, z, 20, linewidths=1, colors='k')
ax.plot(m1, m2, 'o', mfc='w', mec='k')
ax.set_title("My Title", fontsize='medium')
plt.savefig("kde.png", dpi=200)
plt.show()

有一种类似的方法可以使用 R 获取轮廓,如下所述: http://bl.ocks.org/diegovalle/5166482

问题:如何使用我的 python 脚本或作为起点来实现相同的输出? 所需的输出应该类似于contours_tj.json,leaflet.js lib 可以使用它。

更新:

我的输入数据结构由三列组成,逗号分隔:

    第一个是 X 值 第二个是Y值 第三个是我的数据的ID,没有数值,只是数据点的标识符。

更新 2:

问题,如果简单地说,是我想要与上面链接中相同的输出,使用我的输入文件,它是 numpy 数组格式。

更新 3:

我的输入数据结构是列表类型的:

print type(X)

<type 'list'>

这里是前几行:

print X[0:5]

[[10.800584, 11.446064, 4478597], [10.576840,11.020229, 4644503], [11.434276,10.790881, 5570870], [11.156718,11.034633, 6500333], [11.054956,11.100243, 6513301]]

【问题讨论】:

您的样本数据X[Picker][0]不匹配,假设每一行都必须是一个元组(x,y,z)?无法阅读您的 contours_tj.json,请移至 pastebin @stovfl 我添加了有关输入文件结构的更新。请见上文。 您的描述确认,我可以使用tuple(x,y,z)。仍然无法读取您的 contours_tj.json,请移至 pastebin。 @stovfl 我不太清楚你的意思。如果看不懂contours_tj.json文件,这里是链接pastebin.com/1LKAzXMk这不是我的文件,是网站上的示例文件,是R代码创建的。 知道了,contures 似乎是直截了当的。您还需要"type": "Topology" 记录吗? 【参考方案1】:

geojsoncontour是一个python库,用于将matplotlib轮廓转换为geojson

geojsoncontour.contour_to_geojson 需要 contour_levels 参数。 pyplot.contour 中的级别是自动选择的,但您可以使用 c_s._levels 访问它们

因此,对于您的示例,您可以这样做:

import geojsoncontour
# your code here

c_s = plt.contour(x, y, z, 20, linewidths=1, colors='k')

# Convert matplotlib contour to geojson
geojsoncontour.contour_to_geojson(
    contour=c_s,
    geojson_filepath='out.geojson',
    contour_levels=c_s._levels,
    ndigits=3,
    unit='m'
)

【讨论】:

我得到这个错误:unit='m' File "/usr/local/lib/python2.7/dist-packages/geojsoncontour/contour.py", line 32, in contour_to_geojson assert len( contour_levels) == len(collections) TypeError: 'int' 类型的对象没有 len() ] 什么是 unit='m' 以及如何定义级别?您能否使用我拥有的数据集给出完整的答案?谢谢 当然。但是 pastebin 中的数据结构是什么。它应该是一个元组列表吗? 请用我的数据中的真实示例查看更新后的答案【参考方案2】:

现在关注这个

有一种类似的方法可以使用 R 获取轮廓,如下所述:http://bl.ocks.org/diegovalle/5166482

如果这对你可行,我请你考虑在 Python 中使用 rpy2 包

http://rpy.sourceforge.net/rpy2/doc-2.4/html/introduction.html

【讨论】:

以上是关于python KDE将轮廓和路径转换为特定的json格式传单友好的主要内容,如果未能解决你的问题,请参考以下文章

R - 如何在特定轮廓内找到点

如何将轮廓层次结构从 python openCV 转换为 emgu cv 以查找封闭轮廓

将矢量轮廓区域(边界)转换为光栅图(像素网格)

为确定的地标点绘制轮廓( OpenCvForUnity )

将轮廓(MatplotLib 或 OpenCV)转换为与原始大小相同的图像

将等高线转换为点集