如何在PyQt5集成的Plotly图表中返回用户点击的列名
解决PyQt5中Plotly柱状图点击获取对应列名(Inflow/Outflow)的问题
你需要给所有柱状图系列(trace)绑定点击事件,并利用Plotly点击事件返回的points对象直接获取对应列名,具体修改如下:
核心修改点
- 移除多余的
fig = go.Figure()创建语句,避免被px.bar覆盖 - 遍历所有trace,为每个柱子系列绑定点击事件
- 在
click_event中通过points.trace.name直接获取目标列名(Inflow/Outflow)
修改后的完整代码
from PyQt5 import QtWidgets, QtWebEngineWidgets from PyQt5.QtWidgets import * import sys import pandas as pd import plotly.graph_objs as go import plotly.express as px app = QApplication([]) tab = QTabWidget() tab.setGeometry( 0, 0, QApplication.desktop().width(), QApplication.desktop().height()) class Tab_bank_statement(QWidget): def __init__(self): super().__init__() self.grid = QtWidgets.QGridLayout() self.setLayout(self.grid) self.window_dashboard_bank_statement() def window_dashboard_bank_statement(self): df = pd.read_feather('bank_statement.feather') df_pivot = df.groupby( pd.Grouper(key='Date', freq='M'), group_keys=False).agg({'Inflow': 'sum','Outflow': 'sum'}).reset_index() # 直接使用px.bar生成图表,移除多余的go.Figure()创建 fig = px.bar(df_pivot, x='Date', y=['Inflow', 'Outflow'], barmode='group') fig._config = {'displayModeBar': False} def click_event(ace, points, state): # 提取点击柱子对应的列名 column_name = points.trace.name print(f"点击的列名: {column_name}") # 为所有柱子系列绑定点击事件 for trace in fig.data: trace.on_click(lambda ace, points, state: click_event(ace, points, state)) browser = QtWebEngineWidgets.QWebEngineView() browser.setHtml(fig.to_html(include_plotlyjs='cdn')) self.grid.addWidget(browser, 0, 2) tab.addTab(Tab_bank_statement(), "Bank_statement") if __name__ == '__main__': tab.show() sys.exit(app.exec_())
关键说明
- Plotly通过
px.bar生成多列柱状图时,每一列对应一个独立的trace,trace的name属性就是你传入的y轴列名 - 点击事件触发时,
points对象包含当前点击的trace信息,直接提取trace.name即可得到目标列名 - 遍历所有trace绑定事件,确保点击任意柱子都能触发响应
内容的提问来源于stack exchange,提问作者Oleg Palamarchuk
相关产品推荐
相关产品推荐

