python - Matplotlib 总是为每个绘图打开一个窗口,而不是仅仅将其写入文件

标签 python matplotlib pyqt

我尝试将天气雷达数据绘制到图像上并使用 PyQt5 显示它。然而,一切工作正常 - 但 matplotlib 的绘图会产生问题。

当我启动程序时,它会生成 2 个空绘图窗口并显示它们。如果我删除两个 pl.close() 语句,则会出现另外 2 个绘图窗口(但这 2 个带有绘图图像)。

你能帮忙吗,为什么它总是打开情节?

我只是希望 matplotlib 将绘图保存到文件中,以便稍后使用 PyQt 打开它。绘图已保存,但出现的窗口令人恼火。

当我不实例化 PyQt 窗口时,绘图窗口会出现几毫秒,然后关闭。

我对 PyQt 和 Matplotlib 非常陌生,我知道代码不是很高效和美观。但我尝试构建一个模型来学习这些东西是如何工作的。这是我的代码:

import numpy as np
import matplotlib.pyplot as pl
import wradlib
import warnings
warnings.filterwarnings('ignore')
import requests
import os
import sys

from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *

# Setting environment Variable
os.environ["WRADLIB_DATA"] = "/home/luke/stationradar_viewer"

def load_radar_data():
    try:
        get_ipython().magic("matplotlib inline")
    except:
        pl.ion()


    RADAR_URL = 'https://opendata.dwd.de/weather/radar/sites/dx/tur/raa00-dx_10832-latest-tur---bin'
    r = requests.get(RADAR_URL)

    with open('/home/luke/stationradar_viewer/raa00-dx_10832-latest-tur---bin', 'wb') as f:
        f.write(r.content)
    
    filename = wradlib.util.get_wradlib_data_file('raa00-dx_10832-latest-tur---bin')

    one_scan, attributes = wradlib.io.read_dx(filename)

    pl.figure(figsize=(10, 8))
    ax, pm = wradlib.vis.plot_ppi(one_scan)
    ax = wradlib.vis.plot_ppi_crosshair((0,0,0), ranges=[40, 80, 128])

    cbar = pl.colorbar(pm, shrink=0.9)
    cbar.set_label("Reflectivity (dBZ)")

    pl.title('Reflectivity at {0}\nDWD radar Türkheim'.format(attributes['datetime']))
    pl.xlim((-128, 128))
    pl.ylim((-128, 128))

    pl.savefig('/home/luke/stationradar_viewer/tur_latest.png', dpi=(300), bbox_inches='tight')
    pl.close(None)

    ########

    RADAR_URL = 'https://opendata.dwd.de/weather/radar/sites/dx/fbg/raa00-dx_10908-latest-fbg---bin'
    r = requests.get(RADAR_URL)

    with open('/home/luke/stationradar_viewer/raa00-dx_10908-latest-fbg---bin', 'wb') as f:
        f.write(r.content)
    
    filename = wradlib.util.get_wradlib_data_file('raa00-dx_10908-latest-fbg---bin')

    one_scan, attributes = wradlib.io.read_dx(filename)

    pl.figure(figsize=(10, 8))
    ax, pm = wradlib.vis.plot_ppi(one_scan)
    ax = wradlib.vis.plot_ppi_crosshair((0,0,0), ranges=[40, 80, 128])

    cbar = pl.colorbar(pm, shrink=0.9)
    cbar.set_label("Reflectivity (dBZ)")

    pl.title('Reflectivity at {0}\nDWD radar Feldberg'.format(attributes['datetime']))
    pl.xlim((-128, 128))
    pl.ylim((-128, 128))

    pl.savefig('/home/luke/stationradar_viewer/fbg_latest.png', dpi=(300), bbox_inches='tight')
    pl.close(None)

class MainWindow(QWidget):
    def __init__(self):
        super().__init__()

        load_radar_data()
  
        # Pixmap LEFT
        pixmap_left = QPixmap('/home/luke/stationradar_viewer/tur_latest.png')
        pixmap_left = pixmap_left.scaled(900, 1080, Qt.KeepAspectRatio)
        # Pixmap RIGHT
        pixmap_right = QPixmap('/home/luke/stationradar_viewer/fbg_latest.png')
        pixmap_right = pixmap_right.scaled(900, 1080, Qt.KeepAspectRatio)

        # LEFT Map
        left_map = QLabel(self)
        left_map.setPixmap(pixmap_left)
        left_map.setAlignment(Qt.AlignLeft)
        # RIGHT Map
        right_map = QLabel(self)
        right_map.setPixmap(pixmap_right)
        right_map.setAlignment(Qt.AlignLeft)

        main_container = QVBoxLayout()

        map_container = QHBoxLayout()
        map_container.addWidget(left_map)
        map_container.addWidget(right_map)
  
        self.setLayout(map_container)
        self.setGeometry(0, 0, 1920, 1080)
        self.setWindowTitle('Stationradar Viewer')
    
        self.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    mainWindow = MainWindow()
    app.quit
    sys.exit(app.exec_())

Screenshot of all Windows

最佳答案

问题是 plt.ion()启用交互模式,使窗口保持打开状态。为什么不使用Qt时窗口会关闭?我假设(因为您没有为这种情况提供任何代码)matplotlib eventloop 允许指令运行或应用程序关闭得如此之快,以至于没有观察到这种现象。

