# Jupyter -\> Vega -\> Kibana Visualization Error

**URL:** <https://discuss.elastic.co/t/jupyter-vega-kibana-visualization-error/321264>\
**Category:** Kibana\
**Tags:** vega\
**Created:** [December 15, 2022, 7:14am UTC](https://discuss.elastic.co/t/jupyter-vega-kibana-visualization-error/321264 "2022-12-15T07:14:37Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![vikram\_singh](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/vikram_singh/32/66490_2.png) [@vikram\_singh](https://discuss.elastic.co/u/vikram_singh)\
**Post date:** [December 15, 2022, 7:14am UTC](https://discuss.elastic.co/t/jupyter-vega-kibana-visualization-error/321264/1 "2022-12-15T07:14:37Z")

</div>

Hi,  
I want to visualize data from jupyter to Vega to Kibana.  
I got a reference [How to bring Jupyter Notebook visualizations to Kibana dashboards for data science | Elastic Blog](https://www.elastic.co/blog/how-to-jupyter-notebook-visualizations-kibana-dashboards-vega-data-science)

and [GitHub - walterra/jupyter2kibana: A Workflow for Data Scientists to bring Jupyter Notebook Visualizations to Kibana Dashboards](https://github.com/walterra/jupyter2kibana)

But it is not working.

So finally, I found this

[Jupyter -\> Vega -\> Kibana visualization (without disabling security). How? - Elastic Stack / Kibana - Discuss the Elastic Stack](https://discuss.elastic.co/t/jupyter-vega-kibana-visualization-without-disabling-security-how/301899/2)

But I did not understand in KIBANA visualization api.  
I am implementing it into mylocal computer without elasticsearch version 8.4.1 and I disabled login security in elasticsearch.yml.  
When I used below code into jupyter to send visualization to kibana.

```auto
    import eland as ed
    import datetime
    import altair as alt
    import eland as ed
    import json
    import numpy as np
    import matplotlib.pyplot as plt
    import vega_datasets
    from elasticsearch import Elasticsearch
    
    #cloud_id = "secret"
    #http_auth = ("username", "password")
    #es = Elasticsearch(cloud_id=cloud_id, http_auth=http_auth)
    es=Elasticsearch(["http://localhost:9200"])
    data = vega_datasets.data
    pd_df = data.cars()
    
    
    url = 'http://localhost:9200/pandas_to_eland/_search?size=1000'
    #print(url)
    url_data = alt.Data(url=url, format=alt.DataFormat(property='hits.hits',type='json'))

    fields = ed_df.columns

    rename_dict = dict((a, 'datum._source.'+a) for a in fields)

    chart = alt.Chart(url_data).transform_calculate(**rename_dict).mark_circle(size=8).encode(
        alt.X(alt.repeat("column"), type='quantitative'),
        alt.Y(alt.repeat("row"), type='quantitative'),
        color='Origin:N'
    ).properties(
        width=150,
        height=150
    ).repeat(
        row=['Horsepower',],
        column=['Miles_per_Gallon']
    ).interactive()

    chart

    
    def saveVegaVis(client, index, visName, altairChart, resultSize=100, timeField=True):
        chart_json = json.loads(altairChart.to_json())
        visState = {
          "type": "vega",
          "aggs": [],
          "params": {
            "spec": json.dumps(chart_json, sort_keys=True, indent=4, separators=(',', ': ')),
          },
          "title": visName
        }
        visSavedObject={
            #"visualization" : {
              "title" : visName,
              "visState" : json.dumps(visState, sort_keys=True, indent=4, separators=(',', ': ')),
              "uiStateJSON" : "{}",
              "description" : "",
              "version" : 1,
              "kibanaSavedObjectMeta" : {
                "searchSourceJSON" : json.dumps({
                  "query": {
                    "language": "kuery",
                    "query": ""
                  },
                  "filter": []
                }),
              }
            #},
            #"type" : "visualization",
            #"references" : [],
            #"migrationVersion" : {
            # "visualization" : "8.0.0"
            #},
            #"updated_at" : datetime.datetime.now().strftime("%Y-%m-%dT%H:%M:%S.000Z")
        }
        import requests
        myurl = 'http://localhost:5601/api/saved_objects/visualization'
        headers = {
            'kbn-xsrf' : 'true',
            'Content-Type' : 'application/json'
        }
        x = requests.post(myurl, data=json.dumps(visSavedObject), headers=headers)
        print(x.text)
    
    
        #return client.index(index=index,id='visualization:'+visName,body=visSavedObject)
    
    saveVegaVis(es, 'test_visuals', 'def-vega-cars-1', chart, resultSize=1000)

```

It gives me an error

```auto
{"statusCode":400,"error":"Bad Request","message":"[request body.attributes]: expected value of type [object] but got [undefined]"}

```

I did not understand what is happening.  
Kindly help me on this issue.

Thanks in advance,  
Vikram Singh

---

<div class="post-metadata">

**Author:** ![vikram\_singh](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/vikram_singh/32/66490_2.png) [@vikram\_singh](https://discuss.elastic.co/u/vikram_singh)\
**Post date:** [December 19, 2022, 4:37am UTC](https://discuss.elastic.co/t/jupyter-vega-kibana-visualization-error/321264/2 "2022-12-19T04:37:09Z")

</div>

Hi Elastic Community,  
Has anyone implemented this type visualization.

---

<div class="post-metadata">

**Author:** ![vikram\_singh](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/vikram_singh/32/66490_2.png) [@vikram\_singh](https://discuss.elastic.co/u/vikram_singh)\
**Post date:** [January 4, 2023, 4:35am UTC](https://discuss.elastic.co/t/jupyter-vega-kibana-visualization-error/321264/3 "2023-01-04T04:35:07Z")

</div>

Hi,  
Any solution!

---

<div class="post-metadata">

**Author:** ![walterra](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/walterra/32/139867_2.png) [@walterra](https://discuss.elastic.co/u/walterra)\
**Post date:** [January 13, 2023, 1:42pm UTC](https://discuss.elastic.co/t/jupyter-vega-kibana-visualization-error/321264/4 "2023-01-13T13:42:52Z")

</div>

Thanks for holding out! The referenced Jupyter Notebooks were a bit outdated unfortunately.

They were writing to the `.kibana` index directly which is no longer recommended/supported.

I updated the first notebook to make use of the Kibana API with support for authentication and using the endpoint to create a visualization: [jupyter2kibana/viz-1a-flights-histogram.ipynb at master · walterra/jupyter2kibana · GitHub](https://github.com/walterra/jupyter2kibana/blob/master/viz-1a-flights-histogram.ipynb)

I'm reposting the Jupyter Notebook cells here that create the Kibana visualization, note they do not work stand-alone but need to be run as part of the whole notebook.

Helper function to save the Vega visualization:

```auto
def saveVegaVis(index, visName, altairChart):
    chart_json = json.loads(altairChart.to_json())
    chart_json['data']['url'] = {
        "%context%": True,
        "index": index,
        "body": { 
            "size": 10000
        }
    }

    visState = {
      "type": "vega",
      "aggs": [],
      "params": {
        "spec": json.dumps(chart_json, sort_keys=True, indent=4, separators=(',', ': ')),
      },
      "title": visName
    }

    visSavedObject={
        "attributes" : {
          "title" : visName,
          "visState" : json.dumps(visState, sort_keys=True, indent=4, separators=(',', ': ')),
          "uiStateJSON" : "{}",
          "description" : "",
          "version" : 1,
          "kibanaSavedObjectMeta" : {
            "searchSourceJSON" : json.dumps({
              "query": {
                "language": "kuery",
                "query": ""
              },
              "filter": []
            }),
          }
        },
    }
    
    return requests.post(
        es_config['kibana_client'] + '/api/saved_objects/visualization/' + visName,
        json=visSavedObject,
        auth=(es_config['user'], es_config['password']),
        headers={"kbn-xsrf":"jupyter2kibana"},
        # Only in development environments with self signed certificates fall back to use `verify=False`
        verify=False
    )

```

Command example to save the Vega visualization:

```auto
saveVegaVis('kibana_sample_data_flights', 'def-vega-1', url_charts)

```

Hope this helps adapting your own code!

---

<div class="post-metadata">

**Author:** ![vikram\_singh](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/vikram_singh/32/66490_2.png) [@vikram\_singh](https://discuss.elastic.co/u/vikram_singh)\
**Post date:** [January 23, 2023, 9:09am UTC](https://discuss.elastic.co/t/jupyter-vega-kibana-visualization-error/321264/5 "2023-01-23T09:09:09Z")

</div>

Thanks for help.  
It solved my problem.

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/elastic/original/3X/1/a/1ac57faf039f6b580b3f104ef42a2a89e41014de.png) [@system](https://discuss.elastic.co/u/system)\
**Post date:** [February 20, 2023, 9:09am UTC](https://discuss.elastic.co/t/jupyter-vega-kibana-visualization-error/321264/6 "2023-02-20T09:09:09Z")

</div>

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.
