iOS 使用ECharts實現(xiàn)動態(tài)數(shù)據(jù)+時間坐標軸

最近寫一個項目要實現(xiàn)畫圖将饺,感覺ECharts這個框架里邊的圖效果好一點,所以就用這個插件來實現(xiàn)我得畫圖功能痛黎,我用的是折線圖予弧,想要畫柱狀圖、餅圖等湖饱,官網(wǎng)都有例子掖蛤,以下是我的實現(xiàn)步驟:

1、先用webStorm創(chuàng)建一個index.html井厌;

2坠七、直接進ECharts官網(wǎng):
http://echarts.baidu.com/tutorial.html#5%20分鐘上手%20ECharts)
通過里邊給的幾種方式來獲取 ECharts,我用的是第一種方式直接下載旗笔,將下載下來的echarts.min.js拖入到index所在的文件夾彪置;

屏幕快照.png

3、官網(wǎng)上邊有圖形使用的js的源代碼蝇恶,但是直接拿來用會報錯拳魁,以動態(tài)數(shù)據(jù)+時間坐標軸為例,官網(wǎng)的源代碼是:

function randomData() {
    now = new Date(+now + oneDay);
    value = value + Math.random() * 21 - 10;
    return {
        name: now.toString(),
        value: [
            [now.getFullYear(), now.getMonth() + 1, now.getDate()].join('/'),
            Math.round(value)
        ]
    }
}

var data = [];
var now = +new Date(1997, 9, 3);
var oneDay = 24 * 3600 * 1000;
var value = Math.random() * 1000;
for (var i = 0; i < 1000; i++) {
    data.push(randomData());
}

option = {
    title: {
        text: '動態(tài)數(shù)據(jù) + 時間坐標軸'
    },
    tooltip: {
        trigger: 'axis',
        formatter: function (params) {
            params = params[0];
            var date = new Date(params.name);
            return date.getDate() + '/' + (date.getMonth() + 1) + '/' + date.getFullYear() + ' : ' + params.value[1];
        },
        axisPointer: {
            animation: false
        }
    },
    xAxis: {
        type: 'time',
        splitLine: {
            show: false
        }
    },
    yAxis: {
        type: 'value',
        boundaryGap: [0, '100%'],
        splitLine: {
            show: false
        }
    },
    series: [{
        name: '模擬數(shù)據(jù)',
        type: 'line',
        showSymbol: false,
        hoverAnimation: false,
        data: data
    }]
};

setInterval(function () {

    for (var i = 0; i < 5; i++) {
        data.shift();
        data.push(randomData());
    }

    myChart.setOption({
        series: [{
            data: data
        }]
    });
}, 1000);

以下是改之后可以直接復(fù)制到index.html運行的代碼:

<!DOCTYPE html>    
<html>    
<head>
    <meta charset="utf-8">
    <script type='text/javascript' src='echarts.min.js' charset='utf-8'></script>
  <title>charts</title>
</head>
<body>    
    <div id="main" style="width: 600px;height:400px;"></div>    
    <script type="text/javascript">    
        // 基于準備好的dom撮弧,初始化echarts實例    
        var myChart = echarts.init(document.getElementById('main'));//定義折線圖顯示的位置對象  
        function randomData() {    
            now = new Date(+now + oneDay);    
            value = value + Math.random() * 21 - 10;    
            return {    
                name: now.toString(),     
                value: [    
                    [now.getFullYear(), now.getMonth() + 1, now.getDate()].join('/'),    
                    Math.round(value)    
                ]    
                   
            }    
        }    
            
        var data = [];    
        var now = +new Date(1997, 9, 3);    
        var oneDay = 24 * 3600 * 1000;    
        var value = Math.random() * 1000;    
        for (var i = 0; i < 1000; i++) {    
            data.push(randomData());    
        }    
            
        option = {    
            title: {    
                text: '動態(tài)數(shù)據(jù) + 時間坐標軸'    
            },    
            tooltip: {    
                trigger: 'axis',    
                formatter: function (params) {    
                    params = params[0];    
                    var date = new Date(params.name);    
                    return date.getDate() + '/' + (date.getMonth() + 1) + '/' + date.getFullYear() + ' : ' + params.value[1];    
                },    
                axisPointer: {    
                    animation: false    
                }    
            },    
            xAxis: {    
                type: 'time',    
                splitLine: {    
                    show: false    
                }    
            },    
            yAxis: {    
                type: 'value',    
                boundaryGap: [0, '100%'],    
                splitLine: {    
                    show: false    
                }    
            },    
            series: [{    
                name: '模擬數(shù)據(jù)',    
                type: 'line',    
                showSymbol: false,    
                hoverAnimation: false,    
                data: data    
            }]    
        };    
            
       setInterval(function () {      
            for (var i = 0; i < 5; i++) {    
                data.shift();    
                data.push(randomData());    
            }    
           myChart.setOption(option);  
        }, 1000);    
    </script>    
