为轮廓图生成更平滑的颜色图
我的数据集大约有几千个值,分成四列,分别是 X, Y, Z, Z的误差 -
1.2351e+00 -6.3115e-02 0.0000e+00 0.0000e+00
1.2417e+00 -6.3115e-02 0.0000e+00 0.0000e+00
1.2483e+00 -6.3115e-02 0.0000e+00 0.0000e+00
1.2549e+00 -6.3115e-02 0.0000e+00 0.0000e+00
1.2615e+00 -6.3115e-02 0.0000e+00 0.0000e+00
1.2681e+00 -6.3115e-02 0.0000e+00 0.0000e+00
1.2746e+00 -6.3115e-02 0.0000e+00 0.0000e+00
1.2812e+00 -6.3115e-02 0.0000e+00 0.0000e+00
1.2878e+00 -6.3115e-02 1.8186e+01 1.8186e+01
1.2944e+00 -6.3115e-02 0.0000e+00 0.0000e+00
1.3010e+00 -6.3115e-02 0.0000e+00 0.0000e+00
1.3075e+00 -6.3115e-02 0.0000e+00 0.0000e+00
1.3141e+00 -6.3115e-02 0.0000e+00 0.0000e+00
1.3207e+00 -6.3115e-02 0.0000e+00 0.0000e+00
... ....
我想用等高线图来展示这些数据,像这样 -
(参考图片)

我使用了以下代码 -
import numpy as np
import matplotlib.pyplot as plt
x, y, z, err = np.genfromtxt(r'dataset_gid.txt', unpack=True)
x1, y1 = np.meshgrid(x, y)
cont1 = plt.tricontourf(x, y, z, cmap='seismic')
plt.colorbar(cont1)
plt.show()
我得到了下面这个图 -
我该如何生成一个类似于上面图片的颜色条呢?我为我使用的数据集创建了一个链接 在这里。
更新
使用 scat=plt.scatter(x, y, c=z, s=3);plt.colorbar(scat)
得到的图有些奇怪 -
使用 plt.tricontourf(x, y, z, levels=50)
看起来更好,但点的亮度不够。
有没有办法让这些点像参考图片那样更亮呢?
1 个回答
1
一些前期准备
import matplotlib.pyplot as plt
import numpy as np
fig = lambda: plt.figure(layout='constrained')
d2 = lambda arr: arr.reshape(77, 843)
a_n_d = np.logical_and
读取数据,找出极值
x, y, z, e = np.array([
[float(x) for x in line.split()]
for line in open('gist.txt').readlines()]).T
xlim = (x.min(), x.max())
ylim = (y.min(), y.max())
绘制所有数据的散点图,那些“奇怪的线条”(原作者评论)其实就是数据点,这些点在一个规则的网格上分布,x方向比较松散,而y方向则比较紧凑。
fig()
scat = plt.scatter(x, y, c=z, s=40, cmap='Blues')
plt.colorbar(scat)
现在,我们来绘制一个等高线图,设置3个层级
fig()
cont = plt.contour(d2(x), d2(y), d2(z), levels=[10, 40, 160], cmap='Blues', lw=0.2)
plt.colorbar(cont)
我觉得等高线图的信息量不如散点图多。
最后,我们来试试一组选择性的散点图,只绘制那些z值在不同范围内的点,每个子图的范围都不一样。
f, axs = plt.subplots(2,2, layout='constrained')
for ax, ix in zip(axs.flat,
(z<100, a_n_d(z>=100, z<250), a_n_d(z>=250, z<500), z>500)):
ax.set_xlim(xlim) ; ax.set_ylim(ylim)
scat = ax.scatter(x[ix], y[ix], s=10, c=z[ix], cmap='Blues')
plt.colorbar(scat, ax=ax)
在我看来,这种排列方式信息量是最丰富的。
不同子图的颜色比例尺是不同的,你可以使用vmin=
和vmax=
来保持相同的比例尺,但我觉得用不同的比例尺更好。
数组形状说明
首先,我查看了64911的因数
$ factor 64911
64911: 3 7 11 281
$
接着我观察了数据,1到77行的y值是相同的,但x值不同;而78到154行有另一个共同的y值,并且与1到77行的77个x值相同。
我的结论是,这些数据是在一个(7·11)×(3·281) = 77×843的x-y网格上给出的。
关于你的数据,很多错误值等于前一列报告的z值,这是否是你从测量/模拟中预期的结果?