解决方案是删除该命令,也是为了方便路径管理,我已将您的代码修改为:

import os
import sys

import numpy as np
import matplotlib.pyplot as plt
import wradlib
import warnings

warnings.filterwarnings("ignore")

import requests

from PyQt5.QtWidgets import QApplication, QHBoxLayout, QLabel, QVBoxLayout, QWidget
from PyQt5.QtGui import QPixmap
from PyQt5.QtCore import Qt


viewer_dir = "/home/luke/stationradar_viewer"

# Setting environment Variable
os.environ["WRADLIB_DATA"] = viewer_dir


def load_radar_data():
    try:
        get_ipython().magic("matplotlib inline")
    except:
        pass
        # plt.ion()

    RADAR_URL = "https://opendata.dwd.de/weather/radar/sites/dx/tur/raa00-dx_10832-latest-tur---bin"
    r = requests.get(RADAR_URL)

    with open(os.path.join(viewer_dir, "raa00-dx_10832-latest-tur---bin"), "wb") as f:
        f.write(r.content)

    filename = wradlib.util.get_wradlib_data_file("raa00-dx_10832-latest-tur---bin")

    one_scan, attributes = wradlib.io.read_dx(filename)

    plt.figure(figsize=(10, 8))
    ax, pm = wradlib.vis.plot_ppi(one_scan)
    ax = wradlib.vis.plot_ppi_crosshair((0, 0, 0), ranges=[40, 80, 128])

    cbar = plt.colorbar(pm, shrink=0.9)
    cbar.set_label("Reflectivity (dBZ)")

    plt.title("Reflectivity at {0}\nDWD radar Türkheim".format(attributes["datetime"]))
    plt.xlim((-128, 128))
    plt.ylim((-128, 128))

    plt.savefig(
        os.path.join(viewer_dir, "tur_latest.png"), dpi=(300), bbox_inches="tight"
    )

    ########

    RADAR_URL = "https://opendata.dwd.de/weather/radar/sites/dx/fbg/raa00-dx_10908-latest-fbg---bin"
    r = requests.get(RADAR_URL)

    with open(os.path.join(viewer_dir, "raa00-dx_10908-latest-fbg---bin"), "wb") as f:
        f.write(r.content)

    filename = wradlib.util.get_wradlib_data_file("raa00-dx_10908-latest-fbg---bin")

    one_scan, attributes = wradlib.io.read_dx(filename)

    plt.figure(figsize=(10, 8))
    ax, pm = wradlib.vis.plot_ppi(one_scan)
    ax = wradlib.vis.plot_ppi_crosshair((0, 0, 0), ranges=[40, 80, 128])

    cbar = plt.colorbar(pm, shrink=0.9)
    cbar.set_label("Reflectivity (dBZ)")

    plt.title("Reflectivity at {0}\nDWD radar Feldberg".format(attributes["datetime"]))
    plt.xlim((-128, 128))
    plt.ylim((-128, 128))

    plt.savefig(
        os.path.join(viewer_dir, "fbg_latest.png"), dpi=(300), bbox_inches="tight"
    )


class MainWindow(QWidget):
    def __init__(self):
        super().__init__()

        load_radar_data()

        # Pixmap LEFT
        pixmap_left = QPixmap(os.path.join(viewer_dir, "tur_latest.png"))
        pixmap_left = pixmap_left.scaled(900, 1080, Qt.KeepAspectRatio)
        # Pixmap RIGHT
        pixmap_right = QPixmap(os.path.join(viewer_dir, "fbg_latest.png"))
        pixmap_right = pixmap_right.scaled(900, 1080, Qt.KeepAspectRatio)

        # LEFT Map
        left_map = QLabel(self)
        left_map.setPixmap(pixmap_left)
        left_map.setAlignment(Qt.AlignLeft)
        # RIGHT Map
        right_map = QLabel(self)
        right_map.setPixmap(pixmap_right)
        right_map.setAlignment(Qt.AlignLeft)

        main_container = QVBoxLayout()

        map_container = QHBoxLayout()
        map_container.addWidget(left_map)
        map_container.addWidget(right_map)

        self.setLayout(map_container)
        self.setGeometry(0, 0, 1920, 1080)
        self.setWindowTitle("Stationradar Viewer")

        self.show()


if __name__ == "__main__":
    app = QApplication(sys.argv)
    mainWindow = MainWindow()
    app.quit
    sys.exit(app.exec_())

关于python - Matplotlib 总是为每个绘图打开一个窗口,而不是仅仅将其写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62611913/

相关文章:

python - IPython sys.path 不同于 python sys.path

python - 模块未找到错误 : No module named 'google' on python 3. 6.7

python - 尝试将 AWS Transcribe 输出转换为可读格式

matplotlib - 从图形中删除椭圆?

python - 在具有给定位置坐标的节点图中设置边标签的问题

Python 验证仅允许数字和 2 位小数

python - 无法使用ffmpeg保存matplotlib动画

python - 我想将文本放入 pyqt QCalendarWidget

python - py2exe 和消失的图标

python - 调整内容大小时 QGridLayout 不更新?