Search code examples
vegastacked-area-chart

How can I define duplicate values on the X-axis of a stacked area chart with Vega?


Is there anyway to define duplicate values on an X-axis in a stacked area chart?

I'm trying to create a chart that has an X Axis from 50 down to 0 and back up to 30, like: 50, 40, 30, 20, 10, 0, 5, 10, 15, 20

I'm having issues where the duplicate values are not showing up, so I get: 50, 40, 30, 20, 10, 0, 5, 15

enter image description here

I tried adding a groupby to distinguish the duplicates. Any thoughts/suggestions would be greatly appreciated.

{
  "$schema": "https://vega.github.io/schema/vega/v5.json",
  "description": "A basic stacked area chart example.",
  "width": 450,
  "height": 200,
  "padding": 5,

  "data": [
    {
      "name": "table",
 "values": [
        {"x": "50", "x2": 0, "y": 20, "c":0, "color":"#aaa"}, {"x": "50", "x2": 0, "y": 20, "c":1, "color":"#000"},
        {"x": "40", "x2": 1, "y": 40, "c":0, "color":"#aaa"}, {"x": "40", "x2": 1, "y": 40, "c":1, "color":"#000"},
        {"x": "30", "x2": 2, "y": 70, "c":0, "color":"#aaa"}, {"x": "30", "x2": 2, "y": 70, "c":1, "color":"#000"},
        {"x": "20", "x2": 3, "y": 80, "c":0, "color":"#aaa"}, {"x": "20", "x2": 3, "y": 80, "c":1, "color":"#000"},
        {"x": "10", "x2": 4, "y": 50, "c":0, "color":"#aaa"}, {"x": "10", "x2": 4, "y": 50, "c":1, "color":"#000"},
        {"x":  "0", "x2": 5, "y": 50, "c":0, "color":"#aaa"}, {"x":  "0", "x2": 5, "y": 50, "c":1, "color":"#000"},
        {"x":  "5", "x2": 6, "y": 10, "c":0, "color":"#aaa"}, {"x":  "5", "x2": 6, "y": 10, "c":1, "color":"#000"},
        {"x": "10", "x2": 7, "y": 50, "c":0, "color":"#aaa"}, {"x": "10", "x2": 7, "y": 20, "c":1, "color":"#000"},
        {"x": "20", "x2": 8, "y": 80, "c":0, "color":"#aaa"}, {"x": "20", "x2": 8, "y": 80, "c":1, "color":"#000"},
        {"x": "30", "x2": 9, "y": 20, "c":0, "color":"#aaa"}, {"x": "30", "x2": 9, "y": 20, "c":1, "color":"#000"}],
      "transform": [
        {
          "type": "stack",
          "groupby": ["x2"],
          "field": "y"
        }
      ]
    }
  ],

  "scales": [
    {
      "name": "x",
      "type": "point",
      "range": "width",
      "domain": {"data": "table", "field": "x"}
    },
    {
      "name": "x2",
      "type": "point",
      "range": "width",
      "domain": {"data": "table", "field": "x2"}
    },
    {
      "name": "y",
      "type": "linear",
      "domain": [0,100],
      "range": [{"signal": "height"}, 0],
      "round": true,
      "zero": true,
      "nice": false,
      "bins": {"step": 20}
    }
  ],

  "axes": [
    {"orient": "bottom", "scale": "x", "zindex": 1},
    {"orient": "left", "scale": "y", "zindex": 1}
  ],

  "marks": [
    {
      "type": "group",
      "from": {
        "facet": {
          "name": "series",
          "data": "table",
          "groupby": "c"
        }
      },
      "marks": [
        {
          "type": "area",
          "from": {"data": "series"},
          "encode": {
            "enter": {
              "interpolate": {"value": "monotone"},
              "x": {"scale": "x2", "field": "x2"},
              "y": {"scale": "y", "field": "y0"},
              "y2": {"scale": "y", "field": "y1"},
              "fill": {"signal": "datum.color"}
            }
          }
        }
      ]
    }
  ]
}

