Как разместить сетку xaxis по спектрограмме в Python?

У меня есть следующий график, который обеспечивает спектрограмму сигнала давления вместе с сигналом, помещенным на него для сравнения. Я смог нарисовать сетки оси Y на спектрограмме, но не мог разместить на ней сетку оси х.

введите описание изображения здесь

Данные, используемые для создания спектрограммы, доступны здесь.

Воспроизводимый код

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 поверх спектрограммы, как решетки оси Y в Python? Я использую matplotlib версии 1.3.1. Является ли это проблемой, зависящей от версии?

Обновление

Я обновил matplotlib с версии 1.3.1 до 1.4.3, даже тогда я не могу установить решетки оси х.

Ответы

Ответ 1

Как отмечали другие, очень сложно воспроизвести вашу проблему с кодом, который вы предоставили.

В частности - я пробовал на Windows 8.1, Ubuntu 14.04 (на Virtualbox VM), matplotlib версии 1.3.1 и 1.4.3, с и без text.usetex и с Python 2.7.6 и Python 3. Ни один из они воспроизводят вашу проблему с кодом, который вы предоставляете.

Однако

I может воспроизводить то, что вы видите, если я заменю строку

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 поверх спектрограммы, как решетки оси Y в Python?

Ваш код делает это: вы вызываете xaxis.grid() на оригинальной (не двойной) оси.

Я использую matplotlib версии 1.3.1. Это проблема, связанная с версией?

Нет, то же поведение в 1.3.1 и 1.4.3

Ответ 2

Хотя в моем случае (python3.4, matplotlib 1.4.2, Ubuntu 14) Я вижу x-сетки, я думаю, вы можете попробовать следующее:

[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())) ]

Ответ 3

Я скопировал код, указанный в вашем вопросе, и он отлично работает для меня. Я вижу как x-, так и y-сетки. Ваш код автоматически сохраняет PDF-версию изображения. Я преобразовал этот вывод в png. Похоже на это

введите описание изображения здесь

Я использую Ubuntu 14.4 LTS, python 2.7.6, numpy 1.8.2 и matplotlib 1.3.1.