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>
-container {
#chartwidth: 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++) {
.push(Math.random() * 100); // You can modify this to generate data based on your requirements
data
}
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);
0][i] = x;
data[1][i] = y;
data[
}// 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]
;
}
.push(dataPoint);
formattedData
}
}
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
;
}
.push(data);
dataList
}
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]
;
}
.push(dataPoint);
formattedData
}
}
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
;
}
.push(data);
dataList
}
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
}) .runAsync();
view// vegaEmbed('#chart', spec);
}runit()
// vegaEmbed('#chart', spec);
</script>
</body>
</html>