python - 带有 XYZ 数据的二维密度图
问题描述
我正在尝试用 x、y 和 z(高程)绘制 2d 地形图。我按照以下链接中的步骤进行操作,但情节很奇怪。
Python:来自 3 个列表的 2d 等高线图:x、y 和 rho?
我花了将近半天的时间寻找,但一无所获。
import numpy as np
import matplotlib.pyplot as plt
import scipy.interpolate
# import data:
import xlrd
loc = "~/Desktop/Book4.xlsx"
wb = xlrd.open_workbook(loc)
sheet = wb.sheet_by_index(0)
sample=500
# Generate array:
x=np.array(sheet.col_values(0))[0:sample]
y=np.array(sheet.col_values(1))[0:sample]
z=np.hamming(sample)[0:sample][:,None]
# Set up a regular grid of interpolation points
xi, yi = np.meshgrid(x, y)
# Interpolate
rbf = scipy.interpolate.Rbf(x, y, z, function='cubic')
zi = rbf(xi, yi)
# Plot
plt.imshow(zi, vmin=z.min(), vmax=z.max(), origin='lower',
extent=[x.min(), x.max(), y.min(), y.max()])
plt.colorbar()
plt.show()
任何帮助将不胜感激
解决方案
我认为问题在于您提供的数据不够平滑,无法使用默认参数进行插值。这是一种方法,使用mgrid
而不是meshgrid
:
import numpy as np
import pandas as pd
from scipy.interpolate import Rbf
# fname is your data, but as a CSV file.
data = pd.read_csv(fname).values
x, y = data.T
x_min, x_max = np.amin(x), np.amax(x)
y_min, y_max = np.amin(y), np.amax(y)
# Make a grid with spacing 0.002.
grid_x, grid_y = np.mgrid[x_min:x_max:0.002, y_min:y_max:0.002]
# Make up a Z.
z = np.hamming(x.size)
# Make an n-dimensional interpolator.
rbfi = Rbf(x, y, z, smooth=2)
# Predict on the regular grid.
di = rbfi(grid_x, grid_y)
然后你可以看看结果:
import matplotlib.pyplot as plt
plt.imshow(di)
我得到:
我最近写了一个关于这个主题的 Jupyter Notebook,检查一下其他的插值方法,比如克里金法和样条拟合。
推荐阅读
- database - 导入如何排除所有表空间?
- azure - 当 Azure 区域丢失时,Azure 资源组会发生什么情况?
- python - 按行查找矩阵和向量之间的交集
- javascript - Javascript'函数名':f,
- html - django页面中的html限制文本长度
- ios - Xcode 更改各种设备的按钮背景图像
- python - 为什么打印功能没有在正确的时间运行?
- ssh-tunnel - 通过代理的 AWS DocumentDB
- python - 在视频 ffmpeg 批处理脚本中显示文件名
- node.js - 我可以在不改变调用方式的情况下向 module.exports 添加第二个函数导出吗?