Forum Discussion

AdamMG's avatar
AdamMG
Helper I
2 years ago

Vega Lite - scatter plot

Hi Everyone.
Simple question 😉
How in Vega Lite draw line/rule (x=y) on scatterplot chart (basically line in 45 degrees)


8 Replies

  • Find the max x and y values in your data, take the largest, and then add a layer that draws from 0 to that point.

    Here is a simplified version:

     

     

    {
      "layer": [
        {
          "data": {"name": "dataset"},
          "mark": "point",
          "encoding": {
            "y": {
              "field": "y",
              "type": "quantitative"
            },
            "x": {
              "field": "x",
              "type": "quantitative"
            }
          }
        },
        {
          "data": {
            "values": [
              {"x": 0, "y": 0},
              {"x": 4, "y": 4}
            ]
          },
          "mark": {
            "type": "line",
            "from": {"data": "data2"}
          },
          "encoding": {
            "y": {
              "field": "y",
              "type": "quantitative"
            },
            "x": {
              "field": "x",
              "type": "quantitative"
            }
          }
        }
      ]
    }
  • haha.
    Thanks lbendlin 
    I have it already. The biggest problem for me is to find max and put it as field.

    • lbendlin's avatar
      lbendlin
      Super User

      You can do that in DAX, and add it as a column in the Deneb visual.

      • AdamMG's avatar
        AdamMG
        Helper I

        I can but I have like 150k points on the chart. Any additional data will have a huge impact on the performance

    • dm-p's avatar
      dm-p
      Super User

      Hi AdamMG,


      If you just want to draw a line across the width/height of the visible view, you can do something like this, where you create a layer with a simple, empty dataset (like the fixed line example) :

      {
        "$schema": "https://vega.github.io/schema/vega-lite/v5.json",
        "data": {"url": "data/cars.json"},
        "layer": [
          {
            "data": {"values": [{}]},
            "mark": "rule",
            "encoding": {
              "x": {"value": 0},
              "x2": {"value": "width"},
              "y": {"value": "height"},
              "y2": {"value": 0}
            }
          },
          {
            "mark": "point",
            "encoding": {
              "x": {"field": "Horsepower"},
              "y": {"field": "Miles_per_Gallon"}
            }
          }
        ],
        "encoding": {"x": {"type": "quantitative"}, "y": {"type": "quantitative"}}
      }

      Link to sample specification

       

      You could also use the expression language to interrogate the assigned scale domains, e.g.:

      {
        "$schema": "https://vega.github.io/schema/vega-lite/v5.json",
        "data": {"url": "data/cars.json"},
        "layer": [
          {
            "data": {"values": [{}]},
            "mark": "rule",
            "encoding": {
              "x": {"datum": {"expr": "domain('x')[0]"}},
              "x2": {"datum": {"expr": "domain('x')[1]"}},
              "y": {"datum": {"expr": "domain('y')[0]"}},
              "y2": {"datum": {"expr": "domain('y')[1]"}}
            }
          },
          {
            "mark": "point",
            "encoding": {
              "x": {"field": "Horsepower"},
              "y": {"field": "Miles_per_Gallon"}
            }
          }
        ],
        "encoding": {"x": {"type": "quantitative"}, "y": {"type": "quantitative"}}
      }

       

      Link to sample specification


      If you want to do something fancier with the range of data for each encoding channel, this may be possible but would require a sample of your dataset to ensure that I could come up with an optimal approach. If you're not able to share, you might be able to consider an aggregate transform, to find the min/max of each series and plot based on those, or possibly a regression transform may be an option.

       

      Hopefully, some of this may help you come up with more ideas. And thanks very much for trying Deneb!

       

      Regards,

       

      Daniel

      • AdamMG's avatar
        AdamMG
        Helper I

        Hi dm-p 
        Thank you very much.
        Your solution is very good but not good for my chart.
        I need to pan and zoom the scatterplot and your solution does not reflect this.