</body>    
</html>   

4潘懊、開始實現(xiàn)iOS跟html的交互,首先在iOS工程里邊創(chuàng)建WebView用來顯示html贿衍,要掛上代理UIWebViewDelegate

UIWebView *myWebView;

以下是UIWebView加載html頁面的代碼:

- (void)loadChat{

    myWebView = [[UIWebView alloc]initWithFrame:CGRectMake(0, 64, self.view.width, self.view.height)];
    myWebView.scalesPageToFit = YES;
    myWebView.delegate = self;
    [self.view addSubview:myWebView];
    NSString *filePath = [[NSBundle mainBundle]pathForResource:@"index" ofType:@"html"];
    NSString *htmlString = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
    [myWebView loadHTMLString:htmlString baseURL:[NSURL URLWithString:filePath]];
}

以下是UIWebView的代理方法:

//開始加載請求
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{
    return YES;
}
//加載完成
- (void)webViewDidFinishLoad:(UIWebView *)webView{

}

注意在將html文件導(dǎo)入工程的時候要手動導(dǎo)入路徑授舟,不然會找不到路徑

5、在index.html里邊添加與ios交互的方法贸辈,代碼如下:

    var ocValueData = [];
    function setValueData(ocValue) {
        console.log("ocValue"+ocValue);

        for (var i = 0; i < ocValue.length; i++) {
            ocValueData.push(randomData(ocValue[i],5));
        }
        myChart.setOption({
            series: [{
                data: ocValueData
            }]
        });
    }

6释树、iOS傳數(shù)據(jù)到html頁面,我是用定時器生成隨機數(shù)直接傳到html頁面,代碼如下:

- (void)webViewDidFinishLoad:(UIWebView *)webView{

    sendDataArray = [NSMutableArray array];
    [NSTimer scheduledTimerWithTimeInterval:0.15 target:self selector:@selector(action) userInfo:nil repeats:YES];
}

- (void)action{
    sendDataArray = [NSMutableArray array];
    for (int i = 0; i<9; i++) {
        [sendDataArray addObject:@(arc4random()%2500+3000)];
    }
    NSLog(@"sendDataArray:%@",sendDataArray);
    NSString *setValueData = [NSString stringWithFormat:@"setValueData([%@])",[sendDataArray componentsJoinedByString:@","]];
    [myWebView stringByEvaluatingJavaScriptFromString:setValueData];
}

7奢啥、以下是html實現(xiàn)交互之后的所有代碼:

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <script type='text/javascript' src='echarts.min.js' charset='utf-8'></script>

    <title>charts</title>

</head>

<body>

