Posso farlo sembrare più un box plot

Oct 16 2020

Sto lavorando con Elasticsearch che fornisce i dati minimi, massimi, Q1, Q2 e Q3. Tutto quello che devo fare è tracciarlo sotto forma di un box plot. Kibana al momento supporta solo vega-lite versione 2.6.0 e vega 4.3.0.

Ecco un campione completo che ho realizzato.

{
  "$schema": "https://vega.github.io/schema/vega-lite/v2.json",
  "width": 100,
  "height": 200,
  "padding": 10,
 

  "data": {
    "name": "sample",
    "values": [
      {
      "task": "A", 
      "min" : 72.66500091552734,
      "max" : 139.54299926757812,
      "q1" : 98.68599700927734,
      "q2" : 120.12850189208984,
      "q3" : 121.82099914550781
      },
      {
      "task": "B", 
      "min" : 71.66500091552734,
      "max" : 159.54299926757812,
      "q1" : 88.68599700927734,
      "q2" : 110.12850189208984,
      "q3" : 141.82099914550781
      },
      {
      "task": "c", 
      "min" : 45.66500091552734,
      "max" : 169.54299926757812,
      "q1" : 88.68599700927734,
      "q2" : 110.12850189208984,
      "q3" : 141.82099914550781
      }
    ]
  },
  
  "layer": [
    {
      "width": 5,
      "encoding": {
        "x": {"type": "ordinal","field": "task"},
        "y": {"type": "quantitative","field": "min"},
        "y2": {"type": "quantitative","field": "max"},
        "color": {"value": "#2CB5E8"}
      },
      "mark": {
        "type": "bar"
      }
    },
    {
      "width": 20,
      "encoding": {
        "x": {"type": "ordinal","field": "task"},
        "y": {"type": "quantitative","field": "q1"},
        "y2": {"type": "quantitative","field": "q3"},
        "color": {"value": "#EB985E"}
      },
      "mark": "bar"
    },
    {
      "encoding": {
        "x": {"type": "ordinal","field": "task"},
        "y": {"type": "quantitative","field": "q2"},
        "color": {"value": "#090502"}
      },
      "mark": "point"
    }
  ]
}

Ecco come appare la trama:

Ma il box plot assomiglia a questo

L'attuale versione di vega-lite supporta il boxplot. Ma sono bloccato con la versione precedente.

Sto cercando di ridurre la larghezza del grafico a barre per min e max. E mantienilo spesso per Q1 e Q3. In qualche modo non funziona.

Inoltre è possibile tracciare Q2 come una linea piatta invece che come un punto?

Risposte

1 jakevdp Oct 17 2020 at 23:41

È possibile costruire manualmente un grafico a scatole utilizzando un grafico a livelli con una barra, un segno di spunta e un segno di regola. Ad esempio ( visualizza nell'editor ):

{
  "$schema": "https://vega.github.io/schema/vega-lite/v2.json",
  "width": 100,
  "height": 200,
  "data": {
    "name": "sample",
    "values": [
      {
        "task": "A",
        "min": 72.66500091552734,
        "max": 139.54299926757812,
        "q1": 98.68599700927734,
        "q2": 120.12850189208984,
        "q3": 121.82099914550781
      },
      {
        "task": "B",
        "min": 71.66500091552734,
        "max": 159.54299926757812,
        "q1": 88.68599700927734,
        "q2": 110.12850189208984,
        "q3": 141.8209991455078
      },
      {
        "task": "c",
        "min": 45.66500091552734,
        "max": 169.54299926757812,
        "q1": 88.68599700927734,
        "q2": 110.12850189208984,
        "q3": 141.8209991455078
      }
    ]
  },
  "layer": [
    {
      "encoding": {
        "x": {"type": "ordinal", "field": "task"},
        "y": {"type": "quantitative", "field": "min"},
        "y2": {"type": "quantitative", "field": "max"}
      },
      "mark": {"type": "rule", "color": "black"}
    },
    {
      "encoding": {
        "x": {"type": "ordinal", "field": "task"},
        "y": {"type": "quantitative", "field": "q1"},
        "y2": {"type": "quantitative", "field": "q3"}
      },
      "mark": {"type": "bar", "color": "#EB985E", "size": 20}
    },
    {
      "encoding": {
        "x": {"type": "ordinal", "field": "task"},
        "y": {"type": "quantitative", "field": "q2"}
      },
      "mark": {"type": "tick", "color": "gray", "size": 20}
    }
  ]
}