如何在Python中将xaxis网格放在频谱图上?

时间:2015-07-24 14:16:23

标签: python matplotlib

我有以下图表,它提供压力信号的频谱图以及放在其上的信号用于比较。我能够在频谱图上绘制y轴网格,但无法在其上放置x轴网格。

enter image description here

用于生成频谱图的数据可用here

可重现的代码

from __future__ import division
from matplotlib import ticker as mtick
from matplotlib.backends.backend_pdf import PdfPages
import matplotlib.pyplot as plt
import numpy as np

data = np.genfromtxt('pressure.dat', skiprows = 1, delimiter = '\t')
pressure = data[:, 1]
theta = data[:, 0]


with PdfPages('Spectorgram of cylinder pressure.pdf') as spectorgram_pressure:
    _spectorgram_pressure_vs_frequency_ = plt.figure(figsize=(5.15, 5.15))
    _spectorgram_pressure_vs_frequency_.clf()
    spectorgram_pressure_vs_frequency = plt.subplot(111)
    cax = plt.specgram(pressure * 100000, NFFT = 256, Fs = 90000, cmap=plt.cm.gist_heat, zorder = 1)
    spectorgram_pressure_vs_frequency.grid(False, which="major")
    spectorgram_pressure_vs_frequency.set_xlabel('Time (s)', labelpad=6)
    spectorgram_pressure_vs_frequency.set_ylabel('Frequency (Hz)', labelpad=6)
    y_min, y_max = spectorgram_pressure_vs_frequency.get_ylim()
    # plt.gca
    cbar = plt.colorbar(orientation='vertical', ax = spectorgram_pressure_vs_frequency, fraction = 0.046, pad = 0.2)
    cbar.set_label('Power spectral density (dB)', rotation=90)
    primary_ticks = len(spectorgram_pressure_vs_frequency.yaxis.get_major_ticks())
    pressure_vs_time = spectorgram_pressure_vs_frequency.twinx()
    pressure_vs_time.plot(((theta + 360) / (6 * 6600)), pressure, linewidth = 0.75, linestyle = '-', color = '#FFFFFF', zorder = 2)
    pressure_vs_time.grid(b = True, which='major', color='#FFFFFF', linestyle=':', linewidth = 0.3)
    spectorgram_pressure_vs_frequency.xaxis.grid(True, which='major', color='#FFFFFF', linestyle=':', linewidth = 0.3)
    pressure_vs_time.set_ylabel('Cylinder pressure (bar)', labelpad=6)
    pressure_vs_time.yaxis.set_major_locator(mtick.LinearLocator(primary_ticks))
    spectorgram_pressure_vs_frequency.set_xlim([0, max(cax[2])])
    spectorgram_pressure.savefig(bbox_inches='tight')
    plt.close()

如何将x轴网格放在频谱图之上,就像Python中的y轴网格一样? 我正在使用matplotlib 1.3.1版。 这是特定于版本的问题吗?

更新

我将matplotlib从版本1.3.1更新到1.4.3,即使这样我也无法设置x轴网格。

3 个答案:

答案 0 :(得分:5)

正如其他人所指出的那样 - 使用您提供的代码复制您的问题非常困难。

特别是 - 我尝试过Windows 8.1,Ubuntu 14.04(在Virtualbox VM上),matplotlib版本1.3.1和1.4.3,有和没有text.usetex设置以及Python 2.7.6和Python 3。他们都不会使用您提供的代码重现您的问题。

然而

可以 重现你所看到的更换行

spectorgram_pressure_vs_frequency.xaxis.grid(True, which='major', color='#FFFFFF', linestyle=':', linewidth = 0.3)

pressure_vs_time.xaxis.grid(True, which='major', color='#FFFFFF', linestyle=':', linewidth = 0.3)

即。我尝试在孪生轴而不是原始轴上设置xaxis.grid。我必须得出结论,在您的真实代码中,您在孪生轴而不是主轴上设置xaxis.grid

这意味着我可以回答您的直接问题如下:

  

如何将x轴网格放在频谱图之上,就像Python中的y轴网格一样?

您的代码执行此操作 - 您在原始(非双联)轴上调用xaxis.grid()

  

我正在使用matplotlib 1.3.1版。这是特定于版本的问题吗?

不,1.3.1和1.4.3中的行为相同

答案 1 :(得分:0)

虽然在我的情况下(python3.4,matplotlib 1.4.2,Ubuntu 14)我看到x-gridlines,我想你可以试试下面的内容:

[pressure_vs_time.xaxis.get_gridlines()[x].zorder for x in range(len(pressure_vs_time.xaxis.get_gridlines())) ]

这将为您提供网格线的图层(上部有更高的值,也可以是负数)。在我的情况下,它返回所有行的2。你可以设置:

[pressure_vs_time.xaxis.get_gridlines()[x].zorder = 1000 for x in range(len(pressure_vs_time.xaxis.get_gridlines())) ]

答案 2 :(得分:0)

我复制了你问题中提供的代码,它对我来说很好。我看到了x和y网格线。您的代码会自动保存图像的pdf版本。我将此输出转换为png。看起来像这样

enter image description here

我使用的是Ubuntu 14.4 LTS,python 2.7.6,numpy 1.8.2和matplotlib 1.3.1。