我尝试将天气雷达数据绘制到图像上并使用 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_())
最佳答案
问题是 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/