Matplotlib表格数据位置调整:MySQL取数在PyQt5中展示效果不符预期
解决方案
核心问题排查
- 数据维度颠倒:原代码将每列数据拆分后按行传入,导致表格行列完全错位,直接使用SQL查询返回的
result4作为单元格内容即可,无需额外拆分重组 - 表头配置错误:误将列字段设置为行标签,没有正确配置顶部列表头
- 配色逻辑错误:仅手动修改了两个单元格的背景色,没有实现全局行交错变色效果
- 布局参数不合理:bbox和scale参数设置不当,容易导致表格显示不全
修改后完整代码
def dashboard_fleet_statistics_fleets_visisted_current_year(self): try: import mysql.connector as con import matplotlib.pyplot as plt mydb = con.connect(host="localhost", user="root", password="你的数据库密码", db="fleet") cursor = mydb.cursor() cursor.execute('''SELECT fleet_code, fleet_name, COUNT(fleet_code) AS "No Of Visits", YEAR(date_of_visit) AS "Year Of Visit" FROM vehicle_tyre_parameters WHERE fleet_code != "" AND YEAR(date_of_visit) = YEAR(CURDATE()) GROUP BY fleet_code''') result4 = cursor.fetchall() # 及时关闭数据库连接避免资源泄漏 cursor.close() mydb.close() # 动态适配画布高度,根据数据行数调整 fig, ax = plt.subplots(figsize=(10, (len(result4)+1)*0.6)) ax.axis('off') # 表格核心配置 table = ax.table( cellText=result4, colLabels=['Fleet Code', 'Fleet Name', 'No of Visits', 'Year of Visit'], colLoc='center', cellLoc='center', loc='center', bbox=[0, 0, 1, 1] # 撑满整个画布区域 ) # 通用样式调整 table.set_fontsize(14) table.auto_set_column_width(col=list(range(4))) # 自动适配每列宽度 # 交错配色逻辑 for row_idx in range(len(result4) + 1): # +1包含表头行 # 表头行单独配色 if row_idx == 0: color = "#cccccc" # 奇数行白色 elif row_idx % 2 == 1: color = "white" # 偶数行浅灰色 else: color = "#eeeeee" # 给当前行所有列设置背景色 for col_idx in range(4): table[(row_idx, col_idx)].set_facecolor(color) plt.tight_layout() # 如需嵌入PyQt5,注释掉plt.show(),将fig绑定到FigureCanvasQTAgg组件即可 plt.show() except Exception as e: print(f"运行错误:{str(e)}")
PyQt5适配说明
如果需要将该表格嵌入PyQt5界面,只需将生成的fig对象绑定到matplotlib.backends.backend_qt5agg.FigureCanvasQTAgg组件,再将组件添加到Qt布局中即可,表格生成逻辑无需调整。
内容的提问来源于stack exchange,提问作者Guirguis.Botros
相关产品推荐
相关产品推荐

