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

Vega堆叠柱状图中如何为各分段添加内嵌标签?

Vega 堆叠柱状图内嵌标签实现方案

你需要的垂直堆叠柱状图内嵌标签效果可以通过调整Vega spec实现,以下是修正后的完整可运行代码:

{
  "$schema": "https://vega.github.io/schema/vega/v5.json",
  "description": "堆叠柱状图内嵌标签示例",
  "width": 294,
  "height": 200,
  "padding": 5,
  "autosize": {"type": "fit-x", "contains": "padding"},
  
  "data": [
    {
      "name": "categories",
      "values": [
        {"y": 5, "c": 0, "name": "other"},
        {"y": 7, "c": 1, "name": "corn"},
        {"y": 22, "c": 2, "name": "pasture/hay"},
        {"y": 31, "c": 3, "name": "developed"},
        {"y": 35, "c": 4, "name": "forest"}
      ],
      "transform": [
        {
          "type": "stack",
          "field": "y"
        }
      ]
    }
  ],

  "scales": [
    {
      "name": "y",
      "type": "linear",
      "range": "height",
      "nice": true, "zero": true,
      "domain": {"data": "categories", "field": "y1"}
    },
    {
      "name": "color",
      "type": "ordinal",
      "range": "category",
      "domain": {"data": "categories", "field": "c"}
    }
  ],

  "axes": [],

  "marks": [
    // 堆叠柱状图矩形
    {
      "name": "bars",
      "type": "rect",
      "from": {"data": "categories"},
      "encode": {
        "enter": {
          "x": {"value": 0},
          "width": {"value": 294},
          "y": {"scale": "y", "field": "y0"},
          "y2": {"scale": "y", "field": "y1"},
          "fill": {"scale": "color", "field": "c"}
        },
        "update": {
          "fillOpacity": {"value": 1}
        },
        "hover": {
          "fillOpacity": {"value": 0.5}
        }
      }
    },
    // 内嵌标签文本
    {
      "name": "labels",
      "type": "text",
      "from": {"data": "categories"},
      "encode": {
        "enter": {
          "x": {"value": 147}, // 柱状图宽度的一半,居中显示
          "y": {"scale": "y", "signal": "(datum.y0 + datum.y1)/2"}, // 分段垂直居中
          "fill": {
            "signal": "contrast('white', scale('color', datum.c)) > contrast('black', scale('color', datum.c)) ? 'white' : 'black'"
          },
          "align": {"value": "center"},
          "baseline": {"value": "middle"},
          "text": {"field": "name"},
          "fontSize": {"value": 12}
        }
      }
    }
  ]
}

关键修改说明

  • 移除冗余group结构:原spec中的group层会导致数据上下文混乱,直接用两个独立的mark层(rect和text)即可实现需求。
  • 文本垂直居中:通过(datum.y0 + datum.y1)/2计算分段的垂直中点,再经y scale转换后定位文本。
  • 自适应文本颜色:通过contrast函数对比背景色与黑白的对比度,自动选择更清晰的文本颜色。
  • 文本水平居中:设置x为柱状图宽度的一半(294/2=147),确保文本在分段内水平居中。

该方案可实现你期望的效果:每个堆叠分段内居中显示对应的名称,文本颜色自动适配背景,鼠标悬停时分段会半透明高亮。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 07:15:27