PySide6 QtCharts多QHorizontalBarSeries共用X轴显示异常问题
问题根源
你错误地为每个状态(BLOCKED/FAIL/PASS等)创建了独立的QHorizontalBarSeries实例,每个系列会默认基于自身数据计算轴范围,导致每个系列的条形都被拉伸至填满X轴,完全忽略了你手动设置的全局X轴范围。
对于分组水平条形图,正确的做法是将所有状态对应的QBarSet添加到同一个QHorizontalBarSeries中,这样所有条形会共用同一套轴刻度,按实际数值比例显示。
修正方案
修改代码中创建系列的循环部分,将多个QBarSet合并到同一个QHorizontalBarSeries,而非每个状态单独创建系列:
# 提取唯一状态和组件(保留原有代码) unique_statuses = sorted(self.testexecutions["ExecutionStatus"].unique()) unique_components = sorted(self.testexecutions["Components"].unique(), reverse=True) self.__chart.setTitle("ExecutionStatus By Component") # 创建Y轴(分类轴,对应组件) y_axis = QtCharts.QBarCategoryAxis() y_axis.setCategories(unique_components) self.__chart.addAxis(y_axis, Qt.AlignLeft) # 创建X轴(数值轴,对应测试用例数量) x_axis = QtCharts.QValueAxis() # 数据分组处理(保留原有代码) grouped_data = self.testexecutions.groupby(["ExecutionStatus", "Components"]).size().reset_index(name="Count") status_component_amount_dict = {} for status in unique_statuses: status_data = grouped_data[grouped_data["ExecutionStatus"] == status] status_component_amount_dict[status] = dict(zip(status_data["Components"], status_data["Count"])) max_bar_value = self.__get_maximum_bar(status_component_amount_dict) print(f"max_bar_value: {max_bar_value}") # 设置X轴范围并禁用自动范围,确保刻度固定 x_axis.setRange(0, max_bar_value) x_axis.setLabelFormat("%i") x_axis.setAutoRange(False) # 禁用自动调整范围,强制使用手动设置的区间 self.__chart.addAxis(x_axis, Qt.AlignBottom) # --- 核心修改部分 --- # 创建一个统一的水平条形系列,而非每个状态单独创建系列 series = QtCharts.QHorizontalBarSeries() for status in sorted(status_component_amount_dict.keys()): print(f"{status}: {status_component_amount_dict[status]}") bar_set = QtCharts.QBarSet(status) for component in unique_components: bar_set.append(status_component_amount_dict[status].get(component, 0)) # 将每个状态的BarSet添加到同一个系列中 series.append(bar_set) # 将系列添加到图表,再附加到已创建的轴上 self.__chart.addSeries(series) series.attachAxis(x_axis) series.attachAxis(y_axis) # --- 核心修改结束 --- # 图例设置(保留原有代码) legend = self.__chart.legend() legend.setAlignment(Qt.AlignTop) self.chart_view.setChart(self.__chart)
关键说明
- 单一系列多BarSet:所有状态的条形数据都归属到同一个
QHorizontalBarSeries,确保它们共用同一套轴刻度,按实际数值比例渲染。 - 禁用X轴自动范围:添加
x_axis.setAutoRange(False)防止图表在添加系列后自动调整轴范围,强制使用你计算的全局最大值作为X轴上限。
内容的提问来源于stack exchange,提问作者Charty
相关产品推荐
相关产品推荐

