我有一个 x, y, z 数据集,其中包含相当多的点。x 和 y 是位置,而 z 是这些坐标处的实际可观察值。
大多数坐标的 z 值为零,而只有少数坐标在 2D 地图中定义线(z 平滑变化)。
如果我用
scatter(x,y,c=z))
我只得到非常模糊的线条,因为颜色定义为 的散点与z=0
z 的非零值重叠。如果我减小点的大小以减少重叠,我就看不到它们了。
这是我可以使用 scatter 获得的最佳示例(蓝色为零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.085409 2 的图 2 (2) 中看到的图(您可以看到图而不下载论文)在线条周围可能有某种发光。
我使用的数据在这个保管箱链接中。
当然,您可以更改散射,例如将没有能量的点的大小设置为 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()
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句