python - Matplotlib 总是为每个绘图打开一个窗口,而不是仅仅将其写入文件
问题描述
我尝试将天气雷达数据绘制成图像并使用 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 事件循环允许指令运行或应用程序关闭得如此之快以至于没有观察到这种现象。
解决方案是删除该命令,也为了便于路径管理,我已将您的代码修改为:
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_())
推荐阅读
- php - 如何比较 Laravel 数据库中的数据集?
- loops - 循环的每次迭代都洗牌颜色不起作用
- html - 如何将 lang 属性添加到 Next.js 中的 html 标签?
- hiveql - 怎么说 Hive 将 TEMPORARY MACRO 扩展为永久 VIEW?
- vb.net - 你怎么能做随机运动?
- rspec - 在 rspec 中使用 vcr / 盒式磁带时,有没有办法更改 match_requests_on 每次测试?
- r - 如何创建将分数赔率向量转换为百分比的函数?
- matrix - DAX 乘以两个最大日期度量
- modeling - 关于几何布朗运动中经过建模时间的问题
- r - 更改嵌套列表中的值