Python plt.contour颜色条

Python plt.contour颜色条,python,plot,fft,contour,Python,Plot,Fft,Contour,我正试图用plt.contour绘制地震波图。 我有3个阵列: 时间(x轴) 频率(y轴) 振幅(z轴) 这是我目前的结果: 问题是,我想改变色条的缩放比例:制作渐变,在振幅较低时不使用白色。但是我不能这么做,尽管我花了很多时间浏览这份文件 我读到plt.pcolormesh在这里不合适(它只是在这里工作,因为我是在一个特殊情况下),但这是我想要得到的关于颜色和色条的信息: 这是我写的代码: T = len(time[0])*(time[0][1] - time[0][0

我正试图用plt.contour绘制地震波图。
我有3个阵列:

  • 时间(x轴)
  • 频率(y轴)
  • 振幅(z轴)
这是我目前的结果:

问题是,我想改变色条的缩放比例:制作渐变,在振幅较低时不使用白色。但是我不能这么做,尽管我花了很多时间浏览这份文件

我读到
plt.pcolormesh
在这里不合适(它只是在这里工作,因为我是在一个特殊情况下),但这是我想要得到的关于颜色和色条的信息:

这是我写的代码:

T         = len(time[0])*(time[0][1] - time[0][0])  # multiply ampFFT with T to offset
Z         = abs(ampFFT)*(T)                         # abbreviation

# freq = frequency, ampFFT = Fast Fourier Transform of the amplitude of the wave
# freq, amFFT and time have same dimensions: 40 x 1418 (40 steps of time discretization x steps to have the total time. 2D because it is easier to use) 

maxFreq   = abs(freq).max()                            # maxium frequency for plot boundaries
maxAmpFFT = abs(Z).max()/2                             # maxium ampFFT for plot boundaries of colorbar divided by 2 to scale better with the colors
minAmpFFT = abs(Z).min()

plt.figure(1)
plt.contour(time, freq, Z, vmin=minAmpFFT, vmax=maxAmpFFT)
plt.colorbar()

plt.ylim(0,maxFreq)                                    # 0 to remove the negative frequencies useless here
plt.title("Amplitude intensity regarding to time and frequency")
plt.xlabel('time (in secondes)')
plt.ylabel('frequency (in Hz)')

plt.show()
谢谢你的关注

注意:如果您想知道plt.pcolormesh的情况:当我选择增加时间离散化时,绘图完全混乱(这里我将时间分为40,但当我将时间分为1000时,绘图不正确,我希望能够将时间分为更小的部分)

编辑:当我使用
plt.contourf
而不是
plt.contour
时,我得到了这个图: 这也不是很有说服力。我理解为什么黄色占据了如此多的空间(这是因为我设置了一个较低的vmax),但我不理解为什么我的情节中仍然有白色

编辑2:我的老师绘制了我的数据,我得到了正确的数据。剩下的唯一问题是我的绘图中的白色背景(以及在使用
plt.contourf
时,由于不明显的原因,在左右边框上的深蓝色)。尽管存在这些问题,但最高振幅位于0.5 Hz左右,这与我老师的工作一致。
他使用了gnuplot,但由于我不知道gnuplot,我更喜欢使用python。

我找到的解决方案/解决方法 下面是我如何像
countourf
那样显示数据,但没有显示问题:
解释:对于曲面,我选择了
abs(freq)
而不是
freq
,因为我有负频率。
这是因为在计算FFT的频率时,有一个频率会重复第二次,如下所示:

您有两种获得此频率的方法:
-频率为正,此阵列为2 x奈奎斯特频率(因此,如果将阵列除以2,则拥有所有波,且波不会重复本身)。
-频率开始为负值,然后变为正值,此阵列也是2 x奈奎斯特频率(因此,如果删除负值,则所有波都将保留,且不会重复)

Python
fft.fftfreq
使用第二个选项。
plot\u surface
无法很好地删除数组的数据(对我来说,它仍然显示)。所以我把频率值设为绝对值,问题就消失了

fig = plt.figure(1, figsize=(18,15))    # figsize: increase plot size
ax = fig.gca(projection='3d')
surf = ax.plot_surface(time, abs(freq), Z, rstride=1, cstride=1, cmap=cm.magma, linewidth=0, antialiased=False, vmin=minAmpFFT, vmax=maxAmpFFT)

ax.set_zlim(0, maxAmpFFT)
ax.set_ylim(0, maxFreq)

ax.view_init(azim=90, elev=90)          # change view to top view, with axis in the right direction

plt.title("Amplitude intensity (m/Hz^0.5) regarding to time and frequency")
plt.xlabel('x : time (in secondes)')
plt.ylabel('y : frequency (in Hz)')

# ax.yaxis._set_scale('log')            # should be in log, but does not work 


plt.gca().invert_xaxis()                # invert x axis !! MUST BE AFTER X,Y,Z LIM
plt.gca().invert_yaxis()                # invert y axis !! MUST BE AFTER X,Y,Z LIM

plt.colorbar(surf)
fig.tight_layout()
plt.show()
这是我得到的情节:


您想用这条线实现什么目标?T=len(time[0])*(time[0][1]-time[0][0])另外,temp和freq是什么样子的,它们将是等高线的x和y坐标。谢谢您的回答。该行用于计算偏移量。当我分割我的时间阵列并进行FFT时,信号的振幅减小。此行用于纠正此效果。时间[i]总是相同的大小,因此(time[i][j+1]-time[i][j]),因此我选择了任意索引号。temps是时间,很抱歉输入错误(我更新了我的帖子),我想翻译变量名称。它们都有相同的尺寸。时间范围从1960.15秒到10521.51秒(因为数据中的波不是在开始时出现的)。freq的范围为-3.312到3.307,但它不会像时间一样增加(有时值会增加,有时值会减少,等等)。绘图前我应该对频率数组进行排序吗?本能说不记得它提供了“y”坐标,这样matplotlib将从TEMP和freq中提取成对进行绘图。还有一点你确定这是你想要的等高线图吗?您的示例看起来更像一个条形图。。。