<div id="main" style="width: 100%;height:800px;"></div>
<!-- ECharts單文件引入 -->
<script type="text/javascript">

    var ocValueData = [];
    function setValueData(ocValue) {
        console.log("ocValue"+ocValue);

        for (var i = 0; i < ocValue.length; i++) {
            if (ocValueData.length>600){
                ocValueData.shift();
            }
            ocValueData.push(randomData(ocValue[i],5));
        }
        myChart.setOption({
            series: [{
                data: ocValueData
            }]
        });
    }
   var myChart = echarts.init(document.getElementById('main'));
    function randomData(ocValue,time) {
        now = new Date(+now +time);
        value = ocValue;
        return {
            name: now.toString(),
            value: [
                now,
                ocValue
            ]
        }
    }
    var now = new Date();
    var value = Math.random() * 1000;
    var option = {
        title: {
            text: 'Realtime PPG'
        },
        textStyle:{
            fontSize:30
        },
        tooltip: {
            trigger: 'axis',
            formatter: function (params) {
                params = params[0];
                var date = new Date(params.name);
                return date.getDate() + '/' + (date.getMonth() + 1) + '/' + date.getFullYear() + ' : ' + params.value[1];
            },
            axisPointer: {
                animation: false
            }
        },
        xAxis: {
            type: 'time',
            splitLine: {
                show: false
            }
        },
        yAxis: {
            type: 'value',
            boundaryGap: [0, '100%'],
            splitLine: {
                show: false
            }
        },

        series: [{
            name: '模擬數(shù)據(jù)',
            type: 'line',
            showSymbol: false,
            hoverAnimation: false,
            data: ocValueData
        }
        ]
    };
    myChart.setOption(option);

</script>
</body>

</html>

了解:

ocValueData.shift():shift() 方法用于把數(shù)組的第一個元素從其中刪除秸仙,并返回第一個元素的值。如果數(shù)組是空的桩盲,那么 shift() 方法將不進行任何操作寂纪,返回 undefined 值。請注意赌结,該方法不創(chuàng)建新數(shù)組捞蛋,而是直接修改原有的 ocValueData;

ocValueData.length:數(shù)組ocValueData的元素個數(shù)柬姚;

ocValueData.push():push() 方法可向數(shù)組的末尾添加一個或多個元素襟交,并返回新的長度。push() 方法可把它的參數(shù)順序添加到 ocValueData 的尾部伤靠。它直接修改 ocValueData,而不是創(chuàng)建一個新的數(shù)組啼染。

設(shè)置x軸的時間間隔:通過更改randomData()方法里邊的time參數(shù)宴合,單位是毫秒,以上代碼時間間隔設(shè)置的是5毫秒,如果想顯示24小時的數(shù)據(jù)迹鹅,可以把now = new Date(+now +time)改成now = new Date();

setInterval(function () {
for (var i = 0; i < 5; i++) {
data.shift();
data.push(randomData());
}
myChart.setOption(option);
}, 1000);
這個方法是定時器卦洽,下邊的參數(shù)1000的單位是毫秒,也就是1秒產(chǎn)生5個隨機數(shù)

demo地址:https://github.com/chenmengdi/TestDemo
最后附上我的實現(xiàn)效果圖:

屏幕快照 .png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末斜棚,一起剝皮案震驚了整個濱河市阀蒂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌弟蚀,老刑警劉巖蚤霞,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異义钉,居然都是意外死亡昧绣,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門捶闸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來夜畴,“玉大人,你說我怎么就攤上這事删壮√盎妫” “怎么了?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵央碟,是天一觀的道長税灌。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么垄琐? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任边酒,我火速辦了婚禮,結(jié)果婚禮上狸窘,老公的妹妹穿的比我還像新娘墩朦。我一直安慰自己,他們只是感情好翻擒,可當我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布氓涣。 她就那樣靜靜地躺著,像睡著了一般陋气。 火紅的嫁衣襯著肌膚如雪劳吠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天巩趁,我揣著相機與錄音痒玩,去河邊找鬼。 笑死议慰,一個胖子當著我的面吹牛蠢古,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播别凹,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼草讶,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了炉菲?” 一聲冷哼從身側(cè)響起堕战,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拍霜,沒想到半個月后嘱丢,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡祠饺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年屿讽,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吠裆。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡伐谈,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出试疙,到底是詐尸還是另有隱情诵棵,我是刑警寧澤,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布祝旷,位于F島的核電站履澳,受9級特大地震影響嘶窄,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜距贷,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一柄冲、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧忠蝗,春花似錦现横、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至速种,卻和暖如春姜盈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背配阵。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工馏颂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人棋傍。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓救拉,卻偏偏與公主長得像,于是被迫代替她去往敵國和親舍沙。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,728評論 2 351