数据可视化玩法:手动选择数据进行展示

手动选择数据进行展示即允许用户在页面上通过选项卡,下拉菜单,单选框,文本框等选择目标对象,并且将该目标对象所对应的相关数据传入图表当中展示出来,最终实现数据交互的效果。
具体例子:分别从两组下拉菜单中选择省份和其对应的城市,当点击确定按钮时,下方图表中将获取该城市对应的数据并生成这两个城市的PM2.5浓度变化折线图。
开发工具:webstorm
可视化工具:echarts
语言:html,css,javascript,jquery库
注意:本例仅涉及前端方面的知识,并不需要搭建后台和数据库。
步骤分析:
1、数据获取。将获取到的省份与城市数据存成对象数组的形式,并存在data.js中。(这里就不摆出具体数据了)

//省份数组
var provinces = [p1,p2,p3...pn];

//省份与对应城市对象数组
var cityMatch = [
{province:p1,city:[c1,c2,c3]},
{province:p2,city:[c4,c5,c6]},
{province:p3,city:[c7,c8,c9]},
...
]

//城市与对应数据对象数组
var cityData = [
{city:c1,data:[d1,d2,d3]},
{city:c2,data:[d4,d5,d6]},
{city:c3,data:[d7,d8,d9]},
...
]

2、构建基本页面与布局,分别建立index.htmlstyle.css文件。记得引入jquery和echarts库文件!

//下拉菜单的实现
<select>
  <option>city1</option>
  <option>city2</option>
  <option>city3</option>
  ...
</select>

//引入两个库
<script type="text/javascript" src="./js/jquery.min.js"></script>
<script type="text/javascript" src="./js/echarts.min.js"></script>

3、编写主要逻辑,并存于文件script.js文件中。

var selectCity,selectProvince,selectData1=[],selectData2=[],selectNameAll=[];
var provinces1 = $("#provinces1");
var provinces2 = $("#provinces2");
var citys1 = $("#citys1");
var citys2 = $("#citys2");
var confirmButton = $("#confirm-button");

$(function(){
    //将省份添加到#provinces下拉菜单中
    appendProvinces(provinces1);
    appendProvinces(provinces2);

    // 匹配省份对应的城市,并添加到#citys下拉菜单中
    provinces1.change(function(){
        appendCitys(provinces1,citys1);
    });
    provinces2.change(function(){
        appendCitys(provinces2,citys2);
    });

    //按确认按钮将数据传入图表中,并刷新图表
    confirmButton.bind("click",function(){
        inputData(citys1,selectData1,selectNameAll);
        inputData(citys2,selectData2,selectNameAll);
        initChart();
    });


    //各个函数定义如下:
    //添加省份
    function appendProvinces(provinces){
        for (var i=0; i<province.length; i++){
            $("<option>" + province[i] +"</option>").appendTo(provinces);
        }
    }
    //添加城市
    function appendCitys(provinces,citys){
        selectProvince = provinces.find("option:selected").text();
        citys.empty();
        for (var i=0; i<cityMatch.length; i++){
            if(cityMatch[i].province == selectProvince){
                for(var j=0; j<cityMatch[i].city.length; j++){
                    $("<option>" + cityMatch[i].city[j] +"</option>").appendTo(citys);
                }
            }
        }
    }
    //传入数据
    function inputData(citys,selectData,selectName) {
        //先将上一次选择的残余数据清空
        selectData.length = 0;
        selectCity = citys.find("option:selected").text();
        for (var i = 0; i < cityData.length; i++) {
            if (cityData[i].city == selectCity) {
                for (var j = 0; j < cityData[i].data.length; j++) {
                    selectData.push(cityData[i].data[j]);
                }
                selectName.push(cityData[i].city);
                break;
            }
        }
    }
    //刷新图表
    function initChart(){
        //由于option.series.name属性的特殊性,图表加载时便设定默认值,所以这里必须手动更改
        option.series[0].name = selectNameAll[0];
        option.series[1].name = selectNameAll[1];
        myChart = echarts.init(document.getElementById('chart-container'));
        myChart.setOption(option);
        //最后将selectNameAll数组清空,等待下次数据传入
        selectNameAll.length = 0;
    }
});

4、图表的使用,并存于chart.js文件中利用echarts这个牛逼的工具实现。要将数据部分换成自己用于存放数据的数组或变量(不能是定值,否则无法传入或更改数据)。

var myChart = echarts.init(document.getElementById('chart-container'));
option = {
    title: {
        text: '城市PM2.5变化'
        //subtext: '纯属虚构'
    },
    tooltip: {
        trigger: 'axis'
    },
    legend: {
        data:selectNameAll
    },
    xAxis:  {
        type: 'category',
        boundaryGap: false,
        data: [d1,d2,d3...dn]
    },
    yAxis: {
        type: 'value',
        axisLabel: {
            formatter: '{value}μg/m3'
        }
    },
    series: [
        {
            name:selectNameAll[0],
            type:'line',
            data:selectData1,
            markLine: {
                data: [
                    {type: 'average', name: '平均值'}
                ]
            }
        },
        {
            name:selectNameAll[1],
            type:'line',
            data:selectData2,
            markLine: {
                data: [
                    {type: 'average', name: '平均值'}
                ]
            }
        }
    ]
};
myChart.setOption(option);

最终效果:


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容