Meshgrid,没有足够的值来解包(预期 2,得到 1)

Meshgrid, not enough values to unpack (expected 2,got 1)

对于专家来说这可能是一个非常基本的问题,但我只是一个初学者。 我有来自不同距离的多个时间序列信号。我在下面脚本中给出的 plt.plot 命令的帮助下绘制了所有时间序列数据。

bp_range=[0.5,20]
dir='/data'   
# set plots 
fig = plt.figure(figsize=(12,14))
grid = plt.GridSpec(2, 6)  
ax1 = plt.subplot2grid((2,6), (0,0),colspan=3,rowspan=2) 
ax2 = plt.subplot2grid((2,6), (0,3),rowspan=2,colspan=3,sharey=ax1)

#......get relevant information.........

for event_file in dep_files:
    ref_file=" ".join(str(x) for x in event_file)
    st = obspy.read(ref_file)
    P=st[0].stats.sac.a
    S=st[0].stats.sac.t0
    evdp=st[0].stats.sac.evdp
    t = st[0].stats.starttime
    npts = st[0].stats.npts                   
    dt = st[0].stats.delta                    
    fNy = 1. / (2. * dt)                     
    time = np.arange(0, npts) * dt            
    freq = np.linspace(0, fNy, npts // 2 + 1) 
    corners = 4                       
    st_fft = np.fft.rfft(st[0].data)

## normalize the data...........

    if wf_normalize:
        st[0]=st[0].slice(t+S-1,t+S+3)
        data = st[0].data.copy()
    if max(data) != min(data):
        st[0].data=data/(max(data) - min(data)) # Normalize data
        sampling_rate = st[0].stats.sampling_rate
        if max(data) != min(data):
            st_fft=abs(st_fft)/(max(st_fft) - min(st_fft)) # Normalize data

#plot the data
        ax1.plot(np.arange(0,len(st[0].data))*1/sampling_rate,
                 st[0].data+evdp,
                 color='k',
                linewidth=0.7)
        ax2.plot(freq,abs(st_fft)*0.1+evdp,
                            color='k',
                        linewidth=0.7)
plt.tight_layout()

我得到了这个情节Similar like this。 现在我想在 pcolormesh 中绘制一个时间序列信号相对于其标准化振幅的图 4,如本文 Paper 中绘制的那样。但我总是遇到一些错误,例如 没有足够的值来解压(预期 2,得到 1)

这是我的尝试,即使它不如 Python 的初学者。或者还有其他建议的方法吗?

ylim = [0, 10]
xarray, yarray, zarray = np.array([]), np.array([]), np.array([])
if xarray.size == 0:
    mask = np.where((evdp>=ylim[0]) & (evdp<=ylim[-1]))[0]
    zarray = data.copy()[mask]
    yarray = np.append(yarray,evdp)
    xarray = np.append(np.arange(0,len(st[0].data))*1/sampling_rate)
im = ax.pcolormesh(xarray, yarray, zarray.T, cmap='plasma', shading='gouraud')

初学者不要着急,问问题就好。它将帮助其他与您有类似情况的人。

关于你的问题,提供一个最小的工作示例真的很有帮助,这样我们就可以进行自我调查。您 运行ning (matplotlib.__version__) 是哪个版本的 matplotlib? xarrayyarrayzarray有哪些形状?

我可以使用来自 matplotlib 文档库(此处 https://matplotlib.org/stable/gallery/images_contours_and_fields/pcolormesh_levels.html)的修改示例重现您的错误。如果我运行

import numpy as np
import matplotlib.pyplot as plt
np.random.seed(19680801)
Z = np.random.rand(6, 10)
x = np.arange(-0.5, 10, 1)  # len = 11
y = np.arange(4.5, 11, 1)  # len = 7

fig, ax = plt.subplots()
ax.pcolormesh(x, y, Z.flatten() )

我明白了 ValueError: not enough values to unpack (expected 2, got 1) 为了让它工作,我需要将最后一行更改为 ax.pcolormesh(x, y, Z)

所以问题很可能是你的zarray形状不对。我相信它需要是一个 (Ny, Nx) 大小的矩阵,其中 Ny 是 yarray 的长度,Nx 是 xarray 的长度。也许 运行 示例,并检查 x、y、Z 数组的形状和大小并与您的进行比较。

(如果你没有弄乱 rcParams,你的 pcolormesh 的着色参数应该设置为 'auto' 并且如果你给四边形,你的情况下的正方形,边缘或 x 的中心坐标应该无关紧要和 y)