Matplotlib 绘图 x 轴(数据文件日期时间)

Posted

技术标签:

【中文标题】Matplotlib 绘图 x 轴(数据文件日期时间)【英文标题】:Matplotlib plot x axis (data file datetime) 【发布时间】:2020-04-01 06:07:11 【问题描述】:

我将使用 Python 的 GUI 显示图形。 GUI 代码和通用代码的应用方式不同(x 轴)。我没有在剧情中专门设置任何选项,但原因未知。使用obspy模块,加载地震数据格式的mseed文件并显示图形是简单的代码。 到目前为止,为了将x轴作为日期时间,我尝试使用'arange'函数和'for in'函数将其放入绘图中,但GUI程序无法正常运行并结束。 问题是绘图正常绘制,但x轴显示为数据的采样率,而不是时间。

完整的代码如下所示:

import sys, os
from os.path import basename
import numpy as np
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
import matplotlib.pyplot as plt
import obspy.signal.util as sig
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from obspy import read, UTCDateTime
from matplotlib.backends.backend_qt5 import NavigationToolbar2QT as NavigationToolbar


class MyWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.setupUI()

    def setupUI(self):
        # GUI WINDOW
        self.setGeometry(100, 100, 1000, 700)
        self.setWindowTitle("TEST TITLE")

        # OPEN FILE DIALOG
        self.pushButton = QPushButton("LOAD FILE")
        self.pushButton.clicked.connect(self.pushButtonClicked)

        # LABLE, NOT USED
        self.label = QLabel("", self)
        self.label.resize(1000, 30)

        # PLOT FIGURE, CANVAS AND NAVIGATION TOOLBAR
        self.fig = plt.Figure()
        self.canvas = FigureCanvas(self.fig)
        self.toolbar = NavigationToolbar(self.canvas, self)

        # LAYOUT(CANVAS, TOOLBAR)
        topLayout = QVBoxLayout()
        topLayout.addWidget(self.toolbar)
        topLayout.addWidget(self.canvas)

        # LAYOUT(BUTTON)
        bottomLayout = QHBoxLayout()
        bottomLayout.addWidget(self.pushButton)
        bottomLayout.addStretch(1)

        # ALL LAYOUT
        layout = QVBoxLayout()
        layout.addLayout(topLayout)
        layout.addLayout(bottomLayout)
        layout.setStretchFactor(topLayout, 1)
        layout.setStretchFactor(bottomLayout, 0)

        # SET LOAYOUT
        self.setLayout(layout)

    # LOAD DATA FILE, DIALOG BUTTON
    def pushButtonClicked(self):

        #LOAD FILE
        pathfile0 = QFileDialog.getOpenFileName(self)
        fname = basename(pathfile0[0])
        data = read(fname)

        self.fig.clear()
        self.ax = self.fig.add_subplot(111)
        self.ax.cla()
        self.ax.plot(data[0])
        self.ax.set_ylabel("Count")
        self.ax.set_xlabel("Time Domain [s]")
        self.ax.grid()

        self.canvas.draw()
        self.canvas.show()


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MyWindow()
    window.show()
    app.exec_()

from obspy import read, UTCDateTime

def check_ms(fname) :

    data = read(fname)
    #myS = UTCDateTime("2020-02-12T02:30:00")
    #myE = myS + 120
    #data.trim(myS, myE)

    data.plot()

check_ms('KE2.TS.00.BGE.2020.043')

此代码在没有 GUI 的情况下以纯 Python 代码加载和绘制 mseed 地震数据。

【问题讨论】:

【参考方案1】:

只需将 Figure 传递给 plot 方法,而不是创建新的 ax:

def pushButtonClicked(self):
    pathfile, _ = QFileDialog.getOpenFileName(self)
    if pathfile:
        fname = basename(pathfile)
        data = read(fname)
        data.plot(fig=self.fig)

【讨论】:

改代码很流畅。成功的。谢谢。

以上是关于Matplotlib 绘图 x 轴(数据文件日期时间)的主要内容,如果未能解决你的问题,请参考以下文章

Matplotlib绘图时x轴标签重叠的解决办法

是否可以使用 matplotlib 将 x 轴设置为仅显示开始日期和结束日期?

使用 matplotlib 绘图没有给出所需的日期时间格式

Matplotlib从文件绘图时Y轴坐标不正确

在 matplotlib 中将 x 轴移动到绘图的顶部

通过matplotlib中的因子更改绘图比例