Forum Discussion

ShivGC's avatar
ShivGC
Helper I
3 years ago
Solved

Deneb Visual Zooming

Hi, 

I required some help with making my non-linear regression graph, zoom-able. 

I am using the deneb visual app on power bi and I have managed to create a scatterplot using the X Field and Y field values (just removed names for simplicity), and colour coded it using my own selected colours that adapt based on client selection. 

However, I now want to make it so that this visual is able to be zoomable as I have seen this feature around the internet. Due to my lack of coding knoweldge especially around the vegalite language, I am struggling to this. Is it possible someone could help me integerate the zoomable feature into my code below (which works completely fine already, just without being able to zoom)?

Please do break down any changes made, as I am a beginner in code and have very little experience currently. Thank you 🙂

For additional background:

In power bi, three categories have been added into the values selection box which are - X FIELD, Y FIELD, CLIENT (formula which allows the colour of the marker to change based on client selection). 

Code currently working:

 

 

 

 

 

{
  "data": {"name": "dataset"},
  "layer": [
    {
      "mark": {
        "type": "point",
        "filled": true
      },
      "encoding": {
        "x": {
          "field": "X FIELD",
          "type": "quantitative",
          "axis": {"format" : "%"}
        },
        "y": {
          "field": "Y FIELD",
          "type": "quantitative",
          "axis": {"format" : "%"}
        },
        "color": {"field": "CLIENT", "type": "nominal", "legend": null, "scale": {"range":["#006D9E", "#A6E2EF"]}}
      }
    },
    {
      "mark": {
        "type": "line",
        "color": "black"
      },
      "transform": [
        {
          "regression": "Y FIELD",
          "on": "X FIELD",
          "method" : "pow"
        }
      ],
      "encoding": {
        "x": {
          "field": "X FIELD",
          "type": "quantitative"
        },
        "y": {
          "field": "Y FIELD",
          "type": "quantitative"
        }
      }
    },
    {
      "transform": [
        {
          "regression": "Y FIELD",
          "on": "X FIELD",
          "params": true,
          "method" : "pow"
        },
        {"calculate": "'R²: '+format(datum.rSquared, '.2f')", "as": "R2"}
      ],
      "mark": {
        "type": "text",
        "color": "Orange",
        "fontSize" : 16,
        "fontWeight" : "bold",
        "x": "width",
        "align": "right",
        "y": -5
      },
      "encoding": {
        "text": {"type": "nominal", "field": "R2"}
      }
    }
  ]
}

 

 

 

 

 

  • I have Figured out the solution to this and will paste the code below for anyone who would like to try mimic this.

    Essentially, you are able to make a regression graph and make it zoomable but you just have to code within the same Layer ("layer" function). Please take a look below, at the code:

    {
      "data": {"name": "dataset"},
      "layer": [
        {
          "mark": {
            "type": "point",
            "filled": true
          },
          "encoding": {
            "x": {
              "field": "X FIELD",
              "type": "quantitative",
              "axis": {"format": "%"}
            },
            "y": {
              "field": "Y FIELD",
              "type": "quantitative",
              "axis": {"format": "%"}
            },
            "color": {
              "field": "CLIENT COLOUR FIELD - IF THIS IS NOT APPLICABLE TO YOU, PLEASE TAKE IT OUT",
              "type": "nominal",
              "legend": null,
              "scale": {
                "range": [
                  "#006D9E",
                  "#A6E2EF"
                ]
              }
            }
          }
        },
        {
          "mark": {
            "type": "line",
            "color": "black"
          },
          "transform": [
            {
              "regression": "Y FIELD",
              "on": "X FIELD",
              "method": "pow"
            }
          ],
          "encoding": {
            "x": {
              "field": "X FIELD",
              "type": "quantitative"
            },
            "y": {
              "field": "Y FIELD",
              "type": "quantitative"
            }
          }
        },
        {
          "transform": [
            {
              "regression": "Y FIELD",
              "on": "X FIELD",
              "params": true,
              "method": "pow"
            }
          ],
          "mark": "circle",
          "encoding": {
            "x": {
              "field": "X FIELD",
              "type": "quantitative"
            },
            "y": {
              "field": "Y FIELD",
              "type": "quantitative"
            }
          },
          "params": [
            {
              "name": "grid",
              "select": "interval",
              "bind": "scales"
            }
          ]
        }
      ]
    }

     

