آموزش رسم نمودار با Highcharts (جلسه 40) - نمودار زاویه ای - قسمت 4

دسته بندی: جاوا اسکریپت
زمان مطالعه: 12 دقیقه
۳۱ خرداد ۱۳۹۵

در این جلسه با ادامه موضوع مربوط به رسم نمودار با Highcharts در خدمتتون هستم. highcharts

نمونه چهارم : نمودار زاویه ای بصورت محور دوتائی

در این نمونه میخایم یک نمونه نمودار رو در اختیارتون قرار بدیم که در اون میتونیم داده‌ها رو به صورت زاویه ای طوری قرار بدیم که دارای محور دوتائی هست و همزمان دو مقدار متفاوت رو نشون میدن. یکی از اونا کیلومتر بر ساعت و دیگری مایل بر ساعت هست. کل کدهای مربوط به این نمونه رو در اختیارتون میزارم و بعد براتون توضیح میدم:

<html>

<head>
    <title>Highcharts Tutorial</title>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
    <script src="http://code.highcharts.com/highcharts.js"></script>
    <script src="http://code.highcharts.com/highcharts-more.js"></script>
</head>

<body>
    <div id="container" style="width: 550px; height: 400px; margin: 0 auto"></div>
    <script language="JavaScript">
    $(document).ready(function() {
        var chart = {
            type: 'gauge',
            plotBackgroundColor: null,
            plotBackgroundImage: null,
            plotBorderWidth: 0,
            plotShadow: false
        };
        var credits = {
            enabled: false
        };

        var title = {
            text: 'Speedometer with dual axes'
        };

        var pane = {
            startAngle: -150,
            endAngle: 150
        };

        // the value axis
        var yAxis = [{
            min: 0,
            max: 200,
            lineColor: '#339',
            tickColor: '#339',
            minorTickColor: '#339',
            offset: -25,
            lineWidth: 2,
            labels: {
                distance: -20,
                rotation: 'auto'
            },
            tickLength: 5,
            minorTickLength: 5,
            endOnTick: false
        }, {
            min: 0,
            max: 124,
            tickPosition: 'outside',
            lineColor: '#933',
            lineWidth: 2,
            minorTickPosition: 'outside',
            tickColor: '#933',
            minorTickColor: '#933',
            tickLength: 5,
            minorTickLength: 5,
            labels: {
                distance: 12,
                rotation: 'auto'
            },
            offset: -20,
            endOnTick: false
        }];

        var series = [{
            name: 'Speed',
            data: [80],
            dataLabels: {
                formatter: function() {
                    var kmh = this.y,
                        mph = Math.round(kmh * 0.621);
                    return '<span style="color:#339">' + kmh + ' km/h</span><br/>' +
                        '<span style="color:#933">' + mph + ' mph</span>';
                },
                backgroundColor: {
                    linearGradient: {
                        x1: 0,
                        y1: 0,
                        x2: 0,
                        y2: 1
                    },
                    stops: [
                        [0, '#DDD'],
                        [1, '#FFF']
                    ]
                }
            },
            tooltip: {
                valueSuffix: ' km/h'
            }
        }];

        var json = {};
        json.chart = chart;
        json.credits = credits;
        json.title = title;
        json.pane = pane;
        json.yAxis = yAxis;
        json.series = series;

        // Add some life
        var chartFunction = function(chart) {
            setInterval(function() {
                var point = chart.series[0].points[0],
                    newVal,
                    inc = Math.round((Math.random() - 0.5) * 20);

                newVal = point.y + inc;
                if (newVal < 0 || newVal > 200) {
                    newVal = point.y - inc;
                }
                point.update(newVal);
            }, 3000);
        };

        $('#container').highcharts(json, chartFunction);
    });
    </script>
</body>

</html>

همونطور که میبینید در این نمونه علاوه بر فایل اصلی highcharts، دو فایل دیگه رو هم وارد کردیم. همچنین دو container قرار دادیم که در یکی از اونا نمودار مربوط به سرعت و در دیگری نمودار مربوط به دور در دقیقه نمایش داده بشه.

میبینید که در ابتدا کدی بصورت زیر قرار داده شده:

var chart = {
   type: 'gauge',
   plotBackgroundColor: null,
   plotBackgroundImage: null,
   plotBorderWidth: 0,
   plotShadow: false
};

با استفاده از این کد، نوع نمودار رو بصورت اندازه گیر قرار دادیم و رنگ نمودار رو حاشیه و سایه رو قرار ندادیم.

var pane = {
   startAngle: -150,
   endAngle: 150
};

با استفاده از کد بالا میایم مشخص میکنیم که محورها و صفحمون از زاویه 150- تا 150 ادامه داره و 300 درجه هست.

