首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Python中将X轴网格放置在频谱图上?

如何在Python中将X轴网格放置在频谱图上?
EN

Stack Overflow用户
提问于 2015-07-24 22:16:23
回答 3查看 889关注 0票数 16

我有下面的图,它提供了一个压力信号的频谱图,以及放在上面的信号,以供比较。我可以在光谱图上绘制y轴网格,但不能在上面放置x轴网格。

用来生成光谱图的数据是可用的here

可重现代码

代码语言:javascript
复制
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()

我使用的是matplotlib版本1.3.1,如何像中的y轴网格一样将x轴网格放置在谱图的顶部?这是特定于版本的问题吗?

更新

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

EN

回答 3

Stack Overflow用户

发布于 2015-08-03 20:19:20

正如其他人所指出的--用你提供的代码来复制你的问题是非常困难的。

特别是--我在Windows8.1,Ubuntu14.04(在Virtualbox VM上),matplotlib版本1.3.1和1.4.3,设置和不设置text.usetex,以及Python2.7.6和Python3上都试过,它们都没有重现你提供的代码的问题。

然而,

如果我替换这行,I可以重现你看到的内容

代码语言:javascript
复制
spectorgram_pressure_vs_frequency.xaxis.grid(True, which='major', color='#FFFFFF', linestyle=':', linewidth = 0.3)

使用

代码语言:javascript
复制
pressure_vs_time.xaxis.grid(True, which='major', color='#FFFFFF', linestyle=':', linewidth = 0.3)

也就是说,我尝试将xaxis.grid设置在孪生轴上,而不是原始轴上。我必须得出结论,不知何故,在您的真实代码中,您在双子轴而不是主轴上设置了xaxis.grid

这意味着我可以直接回答你的问题,如下所示:

如何像Python中的y轴网格一样将x轴网格放在谱图的顶部?

您的代码实现了这一点--您在原始(不是孪生的)轴上调用xaxis.grid()

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

不,1.3.1和1.4.3中的行为是相同的

票数 5
EN

Stack Overflow用户

发布于 2015-08-03 13:45:27

虽然在我的例子中(python3.4,matplotlib 1.4.2,Ubuntu 14)我看到了x轴网格线,但我想你可以尝试如下:

代码语言:javascript
复制
[pressure_vs_time.xaxis.get_gridlines()[x].zorder for x in range(len(pressure_vs_time.xaxis.get_gridlines())) ]

这将给出你的网格线的图层(上面有更高的值,也可以是负值)。在我的例子中,它为所有行返回2。比你可以设置的:

代码语言:javascript
复制
[pressure_vs_time.xaxis.get_gridlines()[x].zorder = 1000 for x in range(len(pressure_vs_time.xaxis.get_gridlines())) ]
票数 0
EN

Stack Overflow用户

发布于 2015-08-03 18:20:04

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31612876

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档