uPlot icon indicating copy to clipboard operation
uPlot copied to clipboard

really like uPlot but how to get it to work properly

Open UltimateSolar opened this issue 2 years ago • 3 comments

Hello,

pretty new to this, why does this not plot evenly X-D

on the X axis there shall be time dates like YYYY-MM-DD and time HH:MM:SS

on the Y axis there shall be watts

really like the zoom functionality and the dark theme :D

and the MIT licencing as it is used for Open Source

<!doctype html>
<html>
	<head>
		<meta charset="utf-8">
		<title>Line Paths</title>
		<meta name="viewport" content="width=device-width, initial-scale=1">

		<link rel="stylesheet" href="css/uPlot.min.css">
		<style>
			body {
				margin: 0;
				background: #141619;
				color: #c7d0d9;
			}

			.uplot {
				margin-top: 30px;
			}

			.u-select {
				background: rgba(255,255,255,0.07);
			}
		</style>
	</head>
	<body>
		<script src="js/uPlot.iife.js"></script>
		<script>
			const { linear, stepped, bars, spline, spline2 } = uPlot.paths;
/*
			const data = [
			      // x-values (Unix timestamps)
			      [1077519305, 1177519305, 1377519305, 1477519305], 
			      // data series 1  
			      [0.54, 0.15, 3.27, 7.51],
			      // data series 2
			      [12.85, 13.21, 13.65, 14.01],
			      // data series 3
			      [0.52, 1.25, 0.75, 3.62]
			];
*/
			const data = [
			      // x-values (Unix timestamps)
			      [1702213297, 1702213308, 1702213317, 1702213327, 1702213340, 1702213353, 1702213367, 1702213382, 1702213395, 1702213408, 1702213420, 1699939996, 1699940001, 1699940016, 1699940021, 1699940032, 1699940039, 1699940048, 1699940061, 1699940072, 1699940077, 1698645904, 1698645917, 1698645926, 1698645936, 1698645947, 1698645960, 1698645970, 1698645984, 1698645994, 1698646003], 
			      // data series 1  
			      [122, 122, 123, 128, 136, 146, 154, 159, 164, 170, 171, 159, 159, 158, 157, 158, 158, 159, 161, 163, 164, 35, 63, 68, 74, 37, 83, 74, 49, 62, 63], 
			      // data series 2
			      [12.85, 13.21, 13.65, 14.01],
			      // data series 3
			      [0.52, 1.25, 0.75, 3.62]
			];

			// data[0].splice(22, 4, null, null, null, null);

			const lineInterpolations = {
				linear:     0,
				stepAfter:  1,
				stepBefore: 2,
				spline:     3,
			//	spline2:    4,
			};

			const drawStyles = {
				line:      0,
				bars:      1,
				points:    2,
				barsLeft:  3,
				barsRight: 4,
			};

			// generate bar builder with 60% bar (40% gap) & 100px max bar width
/*			const _bars60_100   = bars({size: [0.6, 100]});
			const _bars100Left  = bars({size: [1], align:  1});
			const _bars100Right = bars({size: [1], align: -1});
			const _stepBefore   = stepped({align: -1}); //, ascDesc: true
			const _stepAfter    = stepped({align:  1}); //, ascDesc: true
*/
			const _linear       = linear();
