Skip to content

[Feature] 支持线性 x 轴场景下的自动柱宽策略 #4615

Description

@xuefei1313

背景

当前柱系列在维度轴为 band 轴时,会基于轴的 bandwidth() 计算柱宽,并继续应用 barWidthbarMinWidthbarMaxWidthbarGapInGroup 等配置。

但当柱系列的定位轴为 linear x 轴,且没有配置 x2Field 时,线性轴本身不提供 getBandwidth,当前实现会回退到 DefaultBandWidth = 6。这能保证图表正常渲染,但不是真正的数据间距感知的自动柱宽策略。

相关代码路径:

  • packages/vchart/src/series/bar/bar.tsDefaultBandWidth = 6
  • packages/vchart/src/series/bar/bar.ts_getBarWidth 中通过 axisHelper.getBandwidth?.(...) ?? DefaultBandWidth 获取宽度基准
  • packages/vchart/src/series/bar/bar.tsinitLinearRectMarkStyle 中,linear x 且无 x2Field 时使用 x = dataToPosX - barWidth / 2width = _getBarWidth(...)
  • packages/vchart/src/component/axis/cartesian/interface/common.tsgetBandwidth 标注为 band 轴特有

当前行为

  1. band x 轴:默认柱宽随 bandWidth 自适应。
  2. linear x 轴 + x2Field:柱宽由 [x, x2] 映射后的像素区间决定,并支持 barGapbarMinWidth 等约束。
  3. 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 时,柱宽能随可见数据点间距变化。
  • 显式 barWidthbarMinWidthbarMaxWidth 行为保持可预测。
  • x2Field 区间柱/直方图场景不受影响。
  • dataZoom / axis filter 等改变可见数据范围的场景下,自动宽度能重新计算或保持合理。
  • 增加覆盖 linear x 轴柱宽策略的单测或运行时用例。

备注

本需求来源于对现有实现的代码分析。当前 6px 回退是可工作的兼容兜底,但与文档里 barWidth 不配置时“默认自适应”的语义在 linear x 轴场景下不完全一致。

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions