【问题标题】:2D Density Plot with X Y Z data带有 X Y Z 数据的 2D 密度图
【发布时间】:2019-10-01 23:13:52
【问题描述】:

我正在尝试用 x、y 和 z(高程)绘制 2d 地形图。我按照以下链接中的步骤进行操作,但情节很奇怪。

Python : 2d contour plot from 3 lists : x, y and 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()

下图中的第一个是我得到的,最后一个是它的样子。

任何帮助将不胜感激

Link to data file

【问题讨论】:

  • 如果您有 x、y、z 列,您可以使用 plt.tricontourf?
  • 您的数据文件只有 2 列,xy 位置。但是你需要一些值来插值......听起来你期待海拔?某处是否有更多数据? (相关:我不明白汉明窗的用途。)
  • @kwinkunks 我将从另一个来源获得海拔高度,现在我只是使用汉明窗模拟海拔值。无论在这两种情况下,我的高程输入都是与其他两个相同长度的一维向量。
  • @DerekEden plt.tricontourf 给出了我没有针对的奇怪的三角图。我是第二张图片中生成的扩散图。如果我做 x,y 的普通散点图,我会得到第二个图的形状,但没有密度着色。
  • 我认为问题在于,由于点的顺序,您并没有真正模拟任何有意义的事情。所以结果一点也不平滑,插值也不起作用(它最终得到一个奇异矩阵)。您可以通过使用插值器中的smooth 参数来放宽插值通过所有数据点的条件。我将发布一个示例。

标签: python matplotlib plot contourf


【解决方案1】:

我认为问题在于您提供的数据不够平滑,无法使用默认参数进行插值。这是一种方法,使用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)

我明白了:

我最近就这个话题写了a Jupyter Notebook,看看其他一些插值方法,比如克里金法和样条拟合。

【讨论】:

  • 我会检查笔记本。我试图重现你的结果。我得到相同的图像,但尺寸很小且像素化。我可以调整哪些参数以获得上述正确的分辨率。其次,再现图中的轴是绝对的,包括原点,而不是原始数据中的相对轴。
  • 您可以通过以plt.figure(figsize=(10, 15)) 开始绘图来增加绘图的大小(例如)。像素化是网格步长的函数,我给出的值为 0.002——但你可以使用任何你喜欢的东西。使其更小以容纳更多网格单元。您还可以使用imshow 中的interpolation 参数来平滑显示(但不是数据)。
  • 这是有道理的。我还在寻找如何通过查询不在数据数组 (x,y,z) 中的特定 (x,y) 值来获得输出 Z。我相信您的插值方法在这方面可能会有所帮助,并且我的贝叶斯优化将根据采集函数查询特定值。因此,如果特定值不在数据中,要运行实验,我必须进行一些插值以将这些值输入到使用 GP 的 BO 中。
  • rbfi() 插值函数可以查找 (x, y) 位置。其他方法具有类似的功能,例如predict()sklearn 模型上。祝你好运!
猜你喜欢
  • 2022-06-19
  • 2017-02-05
  • 1970-01-01
  • 2013-02-26
  • 1970-01-01
  • 2018-01-10
  • 2019-11-24
  • 2021-10-15
  • 1970-01-01
相关资源
最近更新 更多