var yAxis = [{
   min: 0,
   max: 200,
   lineColor: '#339',
   tickColor: '#339',
   minorTickColor: '#339',
   offset: -25,
   lineWidth: 2,
   labels: {
       distance: -20,
       rotation: 'auto'
   },
   tickLength: 5,
   minorTickLength: 5,
   endOnTick: false
}, {
   min: 0,
   max: 124,
   tickPosition: 'outside',
   lineColor: '#933',
   lineWidth: 2,
   minorTickPosition: 'outside',
   tickColor: '#933',
   minorTickColor: '#933',
   tickLength: 5,
   minorTickLength: 5,
   labels: {
       distance: 12,
       rotation: 'auto'
   },
   offset: -20,
   endOnTick: false
}];

با استفاده از متغیر yAxis محورهای خودمون رو مشخص کردیم. میبینید که دو محور رو مشخص کردیم. نمودار اولی از 0 تا 200 هست و رنگ تیک‌ها و محور رو مشخص کرده. همچنین ضخامت و فاصله و دیگر موارد موجود رو هم مشخص کرده.

var series = [{
   name: 'Speed',
   data: [80],
   dataLabels: {
       formatter: function() {
           var kmh = this.y,
               mph = Math.round(kmh * 0.621);
           return '<span style="color:#339">' + kmh + ' km/h</span><br/>' +
               '<span style="color:#933">' + mph + ' mph</span>';
       },
       backgroundColor: {
           linearGradient: {
               x1: 0,
               y1: 0,
               x2: 0,
               y2: 1
           },
           stops: [
               [0, '#DDD'],
               [1, '#FFF']
           ]
       }
   },
   tooltip: {
       valueSuffix: ' km/h'
   }
}];

با استفاده از متغیر series داده هامون رو قرار دادیم.

var chartFunction = function(chart) {
   setInterval(function() {
       var point = chart.series[0].points[0],
           newVal,
           inc = Math.round((Math.random() - 0.5) * 20);

       newVal = point.y + inc;
       if (newVal < 0 || newVal > 200) {
           newVal = point.y - inc;
       }
       point.update(newVal);
   }, 3000);
};

با استفاده از کد بالا یک setInterval قرار دادیم که هر 3 ثانیه یکبار یک سری کد اجرا شه و نمودار بروزرسانی بشه و نمودار طبیعی‌تر جلوه بده. در هر بار اجرای این کدها یک متغیر تصادفی قرار داده میشه و عقربه نمودار جابجا میشه. در آخر هم کد زیر رو میزاریم و این تابع رو برای نمودار قرار میدیم و اضافه میکنیم:

$('#container').highcharts(json, chartFunction);

خروجی بصورت زیر هست:guage dual axes chart

امیدوارم از این مطلب خوشتون اومده باشه.

موفق و پیروز باشید

یا علی

Source

چه امتیازی به این مقاله می دید؟
نویسنده محمد اسفندیاری
بسیار به طراحی وب علاقمندم و به سرعت در حال یادگیری تمام مباحث پیشرفته هستم و دوست دارم که به دیگران هم یاد بدهم.

جلسات دوره

نظرات کاربران

مریم نوری

با سلام و عرض احترام
امکانش هست HighChart ها رو به صورت دلخواه تغییر داد
مثلا علاوه بر امکانات خودش با کلیک در 2 تا نقطه از چارت اختلاف مقادیر اون 2 نقطه رو نمایش بده؟

مریم نوری

تقریبا ی همچین چیزی ولی با داده خیلی بیشتر از این مد نظرم هست
والبته نیاز دارم این خطوط و tool tip روی صفحه بمونن همچنین آلان فقط برای 2 تا نقطه داده ای پشت سر هم این مقادیر بدست میاد در صورتی که من می خوام هر جای نمودار 2بار کلیک شد این اختلاف برای 2 نقطه محاسبه بشه .

محمد اسفندیاری

فکر نکنم چنین چیزی رو بتونین به سادگی به وجود بیارید و نیاز به مطالعه مستندات و کدنویسی سفارشی دارد
شما میتونین مستندات مربوط به ابزار Highcharts رو مشاهده کنید و این کار رو انجام بدین
https://www.highcharts.com/docs
https://api.highcharts.com/highcharts/
همچنین میتونین نمونه یا Demo های مختلف رو مشاهده کنید و ایده بگیرید
https://www.highcharts.com/demo
موفق باشید

محمد اسفندیاری

این مورد بدردتون میخوره؟
http://jsfiddle.net/bwefs1ak/

نیاز به لاگین

برای ارسال دیدگاه و یا پرسیدن سوال خود در این قسمت، باید در سایت لاگین شوید.