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

时间:2018-03-09 20:17:21

标签: python matplotlib scatter

我有一个x,y,z数据集,其中包含相当多的点。 x和y是位置,而z是那些坐标处的实际可观察​​值。

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

如果我用

绘图
scatter(x,y,c=z))

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

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

enter image description here

所以,我想到了使用

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.085409 2的图2(2)中看到的那些情节(你可以看到图中没有下载论文)可能是某种线条周围发光。

我使用的数据是dropbox link

1 个答案:

答案 0 :(得分:1)

当然你可以改变分散,例如将没有能量的点的大小设置为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()

enter image description here

由于数据已经网格化,因此肯定不需要使用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()

enter image description here

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

您当然也可以将数据分成更大的块。例如,使用scipy.stats.binned_statistic_2d

将3x3像素的数据合并为一个并取最大值
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()

enter image description here

掌握这些技术后,您可能会以牺牲定量准确性为代价来美化您的结果。 例如。在绘图中应用高斯滤波器scipy.ndimage.filters.gaussian_filter以及interpolation="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()

enter image description here