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

35 Views Asked by At

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"}
            }
          }
        }
      ]
    }
  ]
}
1

There are 1 best solutions below

1
davidebacci On BEST ANSWER

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"}
            }
          }
        }
      ]
    }
  ]
}