/*			const _spline       = spline(); */
		//	const _spline2      = spline2();

			function paths(u, seriesIdx, idx0, idx1, extendGap, buildClip) {
				let s = u.series[seriesIdx];
				let style = s.drawStyle;
				let interp = s.lineInterpolation;

				let renderer = (
					style == drawStyles.line ? (
						interp == lineInterpolations.linear     ? _linear :
						interp == lineInterpolations.stepAfter  ? _stepAfter :
						interp == lineInterpolations.stepBefore ? _stepBefore :
						interp == lineInterpolations.spline     ? _spline :
					//	interp == lineInterpolations.spline2    ? _spline2 :
						null
					) :
					style == drawStyles.bars ? (
						_bars60_100
					) :
					style == drawStyles.barsLeft ? (
						_bars100Left
					) :
					style == drawStyles.barsRight ? (
						_bars100Right
					) :
					style == drawStyles.points ? (
						() => null
					) : () => null
				);

				return renderer(u, seriesIdx, idx0, idx1, extendGap, buildClip);
			}

			const palette = [
				'#7EB26D', // 0: pale green
				'#EAB839', // 1: mustard
				'#6ED0E0', // 2: light blue
				'#EF843C', // 3: orange
				'#E24D42', // 4: red
				'#1F78C1', // 5: ocean
				'#BA43A9', // 6: purple
				'#705DA0', // 7: violet
				'#508642', // 8: dark green
				'#CCA300', // 9: dark sand
			];

			let cfgs = [
				{
					title: "linear",
					drawStyle: drawStyles.line,
					lineInterpolation: lineInterpolations.linear,
					stroke: "#7EB26D",
				},
			];

			function makeChart(cfg) {
				let opts = {
					width: 2048,
					height: 600,
					title: cfg.title,
					cursor: {
						points: {
							size:   (u, seriesIdx)       => u.series[seriesIdx].points.size * 2.5,
							width:  (u, seriesIdx, size) => size / 4,
							stroke: (u, seriesIdx)       => u.series[seriesIdx].points.stroke(u, seriesIdx) + '90',
							fill:   (u, seriesIdx)       => "#fff",
						},
						sync: {
							key: 0,
						}
					},
					scales: {
						x: {
							time: true,
						//	range: [-10,110],
						//	dir: -1,
						},
					},
					axes: [
						{
							stroke: "#c7d0d9",
						//	font: `12px 'Roboto'`,
						//	labelFont: `12px 'Roboto'`,
							grid: {
								width: 1 / devicePixelRatio,
								stroke: "#2c3235",
							},
							ticks: {
								width: 1 / devicePixelRatio,
								stroke: "#2c3235",
							}
						},
						{
							stroke: "#c7d0d9",
						//	font: `12px 'Roboto'`,
						//	labelFont: `12px 'Roboto'`,
							grid: {
								width: 1 / devicePixelRatio,
								stroke: "#2c3235",
							},
							ticks: {
								width: 1 / devicePixelRatio,
								stroke: "#2c3235",
							}
						},
					],
					series: [
						{
							label: "Time",
						},
						Object.assign({
							label: "Watts",
							width: 1 / devicePixelRatio,
							drawStyle: drawStyles.points,
							lineInterpolation: null,
							paths,
						}, {
							drawStyle:         cfg.drawStyle,
							lineInterpolation: cfg.lineInterpolation,
							stroke:            cfg.stroke,
							fill:              cfg.stroke + "1A",
						}),
					],
				};

				return new uPlot(opts, data, document.body);
			}

			cfgs.forEach(cfg => {
				makeChart(cfg);
			});
		</script>
		<p>
		Array
(
    [0] => 2023-12-10 USB-QPIGS.log
    [1] => 2023-11-14 USB-QPIGS.log
    [2] => 2023-10-30 USB-QPIGS.log
)
$chart_data_string_date = [1702213297, 1702213308, 1702213317, 1702213327, 1702213340, 1702213353, 1702213367, 1702213382, 1702213395, 1702213408, 1702213420, 1699939996, 1699940001, 1699940016, 1699940021, 1699940032, 1699940039, 1699940048, 1699940061, 1699940072, 1699940077, 1698645904, 1698645917, 1698645926, 1698645936, 1698645947, 1698645960, 1698645970, 1698645984, 1698645994, 1698646003]$chart_data_string_watts = [122, 122, 123, 128, 136, 146, 154, 159, 164, 170, 171, 159, 159, 158, 157, 158, 158, 159, 161, 163, 164, 35, 63, 68, 74, 37, 83, 74, 49, 62, 63]		</p>
	</body>
</html>

thanks for uPlot

UltimateSolar avatar Dec 11 '23 20:12 UltimateSolar

never mind got it to work with chart.js

Edgepath avatar Dec 15 '23 18:12 Edgepath

A point of view .. uplot is much faster than chart.js ..so if you are considering to work with large data .. maybe you can re-give uplot a try

YaminoYuki avatar Feb 13 '24 11:02 YaminoYuki

Hello Yamino,

yes indeed, when those solar energy chart dots accumulate over time (millions and millions) really need to workaround the mass of data 😃

UltimateSolar avatar Feb 13 '24 18:02 UltimateSolar