5 Replies

  • Hi , ShivGC 

    According to your description, you want to zoom in the Deneb custom visual . Sorry for i am also unfamilar for this custom visual .

    As searched , it can zoom in and out by using the mouse wheel .And for the code you can refer to :
    Adding Interactive Widgets To Visuals Using Deneb in Power BI | Sandeep Pawar (pawarbi.github.io)

     

    And i also test in my side , this is my test data:

    And we can use this code :

     

    {
      "config": {"view": {"continuousWidth": 400, "continuousHeight": 300}},
      "data": {"name": "dataset"},
      "mark": "circle",
      "encoding": {
        "x": {"type": "quantitative", "field": "X FIELD"},
        "y": {"type": "quantitative", "field": "Y FIELD"}
      },
      "height": 200,
      "selection": {
        "selector016": {
          "type": "interval",
          "bind": "scales",
          "encodings": ["x", "y"]
        }
      },
      "title": "Sactterplot with Widget",
      "width": 100,
      "$schema": "https://vega.github.io/schema/vega-lite/v4.8.1.json"
    }

     

     

     

    Then we can get the result like this:

     

    Thank you for your time and sharing, and thank you for your support and understanding of PowerBI! 

     

    Best Regards,

    Aniya Zhang

    If this post helps, then please consider Accept it as the solution to help the other members find it more quickly

     

      • v-yueyunzh-msft's avatar
        v-yueyunzh-msft
        Community Support

        HI , ShivGC 

        You can try this code if it can help you :

        {
          "$schema": "https://vega.github.io/schema/vega-lite/v5.json",
          "data": {"url": "data/movies.json"},
          "layer": [
            {
              "mark": {"type": "point", "filled": true},
              "encoding": {
                "x": {"field": "Rotten Tomatoes Rating", "type": "quantitative"},
                "y": {"field": "IMDB Rating", "type": "quantitative"}
              },
              "selection": {
            "selector016": {
              "type": "interval",
              "bind": "scales",
              "encodings": ["x", "y"]
            }
          }
            },
            
            {
              "transform": [
                {
                  "regression": "IMDB Rating",
                  "on": "Rotten Tomatoes Rating",
                  "params": true
                },
                {"calculate": "'R²: '+format(datum.rSquared, '.2f')", "as": "R2"}
              ],
              "mark": {
                "type": "text",
                "color": "firebrick",
                "x": "width",
                "align": "right",
                "y": -5
              },
              "encoding": {"text": {"type": "nominal", "field": "R2"}}
            }
          ]
        }

         

        Vega Editor

         

         

        Thank you for your time and sharing, and thank you for your support and understanding of PowerBI! 

         

        Best Regards,

        Aniya Zhang

        If this post helps, then please consider Accept it as the solution to help the other members find it more quickly

  • I have Figured out the solution to this and will paste the code below for anyone who would like to try mimic this.

    Essentially, you are able to make a regression graph and make it zoomable but you just have to code within the same Layer ("layer" function). Please take a look below, at the code:

    {
      "data": {"name": "dataset"},
      "layer": [
        {
          "mark": {
            "type": "point",
            "filled": true
          },
          "encoding": {
            "x": {
              "field": "X FIELD",
              "type": "quantitative",
              "axis": {"format": "%"}
            },
            "y": {
              "field": "Y FIELD",
              "type": "quantitative",
              "axis": {"format": "%"}
            },
            "color": {
              "field": "CLIENT COLOUR FIELD - IF THIS IS NOT APPLICABLE TO YOU, PLEASE TAKE IT OUT",
              "type": "nominal",
              "legend": null,
              "scale": {
                "range": [
                  "#006D9E",
                  "#A6E2EF"
                ]
              }
            }
          }
        },
        {
          "mark": {
            "type": "line",
            "color": "black"
          },
          "transform": [
            {
              "regression": "Y FIELD",
              "on": "X FIELD",
              "method": "pow"
            }
          ],
          "encoding": {
            "x": {
              "field": "X FIELD",
              "type": "quantitative"
            },
            "y": {
              "field": "Y FIELD",
              "type": "quantitative"
            }
          }
        },
        {
          "transform": [
            {
              "regression": "Y FIELD",
              "on": "X FIELD",
              "params": true,
              "method": "pow"
            }
          ],
          "mark": "circle",
          "encoding": {
            "x": {
              "field": "X FIELD",
              "type": "quantitative"
            },
            "y": {
              "field": "Y FIELD",
              "type": "quantitative"
            }
          },
          "params": [
            {
              "name": "grid",
              "select": "interval",
              "bind": "scales"
            }
          ]
        }
      ]
    }