Vega and uplot

Posted on October 2, 2021
Tags: javascript
<!DOCTYPE html>
<html>
<head>
  <title>uPlot Line Chart Example</title>
  <script src="https://leeoniya.github.io/uPlot/dist/uPlot.iife.min.js"></script>
  <style>
    #chart-container {
      width: 600px;
      height: 400px;
    }
  </style>
  <link rel="stylesheet" href="https://leeoniya.github.io/uPlot/dist/uPlot.min.css">
</head>
<body>
  <div id="chart-container"></div>

  <script>
    // Function to generate random data points
    function generateDataPoint(count) {
      const data = [];

      for (let i = 0; i < count; i++) {
        data.push(Math.random() * 100); // You can modify this to generate data based on your requirements
      }

      return data;
    }

    // Generate data points
    const dataPoints = generateDataPoint(1000); // Change the count as per your requirement
var loop = 10000;

			let data = [
				Array(loop),
				Array(loop),
			];

			for (var i = 0; i < loop; i++) {
				let x = 4 * Math.PI * i / loop;
				let y = Math.sin(x);

				data[0][i] = x;
				data[1][i] = y;
			}
    // Create uPlot line chart
    const opts = {
      width: 600,
      height: 400,
      scales: {
        x: { time: false },
        y: { auto: true }
      },
      series: [
        {},
        {
          label: 'Data Points',
          stroke: 'blue',
          points: { show: true, size: 5 }
        }
      ]
    };
// const data = [dataPoints.map((value, index) => [index, value])]; // Corrected data mapping

    const chart = new uPlot(opts, data, document.getElementById('chart-container'));
  </script>
</body>
</html>

1 Vega-lite Vega-embed

<!DOCTYPE html>
<html>
<head>
  <script src="https://cdn.jsdelivr.net/npm/vega@5"></script>
  <script src="https://cdn.jsdelivr.net/npm/vega-lite@5"></script>
  <script src="https://cdn.jsdelivr.net/npm/vega-embed@6"></script>
</head>

<body>
  <div id="chart"></div>

  <script>
function formatData(jsonData) {
  var formattedData = [];
  var openData = jsonData.open;
  var datetimeData = jsonData.datetime;

  for (var key in openData) {
    if (openData.hasOwnProperty(key) && datetimeData.hasOwnProperty(key)) {
      var dataPoint = {
        x: new Date(datetimeData[key]),
        y: openData[key]
      };

      formattedData.push(dataPoint);
    }
  }

  return formattedData;
}

// Example usage
var jsonData = {
  open: {0: 423, 1: 321, 2: 213},
  datetime: {0: 1644840000000, 1: 1644840060000, 2: 1644840120000},
  high: {0: 500, 1: 430, 2: 400}
};

var formattedData = formatData(jsonData);
console.log(formattedData);


  // import dataj from './assets/ooout4.json' assert { type: 'json' };
  // console.log(dataj)
  
  


function generateDataList(count) {
      var dataList = [];

      for (var i = 0; i <= count; i++) {
        var data = {
          x: i,
          y: Math.floor(Math.random() * 10) * Math.sin(i) // Generates a random number between 0 and 99
        };

        dataList.push(data);
      }

      return dataList;
    }

    var  formattedData  = generateDataList(10000);

    var spec = {
      "$schema": "https://vega.github.io/schema/vega-lite/v5.json",
      "data": {
        "values": formattedData
      },
      "mark": "line",
      "encoding": {
        "x": {"field": "x", "type": "quantitative"},
        "y": {"field": "y", "type": "quantitative"}
      }
    };

    const runit = async () => {
      // const response = await fetch('./assets/ooout4.json')
      // const obj = await response.json()
      // const formattedData1 = formatData(obj);
      
      var spec = {
  "$schema": "https://vega.github.io/schema/vega-lite/v5.json",
  "data": {
    "values": formattedData,
    "transform": [
      {
        "type": "downsample",
        "field": "x",
        "maxbins": 10000 // Adjust the maxbins value to control the number of points displayed
      }
    ]
  },
  "mark": "line",
  "selection": {
    "interval": {
      "type": "interval",
      "bind": "scales",
      "encodings": ["x"],
      "zoom": "wheel[event.deltaY]"
    }
  },
  "encoding": {
    "x": {"field": "x", "type": "quantitative"},
    "y": {"field": "y", "type": "quantitative"}
  },
  "layer": [
        {
          "mark": {"type": "line", "stroke": "steelblue", "strokeWidth": 1.5}
        },
        {
          "selection": {
            "zoom": {
              "type": "interval",
              "bind": "scales",
              "encodings": ["x"],
              "zoomToFit": true
            }
          },
          "mark": {"type": "point", "size": 1, "opacity": 0},
          "encoding": {
            "color": {"value": "transparent"},
            "tooltip": [
              {"field": "x", "type": "quantitative", "title": "X"},
              {"field": "y", "type": "quantitative", "title": "Y"}
            ]
          }
        }
      ]
    };

// var view = new vega.View(vega.parse(spec))
//   .logLevel(vega.Warn) // set view logging level
//   .renderer('svg')     // set render type (defaults to 'canvas')
//   .initialize('#chart') // set parent DOM element
//   .hover();            // enable hover event processing, *only call once*!

// view.runAsync(); // evaluate and render the view
vegaEmbed('#chart', spec);


    }
    runit()
    // vegaEmbed('#chart', spec);
  </script>
