3(I) : Read JSON Data and draw Simple Chart

 

 Data Visualization 

( 3160717 )

Practical and Source Codes



<!DOCTYPE html>
<html lang="en-IN" dir="ltr">

<head>
    <title>Read JSON File to Draw Simple Bar Chart</title>
    <meta charset="utf-8">
    <meta name="author" content="SidPro" />
    <meta name="viewport" content="width=device-width,initial-scale=1.0" />
    <meta name="description" content="Data visualization using javaScript and HTML" />
    <script src="js/jquery-3.5.1.min.js"></script>
    <style>
        #mytable {
            font-family: Arial, Helvetica, sans-serif;
            border-collapse: collapse;
            width: 100%;
        }

        body {
            background: #e4fde1;
        }

        #mytable td,
        #mytable th {
            border: 1px solid #ddd;
            padding: 8px;
        }

        #mytable tr:nth-child(even) {
            background-color: #f2f2f2;
        }

        #mytable tr:hover {
            background-color: #ddd;
        }

        #mytable th {
            padding-top: 12px;
            padding-bottom: 12px;
            text-align: left;
            background-color: cornflowerblue;
            color: white;
        }

        legend {
            float: right;
        }
    </style>
</head>

<body>
    <h1>Get data from JSON file and draw Simple Bar Chart</h1>
    <canvas id="myCanvas" style="background: #2e3340;"></canvas>
    <legend for="myCanvas"></legend>
</body>
<script>
    var myCanvas = document.getElementById("myCanvas");
    myCanvas.width = window.innerWidth - 200;
    myCanvas.height = window.innerHeight - 120;

    var ctx = myCanvas.getContext("2d");

    function drawLine(ctx, startX, startY, endX, endY, color) {
        ctx.save();
        ctx.strokeStyle = color;
        ctx.beginPath();
        ctx.moveTo(startX, startY);
        ctx.lineTo(endX, endY);
        ctx.stroke();
        ctx.restore();
    }

    function drawBar(ctx, upperLeftCornerX, upperLeftCornerY, width, height, color) {
        ctx.save();
        ctx.fillStyle = color;
        ctx.fillRect(upperLeftCornerX, upperLeftCornerY, width, height);
        ctx.restore();
    }


    var Barchart = function (options) {
        this.options = options;
        this.canvas = options.canvas;
        this.ctx = this.canvas.getContext("2d");
        this.colors = options.colors;

        this.draw = function () {
            var maxValue = 0;
            for (var categ in this.options.data) {
                maxValue = Math.max(maxValue, this.options.data[categ]);
            }
            var canvasActualHeight = this.canvas.height - this.options.padding * 2;
            var canvasActualWidth = this.canvas.width - this.options.padding * 2;

            //drawing the grid lines
            var gridValue = 0;
            while (gridValue <= maxValue) {
                var gridY = canvasActualHeight * (1 - gridValue / maxValue) + this.options.padding;
                drawLine(
                    this.ctx,
                    0,
                    gridY,
                    this.canvas.width,
                    gridY,
                    this.options.gridColor
                );

                //writing grid markers
                this.ctx.save();
                this.ctx.fillStyle = this.options.gridColor;
                this.ctx.textBaseline = "bottom";
                this.ctx.font = "bold 10px Arial";
                this.ctx.fillText(gridValue, 10, gridY - 2);
                this.ctx.restore();

                gridValue += this.options.gridScale;
            }

            //drawing the bars
            var barIndex = 0;
            var numberOfBars = Object.keys(this.options.data).length;
            var barSize = (canvasActualWidth) / numberOfBars;

            for (categ in this.options.data) {
                var val = this.options.data[categ];
                var barHeight = Math.round(canvasActualHeight * val / maxValue);
                drawBar(
                    this.ctx,
                    this.options.padding + barIndex * barSize,
                    this.canvas.height - barHeight - this.options.padding,
                    barSize,
                    barHeight,
                    this.colors[barIndex % this.colors.length]
                );

                barIndex++;
            }

            //drawing series name
            this.ctx.save();
            this.ctx.textBaseline = "bottom";
            this.ctx.textAlign = "center";
            this.ctx.fillStyle = "#fff";
            this.ctx.font = "bold 24px Arial";
            this.ctx.fillText(this.options.seriesName, this.canvas.width / 2, this.canvas.height);
            this.ctx.restore();

            //draw legend
            barIndex = 0;
            var legend = document.querySelector("legend[for='myCanvas']");
            var ul = document.createElement("ul");
            legend.append(ul);
            for (categ in this.options.data) {
                var li = document.createElement("li");
                li.style.listStyle = "none";
                li.style.borderLeft = "20px solid " + this.colors[barIndex % this.colors.length];
                li.style.padding = "5px";
                li.textContent = categ;
                ul.append(li);
                barIndex++;
            }
        }
    }
    var myVinyls = {};
    var data;
    $(document).ready(function () {
        $.ajax({
            type: "GET",
            url: "data/regional_sales.json",
            dataType: "json",
            success: jsonParser
        });
    });

    function jsonParser(json) {
        var theData = json.sales.region;
        theData.forEach(function (v) {
            myVinyls[v.territory] = parseInt(v.employees);
        });

        var myBarchart = new Barchart({
            canvas: myCanvas,
            seriesName: "Regional Employees Data",
            padding: 50,
            gridScale: 25,
            gridColor: "#eeeeee",
            data: myVinyls,
            colors: ["#ED553B", "#20639B", "#3CAEA3", "#F6D55C", "#173F5F", "#7D001A"]
        });

        myBarchart.draw();
    }
</script>

</html>






Go Back

No comments:

Get new posts by email:


APY Logo