ASP.NET MVC

Dynamic Am-Charts In ASP.NET MVC

Here, we will learn about creating dynamic amcharts in ASP.NET MVC 5. Charts are very useful for seeing how much work is done in any place in a short time of period.

Prerequisites

  • Basic knowledge of jQuery.
  • Data from which we can generate the charts.

Create a new project in ASP.NET MVC.

We are going to use the following jQuery libraries provided by amCharts.

<script src="https://www.amcharts.com/lib/4/core.js"></script>
<script src="https://www.amcharts.com/lib/4/charts.js"></script>
<script src="https://www.amcharts.com/lib/4/plugins/forceDirected.js"></script>
<script src="https://www.amcharts.com/lib/4/themes/animated.js"></script>

We are going to use the dummy API for the chart data.

https://api.myjson.com/bins/zg8of

Open the View -> Home -> Index.cshtml and write the code for generating the chart.

@{
    ViewBag.Title = "Home Page";
}

<div id="chartData"></div>
@Scripts.Render("~/bundles/jquery")
<script src="https://www.amcharts.com/lib/4/core.js"></script>
<script src="https://www.amcharts.com/lib/4/charts.js"></script>
<script src="https://www.amcharts.com/lib/4/plugins/forceDirected.js"></script>
<script src="https://www.amcharts.com/lib/4/themes/animated.js"></script>

