为等高线图生成更平滑的色彩图

问题描述 投票:0回答:1

我的数据集在四列中包含大约数千个值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()

我得到以下情节-

如何生成类似于上图的颜色条?我已经为我正在使用的数据集创建了一个要点here

更新

使用

scat=plt.scatter(x, y, c=z, s=3);plt.colorbar(scat)
给我带来奇怪的线条 -

使用

plt.tricontourf(x, y, z, levels=50)
看起来更好,但斑点不够亮。

有没有办法让斑点像参考图像一样更亮?

python matplotlib contour colormap contourf
1个回答
0
投票

一些预备知识

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())

绘制所有数据的散点图,“奇怪的线”,(OP评论)只是数据点,它们都放置在规则的网格上,在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 值和 相同 77 x 第 1–77 行的值。

我的结论是数据是通过 (7·11)×(3·281) = 77×843 xy 网格给出的。

对于您的数据,很多误差值等于上一栏中报告的z值,这是您对测量/模拟的期望吗?

© www.soinside.com 2019 - 2024. All rights reserved.