Python plt.contour colorbar

时间:2018-05-23 12:23:30

标签: python plot fft contour

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

  • 时间(x轴)
  • 频率(y轴)
  • 振幅(z轴)

这是我迄今为止的结果:
plot of the function using plt.contour

问题在于我想要改变颜色条的缩放比例:制作渐变并且在幅度较低时不具有此白色。但即使我花了很多时间浏览文档,我也无法这样做。

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

plot using 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时,我得到了这个情节: plot with plt.contourf 这也不是很有说服力。我理解为什么黄色会占用太多空间(这是因为我设置了一个低的vmax),但我不明白为什么我的情节中仍然有白色。

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

1 个答案:

答案 0 :(得分:0)

解决方案/解决方法我找到了

以下是我为显示countourf之类的数据所做的工作,但没有显示问题:
说明:对于表面,我采用了abs(freq)而不只是freq因为我有负频率。
这是因为在计算FFT的频率时,你有一个第二次重复的频率,如下所示:
example of frequency

您有2种获取此频率的方式:
  - 频率为正,此数组为2 x奈奎斯特频率(因此,如果将数组除以2,则表示您拥有所有波形,并且它不会重复)。
  - 频率开始为负并转为正,此数组也是2 x奈奎斯特频率(因此,如果删除负值,则表示您拥有所有波形,并且它不会重复)。

Python fft.fftfreq使用第二个选项。 plot_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()

这是我得到的情节:

3D plot