<script>
    $(document).ready(function () {
        $.ajax({
            url: 'https://api.myjson.com/bins/zg8of',
            method: 'GET',
            success: function (data) {
                generateChart(data);
            },
            error: function (err) {
                alert("Unable to display chart. Something went wrong.");
            }
        });
        function generateChart(data, iteration = 0) {
            var dates = [];
            var newData = [];
            var gr = [];
            function groupBy(array, f) {
                var groups = {};
                array.forEach(function (o) {
                    var group = JSON.stringify(f(o));
                    groups[group] = groups[group] || [];
                    groups[group].push(o);
                });
                return Object.keys(groups).map(function (group) {
                    return groups[group];
                })
            }
            var result = groupBy(data, function (item) {
                return ([item.Name]);
            });
            $.each(result, function (a, b) {
                var d1 = b.map(function (i) {
                    return i.Month;
                });
                $.extend(true, dates, d1);
            });

            $.each(dates, function (a, b) {
                var item = { sales_figure: b };
                $.each(result, function (i, c) {
                    el = c.filter(function (e) {
                        return e.Month == b;
                    });
                    if (el && el.length > 0) {
                        item[c[i].Name.toUpperCase()] = el[0].Sales_Figure;
                        if (gr.filter(function (g) {
                            return g == c[i].Name.toUpperCase();
                        }).length <= 0) {
                            gr.push(c[i].Name.toUpperCase());
                        }
                    }
                });
                if (Object.keys(item).length > 1)
                    newData.push(item);
            });

            $chartData = $('#chartData');

            var am_el = $('<div id="dc-' + iteration + '" class="col-md-12 col-xs-12 card-item">');
            am_el.append($('<div class="lgnd col-md-12 col-xs-12 bb2"><div id="l-' + iteration + '" class="col-md-12 col-xs-12"></div></div>'));
            am_el.append($('<div id="c-' + iteration + '" class="col-md-12 col-xs-12"  style="min-height:250px ;   margin-left: -8px;">'));
            $chartData.html(am_el);

            var chart = am4core.create("c-" + iteration, am4charts.XYChart);
            am4core.options.minPolylineStep = Math.ceil(newData.length / 50);
            am4core.options.commercialLicense = true;
            am4core.animationDuration = 0;
            chart.data = newData;

            var categoryAxis = chart.xAxes.push(new am4charts.CategoryAxis());
            categoryAxis.dataFields.category = "sales_figure";
            categoryAxis.renderer.minGridDistance = 70;
            categoryAxis.fontSize = 12;

            var valueAxis = chart.yAxes.push(new am4charts.ValueAxis());
            valueAxis.fontSize = 12;
            valueAxis.title.text = "Sales Figure";

            chart.legend = new am4charts.Legend();
            chart.legend.position = "top";
            chart.legend.fontSize = 12;

            var markerTemplate = chart.legend.markers.template;
            markerTemplate.width = 10;
            markerTemplate.height = 10;

            var legendContainer = am4core.create("l-" + iteration, am4core.Container);
            legendContainer.width = am4core.percent(100);
            chart.legend.parent = legendContainer;

            var legendDiv = document.getElementById("l-" + iteration);
            function resizeLegendDiv() {
                legendDiv.style.height = chart.legend.measuredHeight + "px";
                legendDiv.style.overflow = "hidden";
            }

            chart.legend.events.on('inited', resizeLegendDiv);

            chart.colors.list = [am4core.color("#0D8ECF"), am4core.color("#FF6600"), am4core.color("#FCD202"), am4core.color("#B0DE09"), am4core.color("#2A0CD0"), am4core.color("#CD0D74"), am4core.color("#CC0000"), am4core.color("#00CC00"), am4core.color('#ffd8b1'), am4core.color("#990000"), am4core.color('#4363d8'), am4core.color('#e6194b'), am4core.color('#3cb44b'), am4core.color('#ffe119'), am4core.color('#f58231'), am4core.color('#911eb4'), am4core.color('#46f0f0'), am4core.color('#f032e6'), am4core.color('#bcf60c'), am4core.color('#fabebe'), am4core.color('#008080'), am4core.color('#e6beff'), am4core.color('#9a6324'), am4core.color('#fffac8'), am4core.color('#800000'), am4core.color('#aaffc3'), am4core.color('#808000'), am4core.color('#ffd8b1'), am4core.color('#000075')]

            $.each(gr, function (l, d) {

                var series = chart.series.push(new am4charts.LineSeries());
                series.dataFields.valueY = d;
                series.name = d;
                series.dataFields.categoryX = "sales_figure";
                series.tooltipText = "{name}: [bold]{valueY}[/]";
                series.strokeWidth = 2;
                series.minBulletDistance = 30;
                series.tensionX = 0.7;
                series.legendSettings.labelText = "[bold]" + "{name}";

                var bullet = series.bullets.push(new am4charts.CircleBullet());
                bullet.circle.strokeWidth = 2;
                bullet.circle.radius = 3;
                bullet.circle.fill = am4core.color("#fff");

                var bullethover = bullet.states.create("hover");
                bullethover.properties.scale = 1.2;
                chart.cursor = new am4charts.XYCursor();
                chart.cursor.behavior = "panXY";
                chart.cursor.snapToSeries = series;

            });

            chart.scrollbarX = new am4core.Scrollbar();
            chart.scrollbarX.parent = chart.bottomAxesContainer;
        }
    });
</script>

Output:

You can download the source code from here.
Please give your valuable feedback/comments/questions about this article. Please let me know how you like and understand this article and how I could improve it.
Faisal Pathan

Faisal Pathan is a founder of TheCodeHubs, .NET Project Manager/Team Leader, and C# Corner MVP. He has extensive experience with designing and developing enterprise-scale applications. He has good skills in ASP.NET C#, ASP.NET Core, ASP.NET MVC, AngularJS, Angular, React, NodeJS, Amazon S3, Web API, EPPlus, Amazon MWS, eBay Integration, SQL, Entity Framework, JavaScript, eCommerce Integration like Walmart, Tanga, Newegg, Group-on Store, etc. and Windows services.

Share
Published by
Faisal Pathan

Recent Posts

Testing hk

Testing

2 years ago

Create and Used PIPE in angular

In this article, we have to show Create and Used PIPE in angular

2 years ago

Operation

Testing

2 years ago

Create and Used PIPE in angular

In this article, we have to show Create and Used PIPE in angular

2 years ago

Create and Used PIPE in angular

In this article, we have to show Create and Used PIPE in angular

2 years ago

TETS NEW

test

3 years ago