Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Matplotlib始终为每个绘图打开一个窗口,而不仅仅是将其写入文件_Python_Matplotlib_Pyqt - Fatal编程技术网

Python Matplotlib始终为每个绘图打开一个窗口,而不仅仅是将其写入文件

Python Matplotlib始终为每个绘图打开一个窗口,而不仅仅是将其写入文件,python,matplotlib,pyqt,Python,Matplotlib,Pyqt,我尝试将天气雷达数据绘制成一幅图像,并使用PyQt5显示它。但是,一切都很好,但是matplotlib的绘图会产生问题 当我启动程序时,它会生成两个空的绘图窗口并显示它们。如果我删除两个pl.close()语句,则会有另外两个打印窗口(但这两个窗口带有打印图像) 你能帮忙吗,为什么它总是打开绘图 我只希望matplotlib将绘图保存到一个文件中,以便稍后使用PyQt打开它。绘图已保存,但出现的窗口令人恼火 当我没有实例化PyQt窗口时,绘图窗口会出现几毫秒,然后关闭 我对PyQt和Matplo

我尝试将天气雷达数据绘制成一幅图像,并使用PyQt5显示它。但是,一切都很好,但是matplotlib的绘图会产生问题

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

你能帮忙吗,为什么它总是打开绘图

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

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

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

将numpy导入为np
将matplotlib.pyplot作为pl导入
进口包装纸
进口警告
警告。过滤器警告(“忽略”)
导入请求
导入操作系统
导入系统
从PyQt5.QtWidgets导入*
从PyQt5.QtGui导入*
从PyQt5.QtCore导入*
#设置环境变量
os.environ[“WRADLIB_DATA”]=“/home/luke/stationradar_viewer”
def加载雷达数据()
尝试:
get_ipython().magic(“matplotlib内联”)
除:
pl.ion()
雷达https://opendata.dwd.de/weather/radar/sites/dx/tur/raa00-dx_10832-latest-tur---bin'
r=请求.get(雷达URL)
打开('/home/luke/stationradar_viewer/raa00-dx_10832-latest-tur--bin',wb')作为f:
f、 写作(r.content)
filename=wradlib.util.get_wradlib_data_文件('raa00-dx_10832-latest-tur---bin'))
一次扫描,attributes=wradlib.io.read\u dx(文件名)
pl.图(figsize=(10,8))
ax,pm=wradlib.vis.plot\u ppi(一次扫描)
ax=wradlib.vis.plot\u ppi\u十字线((0,0,0),范围=[40,80,128])
cbar=pl.colorbar(pm,收缩率=0.9)
cbar.set_标签(“反射率(dBZ)”)
pl.title({0}\nDWD radar Türkheim.格式的反射率(属性['datetime']))
pl.xlim(-128128))
pl.ylim(-128128))
pl.savefig('/home/luke/stationradar\u viewer/tur\u latest.png',dpi=(300),bbox\u inches='tight')
pl.close(无)
########
雷达https://opendata.dwd.de/weather/radar/sites/dx/fbg/raa00-dx_10908-latest-fbg---bin'
r=请求.get(雷达URL)
打开('/home/luke/stationradar_viewer/raa00-dx_10908-latest-fbg--bin',wb')作为f:
f、 写作(r.content)
filename=wradlib.util.get_wradlib_data_文件('raa00-dx_10908-latest-fbg---bin'))
一次扫描,attributes=wradlib.io.read\u dx(文件名)
pl.图(figsize=(10,8))
ax,pm=wradlib.vis.plot\u ppi(一次扫描)
ax=wradlib.vis.plot\u ppi\u十字线((0,0,0),范围=[40,80,128])
cbar=pl.colorbar(pm,收缩率=0.9)
cbar.set_标签(“反射率(dBZ)”)
pl.title({0}\nDWD radar Feldberg.格式的反射率(属性['datetime']))
pl.xlim(-128128))
pl.ylim(-128128))
pl.savefig('/home/luke/stationradar\u viewer/fbg\u latest.png',dpi=(300),bbox\u inches='tight')
pl.close(无)
类主窗口(QWidget):
定义初始化(自):
super()。\uuuu init\uuuuu()
加载雷达数据()
#Pixmap左
pixmap_left=QPixmap('/home/luke/stationradar_viewer/tur_latest.png'))
pixmap_left=pixmap_left.缩放(9001080,Qt.KeepAspectRatio)
#Pixmap右键
pixmap_right=QPixmap('/home/luke/stationradar_viewer/fbg_latest.png'))
pixmap_right=pixmap_right.缩放(9001080,Qt.KeepAspectRatio)
#左图
左映射=QLabel(self)
左映射。设置像素映射(像素映射左)
左映射设置对齐(Qt.AlignLeft)
#右图
右映射=QLabel(self)
右映射。设置pixmap(pixmap右)
右映射设置对齐(Qt.对齐左)
主容器=QVBoxLayout()
map_container=QHBoxLayout()
map\u container.addWidget(左映射)
map\u container.addWidget(右\u映射)
self.setLayout(映射容器)
self.setGeometry(0,0,1920,1080)
self.setWindowTitle('Stationradar Viewer')
self.show()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
app=QApplication(sys.argv)
mainWindow=mainWindow()
app.quit
sys.exit(app.exec_())

问题在于启用交互模式使窗口保持打开状态。为什么不使用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_())

只是想对这个奇怪的尝试/例外提出一些理由。wradlib jupyter笔记本还可以用作单元测试。try/except只是检查代码是在jupyter内部运行还是通过普通python运行。