背景
当前柱系列在维度轴为 band 轴时,会基于轴的 bandwidth() 计算柱宽,并继续应用 barWidth、barMinWidth、barMaxWidth、barGapInGroup 等配置。
但当柱系列的定位轴为 linear x 轴,且没有配置 x2Field 时,线性轴本身不提供 getBandwidth,当前实现会回退到 DefaultBandWidth = 6。这能保证图表正常渲染,但不是真正的数据间距感知的自动柱宽策略。
相关代码路径:
packages/vchart/src/series/bar/bar.ts:DefaultBandWidth = 6
packages/vchart/src/series/bar/bar.ts:_getBarWidth 中通过 axisHelper.getBandwidth?.(...) ?? DefaultBandWidth 获取宽度基准
packages/vchart/src/series/bar/bar.ts:initLinearRectMarkStyle 中,linear x 且无 x2Field 时使用 x = dataToPosX - barWidth / 2 与 width = _getBarWidth(...)
packages/vchart/src/component/axis/cartesian/interface/common.ts:getBandwidth 标注为 band 轴特有
当前行为
- band x 轴:默认柱宽随 bandWidth 自适应。
- linear x 轴 +
x2Field:柱宽由 [x, x2] 映射后的像素区间决定,并支持 barGap、barMinWidth 等约束。
- linear x 轴 + 无
x2Field:默认柱宽固定回退为 6px;若配置百分比形式的 barWidth,百分比基准实际也是这个回退宽度。
需求
希望为 “linear x 轴 + 无 x2Field + 用户未显式配置 barWidth” 的柱系列提供更合理的自动柱宽策略,使柱宽能够根据当前可见数据点间距自适应,而不是固定 6px。
建议策略
可以考虑基于当前可见数据点映射到像素后的相邻间距计算宽度:
autoBarWidth = clamp(minPositiveSpacingPx * ratio, minWidth, maxWidth)
建议边界:
minPositiveSpacingPx 取当前可见数据中相邻 x 像素坐标的最小正间距,避免不等距数据下重叠。
ratio 可取 0.6 ~ 0.8,具体值可结合现有柱图视觉风格评估。
- 仍尊重
barMinWidth / barMaxWidth。
- 如果无法从数据或布局推导有效间距,继续回退到现有 6px 行为。
- 显式配置
barWidth 时不启用该自动策略,避免破坏用户明确设置。
- 配置了
x2Field 的区间柱/直方图场景继续使用区间宽度逻辑,不纳入该策略。
验收标准
- linear x 轴、无
x2Field、无显式 barWidth 时,柱宽能随可见数据点间距变化。
- 显式
barWidth、barMinWidth、barMaxWidth 行为保持可预测。
x2Field 区间柱/直方图场景不受影响。
- dataZoom / axis filter 等改变可见数据范围的场景下,自动宽度能重新计算或保持合理。
- 增加覆盖 linear x 轴柱宽策略的单测或运行时用例。
备注
本需求来源于对现有实现的代码分析。当前 6px 回退是可工作的兼容兜底,但与文档里 barWidth 不配置时“默认自适应”的语义在 linear x 轴场景下不完全一致。
背景
当前柱系列在维度轴为 band 轴时,会基于轴的
bandwidth()计算柱宽,并继续应用barWidth、barMinWidth、barMaxWidth、barGapInGroup等配置。但当柱系列的定位轴为 linear x 轴,且没有配置
x2Field时,线性轴本身不提供getBandwidth,当前实现会回退到DefaultBandWidth = 6。这能保证图表正常渲染,但不是真正的数据间距感知的自动柱宽策略。相关代码路径:
packages/vchart/src/series/bar/bar.ts:DefaultBandWidth = 6packages/vchart/src/series/bar/bar.ts:_getBarWidth中通过axisHelper.getBandwidth?.(...) ?? DefaultBandWidth获取宽度基准packages/vchart/src/series/bar/bar.ts:initLinearRectMarkStyle中,linear x 且无x2Field时使用x = dataToPosX - barWidth / 2与width = _getBarWidth(...)packages/vchart/src/component/axis/cartesian/interface/common.ts:getBandwidth标注为 band 轴特有当前行为
x2Field:柱宽由[x, x2]映射后的像素区间决定,并支持barGap、barMinWidth等约束。x2Field:默认柱宽固定回退为 6px;若配置百分比形式的barWidth,百分比基准实际也是这个回退宽度。需求
希望为 “linear x 轴 + 无
x2Field+ 用户未显式配置barWidth” 的柱系列提供更合理的自动柱宽策略,使柱宽能够根据当前可见数据点间距自适应,而不是固定 6px。建议策略
可以考虑基于当前可见数据点映射到像素后的相邻间距计算宽度:
建议边界:
minPositiveSpacingPx取当前可见数据中相邻 x 像素坐标的最小正间距,避免不等距数据下重叠。ratio可取 0.6 ~ 0.8,具体值可结合现有柱图视觉风格评估。barMinWidth/barMaxWidth。barWidth时不启用该自动策略,避免破坏用户明确设置。x2Field的区间柱/直方图场景继续使用区间宽度逻辑,不纳入该策略。验收标准
x2Field、无显式barWidth时,柱宽能随可见数据点间距变化。barWidth、barMinWidth、barMaxWidth行为保持可预测。x2Field区间柱/直方图场景不受影响。备注
本需求来源于对现有实现的代码分析。当前 6px 回退是可工作的兼容兜底,但与文档里
barWidth不配置时“默认自适应”的语义在 linear x 轴场景下不完全一致。