使用 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_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()
我有一个包含大量点的 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_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()