</body>
</html>

2 Vega

<!DOCTYPE html>
<html>
<head>
  <script src="https://cdn.jsdelivr.net/npm/vega@5"></script>
  <script src="https://cdn.jsdelivr.net/npm/vega-lite@5"></script>
  <script src="https://cdn.jsdelivr.net/npm/vega-embed@6"></script>
</head>

<body>
  <div id="chart"></div>

  <script>
function formatData(jsonData) {
  var formattedData = [];
  var openData = jsonData.open;
  var datetimeData = jsonData.datetime;

  for (var key in openData) {
    if (openData.hasOwnProperty(key) && datetimeData.hasOwnProperty(key)) {
      var dataPoint = {
        x: new Date(datetimeData[key]),
        y: openData[key]
      };

      formattedData.push(dataPoint);
    }
  }

  return formattedData;
}

// Example usage
var jsonData = {
  open: {0: 423, 1: 321, 2: 213},
  datetime: {0: 1644840000000, 1: 1644840060000, 2: 1644840120000},
  high: {0: 500, 1: 430, 2: 400}
};

var formattedData = formatData(jsonData);
console.log(formattedData);


  // import dataj from './assets/ooout4.json' assert { type: 'json' };
  // console.log(dataj)
  
  


function generateDataList(count) {
      var dataList = [];

      for (var i = 0; i <= count; i++) {
        var data = {
          x: i,
          y: Math.floor(Math.random() * 10) * Math.sin(i) // Generates a random number between 0 and 99
        };

        dataList.push(data);
      }

      return dataList;
    }

    var  formattedData1  = generateDataList(10000);

    const runit = async () => {
      // const response = await fetch('./assets/ooout4.json')
      // const obj = await response.json()
      // const formattedData1 = formatData(obj);
      
      var spec = {
  "$schema": "https://vega.github.io/schema/vega/v5.json",
  "width": 400,
  "height": 200,
  "padding": 5,

  "data": [
    {
      "name": "table",
      "values": [
        {"category": "A", "amount": 28},
        {"category": "B", "amount": 55},
        {"category": "C", "amount": 43},
        {"category": "D", "amount": 91},
        {"category": "E", "amount": 81},
        {"category": "F", "amount": 53},
        {"category": "G", "amount": 19},
        {"category": "H", "amount": 87}
      ]
    }
  ],

  "signals": [
    {
      "name": "tooltip",
      "value": {},
      "on": [
        {"events": "rect:mouseover", "update": "datum"},
        {"events": "rect:mouseout",  "update": "{}"}
      ]
    }
  ],

  "scales": [
    {
      "name": "xscale",
      "type": "band",
      "domain": {"data": "table", "field": "category"},
      "range": "width",
      "padding": 0.05,
      "round": true
    },
    {
      "name": "yscale",
      "domain": {"data": "table", "field": "amount"},
      "nice": true,
      "range": "height"
    }
  ],

  "axes": [
    { "orient": "bottom", "scale": "xscale" },
    { "orient": "left", "scale": "yscale" }
  ],

  "marks": [
    {
      "type": "rect",
      "from": {"data":"table"},
      "encode": {
        "enter": {
          "x": {"scale": "xscale", "field": "category"},
          "width": {"scale": "xscale", "band": 1},
          "y": {"scale": "yscale", "field": "amount"},
          "y2": {"scale": "yscale", "value": 0}
        },
        "update": {
          "fill": {"value": "steelblue"}
        },
        "hover": {
          "fill": {"value": "red"}
        }
      }
    },
    {
      "type": "text",
      "encode": {
        "enter": {
          "align": {"value": "center"},
          "baseline": {"value": "bottom"},
          "fill": {"value": "#333"}
        },
        "update": {
          "x": {"scale": "xscale", "signal": "tooltip.category", "band": 0.5},
          "y": {"scale": "yscale", "signal": "tooltip.amount", "offset": -2},
          "text": {"signal": "tooltip.amount"},
          "fillOpacity": [
            {"test": "isNaN(tooltip.amount)", "value": 0},
            {"value": 1}
          ]
        }
      }
    }
  ]
}


var view = await new vega.View(vega.parse(spec), {
    logLevel:  vega.Warn, // view logging level
    renderer:  'canvas',     // render type (defaults to 'canvas')
    container: '#chart',   // parent DOM element
    hover:     true       // enable hover event processing
  })          // evaluate and render the view
view.runAsync();
// vegaEmbed('#chart', spec);


    }
    runit()
    // vegaEmbed('#chart', spec);
  </script>
</body>
</html>