در این جلسه با ادامه موضوع مربوط به رسم نمودار با 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);
خروجی بصورت زیر هست:
امیدوارم از این مطلب خوشتون اومده باشه.
موفق و پیروز باشید
یا علی
با سلام و عرض احترام
امکانش هست 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/