在 Python 中绘制密度图的三角测量方法
Triangulation method to plot a density map in Python
我有一个包含一组点的坐标 (x,y) 的文件,我正在使用三角剖分法生成代表表面的三角形网。
三角剖分由一个由 n 个点和 n 个三角形组成的非结构化三角形网格组成。
从 CSV 文件绘制数据:
from matplotlib import pyplot as plt
from pandas import DataFrame
from matplotlib import style
df = DataFrame.from_csv('d:\Users\Raquel\Desktop/test.csv', header=0,
sep=';') # unpact values into x and y using pandas to load my csv file
style.use('ggplot')
我使用这个三角形网格来计算密度(1/表面),然后绘制密度图。
通过三角测量方法绘制密度图
import numpy as np
from matplotlib.pyplot import (tripcolor, triplot, scatter,
show, title, savefig, colorbar)
from matplotlib.tri import Triangulation, TriAnalyzer
# Coordinates
x = df['x'].values
y = df['y'].values
# Triangulation
tri = Triangulation(x, y)
# Coordinates of the edges
ii1, ii2, ii3 = tri.triangles.T
x1 = x[ii1] ; y1 = y[ii1]
x2 = x[ii2] ; y2 = y[ii2]
x3 = x[ii3] ; y3 = y[ii3]
# Surfaces
surf = 0.5*np.abs((x2-x1)*(y3-y1)-(x3-x1)*(y2-y1))
# Density
dens = 1.0/(surf*3) # 3 points per triangle
# Plot
xd = (x1+x2+x3)*1.0/3.
yd = (y1+y2+y3)*1.0/3.
tripcolor(xd, yd, dens, cmap='cool')
colorbar()
title('Density Map')
savefig('density.png')
show()
地图不能很好地表示我的点密度,我不知道如何改进它...代码有问题吗?
注意:
这是我的密度图的图像:
http://postimg.org/image/3y1g90nwd/c8d2af55/
与其使用三角测量,不如使用一些密度估计技术更有意义,例如
高斯核密度估计 scipy
从根本上说(乍一看),您似乎将所有三角形视为对密度的相等贡献,因此距离很远的点对表面密度的贡献相等。如果您选择一个简单的距离阈值来丢弃大三角形的边缘,您可以这样做,这样您就不会连接彼此相距任意远的点。或者,如果您使用适当的密度估计技术,那么您将获得更好、更自然的结果。
我有一个包含一组点的坐标 (x,y) 的文件,我正在使用三角剖分法生成代表表面的三角形网。 三角剖分由一个由 n 个点和 n 个三角形组成的非结构化三角形网格组成。
从 CSV 文件绘制数据:
from matplotlib import pyplot as plt
from pandas import DataFrame
from matplotlib import style
df = DataFrame.from_csv('d:\Users\Raquel\Desktop/test.csv', header=0,
sep=';') # unpact values into x and y using pandas to load my csv file
style.use('ggplot')
我使用这个三角形网格来计算密度(1/表面),然后绘制密度图。
通过三角测量方法绘制密度图
import numpy as np
from matplotlib.pyplot import (tripcolor, triplot, scatter,
show, title, savefig, colorbar)
from matplotlib.tri import Triangulation, TriAnalyzer
# Coordinates
x = df['x'].values
y = df['y'].values
# Triangulation
tri = Triangulation(x, y)
# Coordinates of the edges
ii1, ii2, ii3 = tri.triangles.T
x1 = x[ii1] ; y1 = y[ii1]
x2 = x[ii2] ; y2 = y[ii2]
x3 = x[ii3] ; y3 = y[ii3]
# Surfaces
surf = 0.5*np.abs((x2-x1)*(y3-y1)-(x3-x1)*(y2-y1))
# Density
dens = 1.0/(surf*3) # 3 points per triangle
# Plot
xd = (x1+x2+x3)*1.0/3.
yd = (y1+y2+y3)*1.0/3.
tripcolor(xd, yd, dens, cmap='cool')
colorbar()
title('Density Map')
savefig('density.png')
show()
地图不能很好地表示我的点密度,我不知道如何改进它...代码有问题吗?
注意: 这是我的密度图的图像: http://postimg.org/image/3y1g90nwd/c8d2af55/
与其使用三角测量,不如使用一些密度估计技术更有意义,例如
高斯核密度估计 scipy
从根本上说(乍一看),您似乎将所有三角形视为对密度的相等贡献,因此距离很远的点对表面密度的贡献相等。如果您选择一个简单的距离阈值来丢弃大三角形的边缘,您可以这样做,这样您就不会连接彼此相距任意远的点。或者,如果您使用适当的密度估计技术,那么您将获得更好、更自然的结果。