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? xarray
、yarray
和zarray
有哪些形状?
我可以使用来自 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)
对于专家来说这可能是一个非常基本的问题,但我只是一个初学者。 我有来自不同距离的多个时间序列信号。我在下面脚本中给出的 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? xarray
、yarray
和zarray
有哪些形状?
我可以使用来自 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)