Matplotlib 全屏不适用于 Qt EGLFS
Matplotlib Fullscreen doesn't work with Qt EGLFS
我正在使用 raspberry pi 3 和 raspbian jessie,我交叉编译了 Qt 5.6.4 和 PyQt5 来制作嵌入式设备,在我的应用程序上,一切正常,它使用EGLFS 驱动程序,所以没有 X 服务器 运行(我停用了它),但是,在我的应用程序上,我有一个按钮可以打开 matplotlib 图,该图被配置为全屏显示,并且在 X 服务器上运行良好(第一次测试我 运行),然而,现在我使用的是没有 x 服务器的 eglfs,绘图出现在屏幕的左上角,我将 post 一张图片和我的图表代码。
还有我的代码:
import matplotlib
matplotlib.use('Qt5Agg')
import matplotlib.pyplot as plt
import datetime as dt
import numpy as np
import matplotlib.dates as md
from matplotlib.widgets import Button
def graph():
x = [dt.datetime(2018, 7, 7, 17, 59), dt.datetime(2018, 7, 7, 18, 4), dt.datetime(2018, 7, 7, 19, 9),
dt.datetime(2018, 7, 7, 19, 14), dt.datetime(2018, 7, 7, 20, 19), dt.datetime(2018, 7, 7, 20, 24),
dt.datetime(2018, 7, 7, 20, 29), dt.datetime(2018, 7, 7, 21, 34), dt.datetime(2018, 7, 7, 21, 39),
dt.datetime(2018, 7, 7, 22, 44)]
y = [72,68,145,156,184,160,210,230,215,222]
highest = max(y)
lowest = min(y)
xlen = len(x)
lastdate = xlen - 1
deltah = dt.timedelta(minutes = 17)
figfuel, ax = plt.subplots()
ax.plot(x,y, label ='Cb-Ft per hour')
ax.axhline(highest, color='r', linestyle='--', label='Last 24h max Comsumption')
ax.text(x[lastdate] + deltah, highest, str(highest), va='center', ha="left", bbox=dict(facecolor="w",alpha=0.5))
ax.axhline(lowest, color='c', linestyle='--', label='Last 24h min Comsumption')
ax.text(x[lastdate] + deltah, lowest, str(lowest), va='center', ha="left", bbox=dict(facecolor="w",alpha=0.5))
#plt.plot(x,y, label='Cb-Ft per hour')
plt.connect('button_press_event', efecto)
plt.subplots_adjust(bottom=0.2)
plt.ylabel('Fuel Comsumption (Cb-ft per hour)')
plt.xlabel('Time (h)')
plt.title('Fuel Comsumption Chart')
plt.grid(True)
plt.legend()
plt.xticks(rotation=90)
figManager = plt.get_current_fig_manager()
figManager.window.showFullScreen()
xformatter = md.DateFormatter('%H:%M')
xlocator = md.MinuteLocator(byminute=[0,60], interval = 1)
ax.xaxis.set_major_locator(xlocator)
plt.gcf().axes[0].xaxis.set_major_formatter(xformatter)
#axcut = plt.axes([0.7, 0.05, 0.1, 0.075])
#axcut = plt.axes([0.885, 0.015, 0.1, 0.075])
#bcut = Button(axcut, 'Close')
#bcut.on_clicked(efecto)
plt.show()
def efecto(event):
plt.close()
谁能帮我弄清楚为什么会这样?
编辑:
当 运行 python 脚本时,EGLFS 告诉我它无法获取屏幕的物理尺寸,我会试一试,看看它是否改变了什么
编辑 2:
在 运行 在 EGLFS 上设置正确大小的脚本后,发生了同样的事情,因此与此无关,任何帮助将不胜感激
我要回答我自己的问题,似乎 Embedded Qt 的 pyplot 模块有问题,所以当我执行 matplotlib 脚本时它无法正确调整到屏幕,因为没有 X 服务器,我对其进行了测试,使用 X 服务器一切正常。
现在,如果你不想使用 X 服务器(像我一样),你需要使用 Qt Designer 的 MatPlotlib python 小部件,这样你就可以创建一个 QWidget 或 QMainWindow一个绘图图,然后,您可以创建一个 python 脚本来将您需要的所有内容添加到该绘图中,它就像另一个 Qt window,但您的绘图是您想要的。
我正在使用 raspberry pi 3 和 raspbian jessie,我交叉编译了 Qt 5.6.4 和 PyQt5 来制作嵌入式设备,在我的应用程序上,一切正常,它使用EGLFS 驱动程序,所以没有 X 服务器 运行(我停用了它),但是,在我的应用程序上,我有一个按钮可以打开 matplotlib 图,该图被配置为全屏显示,并且在 X 服务器上运行良好(第一次测试我 运行),然而,现在我使用的是没有 x 服务器的 eglfs,绘图出现在屏幕的左上角,我将 post 一张图片和我的图表代码。
还有我的代码:
import matplotlib
matplotlib.use('Qt5Agg')
import matplotlib.pyplot as plt
import datetime as dt
import numpy as np
import matplotlib.dates as md
from matplotlib.widgets import Button
def graph():
x = [dt.datetime(2018, 7, 7, 17, 59), dt.datetime(2018, 7, 7, 18, 4), dt.datetime(2018, 7, 7, 19, 9),
dt.datetime(2018, 7, 7, 19, 14), dt.datetime(2018, 7, 7, 20, 19), dt.datetime(2018, 7, 7, 20, 24),
dt.datetime(2018, 7, 7, 20, 29), dt.datetime(2018, 7, 7, 21, 34), dt.datetime(2018, 7, 7, 21, 39),
dt.datetime(2018, 7, 7, 22, 44)]
y = [72,68,145,156,184,160,210,230,215,222]
highest = max(y)
lowest = min(y)
xlen = len(x)
lastdate = xlen - 1
deltah = dt.timedelta(minutes = 17)
figfuel, ax = plt.subplots()
ax.plot(x,y, label ='Cb-Ft per hour')
ax.axhline(highest, color='r', linestyle='--', label='Last 24h max Comsumption')
ax.text(x[lastdate] + deltah, highest, str(highest), va='center', ha="left", bbox=dict(facecolor="w",alpha=0.5))
ax.axhline(lowest, color='c', linestyle='--', label='Last 24h min Comsumption')
ax.text(x[lastdate] + deltah, lowest, str(lowest), va='center', ha="left", bbox=dict(facecolor="w",alpha=0.5))
#plt.plot(x,y, label='Cb-Ft per hour')
plt.connect('button_press_event', efecto)
plt.subplots_adjust(bottom=0.2)
plt.ylabel('Fuel Comsumption (Cb-ft per hour)')
plt.xlabel('Time (h)')
plt.title('Fuel Comsumption Chart')
plt.grid(True)
plt.legend()
plt.xticks(rotation=90)
figManager = plt.get_current_fig_manager()
figManager.window.showFullScreen()
xformatter = md.DateFormatter('%H:%M')
xlocator = md.MinuteLocator(byminute=[0,60], interval = 1)
ax.xaxis.set_major_locator(xlocator)
plt.gcf().axes[0].xaxis.set_major_formatter(xformatter)
#axcut = plt.axes([0.7, 0.05, 0.1, 0.075])
#axcut = plt.axes([0.885, 0.015, 0.1, 0.075])
#bcut = Button(axcut, 'Close')
#bcut.on_clicked(efecto)
plt.show()
def efecto(event):
plt.close()
谁能帮我弄清楚为什么会这样?
编辑:
当 运行 python 脚本时,EGLFS 告诉我它无法获取屏幕的物理尺寸,我会试一试,看看它是否改变了什么
编辑 2:
在 运行 在 EGLFS 上设置正确大小的脚本后,发生了同样的事情,因此与此无关,任何帮助将不胜感激
我要回答我自己的问题,似乎 Embedded Qt 的 pyplot 模块有问题,所以当我执行 matplotlib 脚本时它无法正确调整到屏幕,因为没有 X 服务器,我对其进行了测试,使用 X 服务器一切正常。
现在,如果你不想使用 X 服务器(像我一样),你需要使用 Qt Designer 的 MatPlotlib python 小部件,这样你就可以创建一个 QWidget 或 QMainWindow一个绘图图,然后,您可以创建一个 python 脚本来将您需要的所有内容添加到该绘图中,它就像另一个 Qt window,但您的绘图是您想要的。