【问题标题】:Mask lots of missing Data in tricontourf在 tricontourf 中掩盖大量缺失的数据
【发布时间】:2021-10-03 01:22:52
【问题描述】:

我有一个相对较大的数据集,其中包含一整年的数据。我这样做是通过连接每个 doy 的所有数据框来得出这个庞大的数据集,但是在某些日子里没有可用的数据,因此数据中有很大的差距。我只想绘制真实数据并掩盖或白掉丢失的数据。我尝试将数据重新采样为每小时一次,但是当我这样做时,我得到一个 “qhull Delaunay 三角测量计算中的错误:输入不一致(exitcode=1)” 所以起初我试图放弃 NAN,问题是 tricontourf 最终填充了丢失的数据,而不是忽略它或掩盖它。所以我想出了下面的解决方案,但它只是掩盖了部分点并用伪影填充另一半。

import matplotlib.pyplot as mp
import numpy as np
import matplotlib.tri as tri
fig,ax=plt.subplots()
dy=devstns[0]
dy=dy.resample("H",base=1).mean()
dy["date"]=dy.index
dy["doy"] = dy["date"].apply(lambda x: x.timetuple().tm_yday)
dy =dy.fillna(0)
x=dy.doy.values
y=dy.UT.values[![enter image description here][1]][1]
z=dy.TEC.values
bad = np.ma.masked_invalid(z)
isbad=np.equal(z,0)
triang = tri.Triangulation(x, y)
mask = np.any(np.where(isbad[triang.triangles], True, False), axis=1)
triang.set_mask(mask)
colplt = ax.tricontourf(triang, z)

这是一个数据样本

|pctDev |多伊| deltaTEC | QTEC |年份 |技术 |犹他州 日期
2018-08-01 00:00:00 NaN NaN NaN NaN NaN NaN NaN 2018-08-01 01:00:00 NaN NaN NaN NaN NaN NaN NaN 2018-08-01 02:00:00 NaN NaN NaN NaN NaN NaN NaN 2018-08-01 03:00:00 NaN NaN NaN NaN NaN NaN NaN 2018-08-01 04:00:00 NaN NaN NaN NaN NaN NaN NaN 2018-08-01 05:00:00 NaN NaN NaN NaN NaN NaN NaN 2018-08-01 06:00:00 NaN NaN NaN NaN NaN NaN NaN 2018-08-01 07:00:00 NaN NaN NaN NaN NaN NaN NaN 2018-08-01 08:00:00 NaN NaN NaN NaN NaN NaN NaN 2018-08-01 09:00:00 NaN NaN NaN NaN NaN NaN NaN 2018-08-01 10:00:00 NaN NaN NaN NaN NaN NaN NaN 2018-08-01 11:00:00 NaN NaN NaN NaN NaN NaN NaN

2018-08-01 21:00:00 NaN NaN NaN NaN NaN NaN NaN 2018-08-01 22:00:00 NaN NaN NaN NaN NaN NaN NaN 2018-08-01 23:00:00 NaN NaN NaN NaN NaN NaN NaN 2018-08-02 00:00:00 NaN NaN NaN NaN NaN NaN NaN 2018-08-02 01:00:00 NaN NaN NaN NaN NaN NaN NaN 2018-08-02 02:00:00 NaN NaN NaN NaN NaN NaN NaN 2018-08-02 03:00:00 NaN NaN NaN NaN NaN NaN NaN 2018-08-02 04:00:00 NaN NaN NaN NaN NaN NaN NaN 2018-08-02 05:00:00 NaN NaN NaN NaN NaN NaN NaN 2018-08-02 06:00:00 NaN NaN NaN NaN NaN NaN NaN 2018-08-02 07:00:00 NaN NaN NaN NaN NaN NaN NaN 2018-08-02 08:00:00 NaN NaN NaN NaN NaN NaN NaN

2018-08-05 14:00:00 NaN NaN NaN NaN NaN NaN NaN 2018-08-05 15:00:00 NaN NaN NaN NaN NaN NaN NaN 2018-08-05 16:00:00 NaN NaN NaN NaN NaN NaN NaN

2018-08-15 00:00:00 -33.568720 227.0 -2.578583 7.558583 2018.0 4.980000 0.491667 2018-08-15 01:00:00 -21.027371 227.0 -1.216333 5.755833 2018.0 4.539500 1.491667 2018-08-15 02:00:00 -11.645713 227.0 -0.593917 5.052917 2018.0 4.459000 2.491667 2018-08-15 03:00:00 -11.743647 227.0 -0.461083 3.936250 2018.0 3.475167 3.491667 2018-08-15 04:00:00 -5.666851 227.0 -0.184583 3.155417 2018.0 2.970833 4.491667 2018-08-15 05:00:00 -5.690906 227.0 -0.154583 2.702417 2018.0 2.547833 5.491667 2018-08-15 06:00:00 -16.918020 227.0 -0.469583 2.766583 2018.0 2.297000 6.491667 2018-08-15 07:00:00 -2.511416 227.0 -0.061917 2.550750 2018.0 2.488833 7.491667

【问题讨论】:

  • 如果您的数据是按小时计算的,我将形成一个 (m, n) 大小的矩阵,其中 m 是小时数 (24),n 是天数。他们可以使用contourf 和/或pcolormesh。它们是否会完全按照您想要的方式掩盖事物取决于您的差距,但这比尝试对差距进行三角测量要容易得多。

标签: matplotlib masking


【解决方案1】:

tricontourf 显然不接受 x 和 y 数组的 NAN,所以我填写了缺失的 x 值,就像我在 Julian 日所做的那样,这可能是它只屏蔽了一半的原因。就我而言,我使用时间元组来填写缺少的朱利安日期和时间。我认为这允许三角测量找到 Nan 中 z 的索引(设置为零)以进行屏蔽。

import matplotlib.pyplot as mp
import numpy as np
import matplotlib.tri as tri
fig,ax=plt.subplots()
dy=devstns[0]
dy=dy.resample("H",base=1).mean()
dy["date"]=dy.index
dy["doy"] = dy["date"].apply(lambda x: x.timetuple().tm_yday)
dy["HH"] = dy["date"].apply(lambda x: x.timetuple().tm_hour)

dy =dy.fillna(0)
x=dy.doy.values
y=dy.UT.values
z=dy.TEC.values

isbad=np.equal(z,0)
triang = tri.Triangulation(x, y)
mask = np.any(np.where(isbad[triang.triangles], True, False), axis=1)
triang.set_mask(mask)
colplt = ax.tricontourf(triang, z)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-10
    • 2021-02-13
    • 1970-01-01
    • 1970-01-01
    • 2016-05-11
    • 1970-01-01
    • 1970-01-01
    • 2020-11-05
    相关资源
    最近更新 更多