You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)
关键说明
  1. 单一系列多BarSet:所有状态的条形数据都归属到同一个QHorizontalBarSeries,确保它们共用同一套轴刻度,按实际数值比例渲染。
  2. 禁用X轴自动范围:添加x_axis.setAutoRange(False)防止图表在添加系列后自动调整轴范围,强制使用你计算的全局最大值作为X轴上限。

内容的提问来源于stack exchange,提问作者Charty

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 07:53:16