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

‏  13 دقیقه
۰۷ تیر ۱۳۹۵

در این جلسه با ادامه موضوع مربوط به رسم نمودار با 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/modules/treemap.js"></script>
    <script src="http://code.highcharts.com/modules/heatmap.js"></script>
</head>

<body>
    <div id="container" style="width: 550px; height: 400px; margin: 0 auto"></div>
    <script language="JavaScript">
    $(document).ready(function() {

        var data = {
            "South-East Asia": {
                "Sri Lanka": {
                    "Communicable & other Group I": "75.5",
                    "Injuries": "89.0",
                    "Noncommunicable diseases": "501.2"
                },
                ...
                ...
                ...
                "Republic of Korea": {
                    "Injuries": "53.1",
                    "Communicable & other Group I": "33.8",
                    "Noncommunicable diseases": "302.1"
                }
            }
        };
        var points = [],
            region_p,
            region_val,
            region_i,
            country_p,
            country_i,
            cause_p,
            cause_i,
            cause_name = [];
        cause_name['Communicable & other Group I'] = 'Communicable diseases';
        cause_name['Noncommunicable diseases'] = 'Non-communicable diseases';
        cause_name['Injuries'] = 'Injuries';
        region_i = 0;
        for (var region in data) {
            region_val = 0;
            region_p = {
                id: "id_" + region_i,
                name: region,
                color: Highcharts.getOptions().colors[region_i]
            };
            country_i = 0;
            for (var country in data[region]) {
                country_p = {
                    id: region_p.id + "_" + country_i,
                    name: country,
                    parent: region_p.id
                };
                points.push(country_p);
                cause_i = 0;
                for (var cause in data[region][country]) {
                    cause_p = {
                        id: country_p.id + "_" + cause_i,
                        name: cause_name[cause],
                        parent: country_p.id,
                        value: Math.round(+data[region][country][cause])
                    };
                    region_val += cause_p.value;
                    points.push(cause_p);
                    cause_i++;
                }
                country_i++;
            }
            region_p.value = Math.round(region_val / country_i);
            points.push(region_p);
            region_i++;
        }
        var chart = {
            renderTo: 'container'
        };

        var title = {
            text: 'Global Mortality Rate 2012, per 100 000 population'
        };

        var subtitle: {
            text: 'Click points to drill down. Source: <a href="http://apps.who.int/gho/data/node.main.12?lang=en">WHO</a>.'
        };

        var series = [{
            type: "treemap",
            layoutAlgorithm: 'squarified',
            allowDrillToNode: true,
            dataLabels: {
                enabled: false
            },
            levelIsConstant: false,
            levels: [{
                level: 1,
                dataLabels: {
                    enabled: true
                },
                borderWidth: 3
            }],
            data: points
        }];

        var json = {};
        json.title = title;
        json.series = series;

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

</html>

میبینید که علاوه بر فایل اصلی Highchart، فایلهای treemap.js و heatmap.js قرار داده شده است.

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

var data = {
    "South-East Asia": {
        "Sri Lanka": {
            "Communicable & other Group I": "75.5",
            "Injuries": "89.0",
            "Noncommunicable diseases": "501.2"
        },
        ...
        ...
        ...
        "Republic of Korea": {
            "Injuries": "53.1",
            "Communicable & other Group I": "33.8",
            "Noncommunicable diseases": "302.1"
        }
    }
};

با استفاده از کد بالا اومدیم و همه داده هایی که قراره در نمودار نمایش داده بشن رو وارد کردیم و اونا رو درون ویژگی data قرار دادیم. بدلیل اینکه اطلاعات زیاد بود نشد که همه داده‌ها رو در بالا قرار بدیم و بجای اونا ... قرار دادیم. کل داده‌ها در فایل زیر قرار داده شدن.

بعد از اون با استفاده از کد زیر دسته بندی‌های مورد نیاز برای جداسازی کشورها و قاره‌ها و همچنین دسته هایی که منجر به مرگ و میر شدن، از کد زیر استفاده میکنیم:

var points = [],
    region_p,
    region_val,
    region_i,
    country_p,
    country_i,
    cause_p,
    cause_i,
    cause_name = [];
cause_name['Communicable & other Group I'] = 'Communicable diseases';
cause_name['Noncommunicable diseases'] = 'Non-communicable diseases';
cause_name['Injuries'] = 'Injuries';
region_i = 0;
for (var region in data) {
    region_val = 0;
    region_p = {
        id: "id_" + region_i,
        name: region,
        color: Highcharts.getOptions().colors[region_i]
    };
    country_i = 0;
    for (var country in data[region]) {
        country_p = {
            id: region_p.id + "_" + country_i,
            name: country,
            parent: region_p.id
        };
        points.push(country_p);
        cause_i = 0;
        for (var cause in data[region][country]) {
            cause_p = {
                id: country_p.id + "_" + cause_i,
                name: cause_name[cause],
                parent: country_p.id,
                value: Math.round(+data[region][country][cause])
            };
            region_val += cause_p.value;
            points.push(cause_p);
            cause_i++;
        }
        country_i++;
    }
    region_p.value = Math.round(region_val / country_i);
    points.push(region_p);
    region_i++;
}

میبینید که در ابتدا یک متغیر آرایه بنام points ساختیم و همه اطلاعات بدست اومده رو به اون push و اضافه کردیم. حالا با استفاده از کد زیر اون رو به نمودار معرفی میکنیم.

var series = [{
    type: "treemap",
    layoutAlgorithm: 'squarified',
    allowDrillToNode: true,
    dataLabels: {
        enabled: false
    },
    levelIsConstant: false,
    levels: [{
        level: 1,
        dataLabels: {
            enabled: true
        },
        borderWidth: 3
    }],
    data: points
}];

 

میبینید که نوع نمودار رو برابر با treemap قرار دادیم و الگوریتم کنار هم قرار گرفتن رو بصورت squarified که قبلا توضیح داده شده است، قرار دادیم. درون ویژگی data هم همون آرایه points که حاوی اطلاعات مختلف هست رو قرار دادیم. خروجی بصورت زیر خواهد بود:tree largemap chart

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

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

یا علی

Source

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

جلسات دوره

نیاز به لاگین

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

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

اولین دیدگاه این پست رو تو بنویس !