为轮廓图生成更平滑的颜色图

0 投票
1 回答
47 浏览
提问于 2025-04-14 16:46

我的数据集大约有几千个值,分成四列,分别是 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值,这是否是你从测量/模拟中预期的结果?

撰写回答