Solution

  • Here's one way. Add negative signs to the numbers that are supposed to appear on the left and then remove them in the axis.

    enter image description here

    {
      "$schema": "https://vega.github.io/schema/vega/v5.json",
      "description": "A basic stacked area chart example.",
      "width": 450,
      "height": 200,
      "padding": 5,
      "data": [
        {
          "name": "table",
          "values": [
            {"x": "-50", "x2": 0, "y": 20, "c": 0, "color": "#aaa"},
            {"x": "-50", "x2": 0, "y": 20, "c": 1, "color": "#000"},
            {"x": "-40", "x2": 1, "y": 40, "c": 0, "color": "#aaa"},
            {"x": "-40", "x2": 1, "y": 40, "c": 1, "color": "#000"},
            {"x": "-30", "x2": 2, "y": 70, "c": 0, "color": "#aaa"},
            {"x": "-30", "x2": 2, "y": 70, "c": 1, "color": "#000"},
            {"x": "-20", "x2": 3, "y": 80, "c": 0, "color": "#aaa"},
            {"x": "-20", "x2": 3, "y": 80, "c": 1, "color": "#000"},
            {"x": "-10", "x2": 4, "y": 50, "c": 0, "color": "#aaa"},
            {"x": "-10", "x2": 4, "y": 50, "c": 1, "color": "#000"},
            {"x": "0", "x2": 5, "y": 50, "c": 0, "color": "#aaa"},
            {"x": "0", "x2": 5, "y": 50, "c": 1, "color": "#000"},
            {"x": "5", "x2": 6, "y": 10, "c": 0, "color": "#aaa"},
            {"x": "5", "x2": 6, "y": 10, "c": 1, "color": "#000"},
            {"x": "10", "x2": 7, "y": 50, "c": 0, "color": "#aaa"},
            {"x": "10", "x2": 7, "y": 20, "c": 1, "color": "#000"},
            {"x": "20", "x2": 8, "y": 80, "c": 0, "color": "#aaa"},
            {"x": "20", "x2": 8, "y": 80, "c": 1, "color": "#000"},
            {"x": "30", "x2": 9, "y": 20, "c": 0, "color": "#aaa"},
            {"x": "30", "x2": 9, "y": 20, "c": 1, "color": "#000"}
          ],
          "transform": [{"type": "stack", "groupby": ["x2"], "field": "y"}]
        }
      ],
      "scales": [
        {
          "name": "x",
          "type": "point",
          "range": "width",
          "domain": {"data": "table", "field": "x"}
        },
        {
          "name": "x2",
          "type": "point",
          "range": "width",
          "domain": {"data": "table", "field": "x2"}
        },
        {
          "name": "y",
          "type": "linear",
          "domain": [0, 100],
          "range": [{"signal": "height"}, 0],
          "round": true,
          "zero": true,
          "nice": false,
          "bins": {"step": 20}
        }
      ],
      "axes": [
        {"orient": "bottom", "scale": "x", "zindex": 1,
        "encode": {
            "labels": {
              "update": {
                "text": {"signal": "substring(datum.label,0,1) =='-'?substring(datum.label,1):datum.label"}
              }
            }
          }
        
        },
        {"orient": "left", "scale": "y", "zindex": 1}
      ],
      "marks": [
        {
          "type": "group",
          "from": {"facet": {"name": "series", "data": "table", "groupby": "c"}},
          "marks": [
            {
              "type": "area",
              "from": {"data": "series"},
              "encode": {
                "enter": {
                  "interpolate": {"value": "monotone"},
                  "x": {"scale": "x2", "field": "x2"},
                  "y": {"scale": "y", "field": "y0"},
                  "y2": {"scale": "y", "field": "y1"},
                  "fill": {"signal": "datum.color"}
                }
              }
            }
          ]
        }
      ]
    }