使用 griddata 绘制数据集而不取消异常值

Plotting dataset using griddata without cancelling outliers

我有一个包含大量点的 x、y、z 数据集。 x 和 y 是位置,而 z 是在这些坐标处的实际可观察​​值。

大多数坐标的 z 值为零,而只有少数坐标在 2D 地图中定义线(z 平滑变化)。

如果我用

绘制它
scatter(x,y,c=z))

我只得到非常微弱的线条,因为 z=0 定义颜色的散点与 z 的非零值重叠。如果我减小点的大小以减少重叠,我就再也看不到它们了。

这里是我使用散点图可以获得的最佳示例(蓝色为零 z,其他颜色为非零 z)。

所以,我想到了使用

data = np.genfromtxt('data')

x=data[:,0]
y=data[:,1]*3.0
z=data[:,2]

grid_x, grid_y = np.mgrid[min(x):max(x):100, min(y):max(y):1000]

from scipy.interpolate import griddata
grid_z0 = griddata((x, y),z, (grid_x, grid_y), method='cubic')

im = imshow(grid_z0,origin="lower",extent=[0,0.175,-0.15,0.15]) # zoom in on specific part of data

获得更密集的点网格,并可能由于周围点的三次插值而获得更宽的线。

然而,似乎 griddata 正在删除非零 z,将它们视为大纲,从而隐藏任何可能的特征并且整个网格绘制零 z.

是否有任何python/matplotlib/...我缺少的功能或技巧可以很好地绘制它?

我正在尝试制作类似于您在 [https://journals.aps.org/prb/abstract/10.1103/PhysRevB.93.0854092 的图 2 (2) 中看到的图(您可以在不下载论文的情况下看到该图)可能有某种形式线条周围的辉光。

我用的数据在这个dropbox link.

当然你可以改变散点,例如将没有能量的点的大小设置为 0。

import matplotlib.pyplot as plt
import numpy as np
data = np.genfromtxt('data/some_solidstate_physics_data.txt')

x=data[:,0]; y=data[:,1]*3.0; z=data[:,2]

plt.scatter(x,y,c=z, s=np.log10(z+1), cmap="PuRd", vmin=-500)

plt.show()

既然数据已经网格化了,肯定没必要再用griddata,只会把数据磨平。只需将数据重塑为网格就足够了。

import matplotlib.pyplot as plt
import numpy as np
data = np.genfromtxt('data/some_solidstate_physics_data.txt')

x=data[:,0]; y=data[:,1]*3.0; z=data[:,2]

ux = np.unique(x); uy = np.unique(y)
Z = z.reshape(len(ux),len(uy)).T

dx = np.diff(ux[:2])[0]; dy = np.diff(uy[:2])[0]
ext = [ux.min()-dx/2.,ux.max()+dx/2.,uy.min()-dy/2., uy.max()+dy/2.]

plt.imshow(Z, extent=ext, aspect="auto", cmap="magma")

plt.show()

由于网格非常密集,因此看起来有些像素化。

您当然也可以将数据分成更大的块。例如将3x3像素的数据合并为一个并取最大值,使用scipy.stats.binned_statistic_2d

import matplotlib.pyplot as plt
import numpy as np
from  scipy.stats import binned_statistic_2d
data = np.genfromtxt('data/some_solidstate_physics_data.txt')

x=data[:,0]; y=data[:,1]*3.0; z=data[:,2]

ux = np.unique(x); uy = np.unique(y)
h, ex, ey,_ = binned_statistic_2d(x, y, z, bins=[ux[::3],uy[::3]], statistic='max')

dx = np.diff(ex[:2])[0]; dy = np.diff(ey[:2])[0]
ext = [ux.min()-dx/2.,ux.max()+dx/2.,uy.min()-dy/2., uy.max()+dy/2.]

plt.imshow(h.T, extent=ext, aspect="auto", cmap="magma")

plt.show()


掌握了这些技术后,您可能会决定以牺牲定量准确性为代价来美化您的结果。 例如。在绘图中应用高斯滤波器,scipy.ndimage.filters.gaussian_filterinterpolation="gaussian"

import matplotlib.pyplot as plt
import numpy as np
import scipy.ndimage.filters
data = np.genfromtxt('data/some_solidstate_physics_data.txt')

x=data[:,0]; y=data[:,1]*3.0; z=data[:,2]

ux = np.unique(x); uy = np.unique(y)
Z = z.reshape(len(ux),len(uy)).T
Z = scipy.ndimage.filters.gaussian_filter(Z, 3)

dx = np.diff(ux[:2])[0]; dy = np.diff(uy[:2])[0]
ext = [ux.min()-dx/2.,ux.max()+dx/2.,uy.min()-dy/2., uy.max()+dy/2.]

plt.imshow(Z, extent=ext, aspect="auto", cmap="magma", interpolation="gaussian")

plt.show()