美文网首页三方管理iOS精选博文iOS实战
iOS - ECharts 使用(折线图, 柱状图)

iOS - ECharts 使用(折线图, 柱状图)

作者: Mr_Lucifer | 来源:发表于2016-08-05 08:58 被阅读4200次

    前言

    App中使用折线图, 柱状图有很多方法框架, 但是却很少有公司级的产品供iOS开发者使用, 百度团队有一款 ECharts 产品, 如果对JS使用熟练完全可以在项目中集成使用. 如果对JS语言不熟, Pluto-Y 对百度ECharts进行封装为 iOS-Echarts , 可以供开发者使用, 作者今天就聊一聊 iOS-Echarts 的使用

    一 准备工作

    ** ECharts官网** : http://echarts.baidu.com/echarts2/index.html
    ** 参考手册 ** : http://echarts.baidu.com/echarts2/doc/doc.html
    ** 实例说明 ** : http://echarts.baidu.com/examples.html
    [iOS-Echarts]demo下载 : https://github.com/Pluto-Y/iOS-Echarts

    因为 Pluto-Y 的封装 **没!有!注!释!说!明! **, 所以你只能去官网查询 JS 相关属性说明

    二 举例说明

    1 折线图

    • 0. 说明

    该视图底层是用 webview 加载 JS. 有些部分为了实现效果需要进行修改

    • *1. cocoaPods 配置 : pod 'iOS-Echarts'
      二次补充 : cocoaPods 如果升级为1.0.1. 那么集成为
      platform :ios, '8.0'
      #use_frameworks!个别需要用到它,比如reactiveCocoa
    
      target 'YouAppName' do
      pod 'iOS-Echarts’
      end
    
    • 2. 引入头文件
    #import "PYEchartsView.h"
    #import "PYOption.h"
    #import "PYZoomEchartsView.h"
    

    二次补充 : , 最新 版本, 封装作者把 头文件改为

    #import "iOS-Echarts.h"
    

    仅引用, 该头文件即可. 语法方面也有更改, 但还支持 原来的写法.

    • 3.定义属性
    @property (nonatomic, strong) UIScrollView *scrollView;
    @property (nonatomic, strong) PYZoomEchartsView *kEchartView;
    
    • 4. 创建 ScrollView
      为了让手机屏幕显示更多数据, 并且数据之间不拥挤有横向滑动效果, 需要将webview添加在 ScrollView上
    - (void)creatScrollView{
    
        self.scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 100, self.view.frame.size.width , 300)];
        [self.view addSubview:self.scrollView];
        self.scrollView.delegate = self;
        self.scrollView.contentSize = CGSizeMake(self.view.frame.size.width * 2, 0);
        self.scrollView.showsHorizontalScrollIndicator = NO;
    }
    
    
    • 5. 创建 Echarts
    -(void)showLineDemo {
        
    /** 图表选项 */
        PYOption *option = [[PYOption alloc] init];
        //是否启用拖拽重计算特性,默认关闭
        option.calculable = NO;
        //数值系列的颜色列表(折线颜色)
        option.color = @[@"#20BCFC", @"#ff6347"];
        // 图标背景色
        // option.backgroundColor = [[PYColor alloc] initWithColor:[UIColor orangeColor]];
    
    
    /** 提示框 */
        PYTooltip *tooltip = [[PYTooltip alloc] init];
        // 触发类型 默认数据触发
        tooltip.trigger = @"axis";
        // 竖线宽度
        tooltip.axisPointer.lineStyle.width = @1;
        // 提示框 文字样式设置
        tooltip.textStyle = [[PYTextStyle alloc] init];
        tooltip.textStyle.fontSize = @12;
        // 提示框 显示自定义
        // tooltip.formatter = @"(function(params){ var res = params[0].name; for (var i = 0, l = params.length; i < l; i++) {res += '<br/>' + params[i].seriesName + ' : ' + params[i].value;}; return res})";
        // 添加到图标选择中
        option.tooltip = tooltip;
        
    
    /** 图例 */
        PYLegend *legend = [[PYLegend alloc] init];
        // 设置数据
        legend.data = @[@"挂牌价",@"成交价"];
    
        // 添加到图标选择中
        option.legend = legend;
        
    
    /** 直角坐标系内绘图网格, 说明见下图 */
        PYGrid *grid = [[PYGrid alloc] init];
        // 左上角位置
        grid.x = @(45);
        grid.y = @(20);
        // 右下角位置
        grid.x2 = @(20);
        grid.y2 = @(30);
        grid.borderWidth = @(0);
    
        // 添加到图标选择中
        option.grid = grid;
            
    /** X轴设置 */
        PYAxis *xAxis = [[PYAxis  alloc] init];
        //横轴默认为类目型(就是坐标自己设置)
        xAxis.type = @"category";
        // 起始和结束两端空白
        xAxis.boundaryGap = @(YES);
        // 分隔线
        xAxis.splitLine.show = NO;
        // 坐标轴线
        xAxis.axisLine.show = NO;
        // X轴坐标数据
        xAxis.data = @[@"1月", @"2月", @"3月", @"4月", @"5月", @"6月", @"7月", @"8月", @"9月", @"10月", @"11月", @"12月" ]; 
        // 坐标轴小标记
        xAxis.axisTick = [[PYAxisTick alloc] init];
        xAxis.axisTick.show = YES;
    
        // 添加到图标选择中
        option.xAxis = [[NSMutableArray alloc] initWithObjects:xAxis, nil];
        
        
    /** Y轴设置 */
        PYAxis *yAxis = [[PYAxis alloc] init];
        yAxis.axisLine.show = NO;
        // 纵轴默认为数值型(就是坐标系统生成), 改为 @"category" 会有问题, 读者可以自行尝试
        yAxis.type = @"value";
        // 分割段数,默认为5
        yAxis.splitNumber = @4;
        // 分割线类型
        // yAxis.splitLine.lineStyle.type = @"dashed";   //'solid' | 'dotted' | 'dashed' 虚线类型
    
        //单位设置,  设置最大值, 最小值
        // yAxis.axisLabel.formatter = @"{value} k";
        // yAxis.max = @9000;
        // yAxis.min = @5000;
        
    
        // 添加到图标选择中  ( y轴更多设置, 自行查看官方文档)
        option.yAxis = [[NSMutableArray alloc] initWithObjects:yAxis, nil];
        
        
    /** 定义坐标点数组 */
        NSMutableArray *seriesArr = [NSMutableArray array];
        
    /** 第一条折线设置 */
        PYCartesianSeries *series1 = [[PYCartesianSeries alloc] init];
        series1.name = @"挂牌价";
        // 类型为折线
        series1.type = @"line";
        // 曲线平滑
        // series1.smooth = YES;
        // 坐标点大小
        series1.symbolSize = @(1.5);
        // 坐标点样式, 设置连线的宽度
        series1.itemStyle = [[PYItemStyle alloc] init];
        series1.itemStyle.normal = [[PYItemStyleProp alloc] init];
        series1.itemStyle.normal.lineStyle = [[PYLineStyle alloc] init];
        series1.itemStyle.normal.lineStyle.width = @(1.5);
        // 添加坐标点 y 轴数据 ( 如果某一点 无数据, 可以传 @"-" 断开连线 如 : @[@"7566", @"-", @"7571"]  )
        series1.data = @[@"7566", @"7619", @"7571", @"7670", @"7528", @"7640", @"7472", @"7800", @"8058", @"7972", @"7606", @"7710"];
        
        [seriesArr addObject:series1];
        
    /** 第二条折线设置 */  
        PYCartesianSeries *series2 = [[PYCartesianSeries alloc] init];
        series2.name = @"成交价";
        series2.type = @"line";
        series2.symbolSize = @(1.5);
        series2.itemStyle = [[PYItemStyle alloc] init];
        series2.itemStyle.normal = [[PYItemStyleProp alloc] init];
        series2.itemStyle.normal.lineStyle = [[PYLineStyle alloc] init];
        series2.itemStyle.normal.lineStyle.width = @(1.5);
        series2.data = @[@"7066", @"7119", @"7471", @"7470", @"7228", @"7340", @"7402", @"7600", @"7858", @"7772", @"7506", @"7310"];
        [seriesArr addObject:series2];
       
        [option setSeries:seriesArr];
        
    
    
    /** 初始化图表 */
        self.kEchartView = [[PYZoomEchartsView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width * 2 , 300)];
        // 添加到 scrollView 上
        [self.scrollView addSubview:self.kEchartView];
        // 图表选项添加到图表上
        [self.kEchartView setOption:option];
        
     
    }
    
    
    // 调用
    - (void)viewDidLoad{
    
          [self creatScrollView];
          [self showLineDem];
    
          [self.kEchartView loadEcharts];
    }
    
    
    PYGrid x, y ; x2, y2 位置说明 axis属性说明
    • 6. 修改

    如果你 复制了上述代码 , 你会发现视图不能横向滑动, 那是因为 Pluto-Y 封装时添加的一个手势 影响了 横滑效果 , 需要在Pods文件夹中进行如下修改

    PYZoomEchartsView.m 中
    -(instancetype)initWithFrame:(CGRect)frame {}; 方法中将下面两句话注掉
    // UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panHandle:)];
    // [self addGestureRecognizer:panGesture];

    最终效果如下:

    iOS-Echart.gif
    • 7. 网络数据
      如果你 使用网络数据了, 你会发现, 加载数据完成 图表才显示出来, 加载过程中, 页面是空白的, 如何获取加载完成事件 ?

    开篇作者说过 :

    • 0. 说明
      该视图底层是用 webview 加载 JS. 有些部分为了实现效果需要进行修改

    所以, 需要继续在Pods文件夹中进行如下修改

    在 PYEchartsView.m 中

    • (void)webViewDidFinishLoad:(UIWebView *)webView {} 方法中, 作者使用block进行传递说明, 因为 PYZoomEchartsView 继承 PYEchartsView, 所以 VC中定义的属性 self.kEchartView 可以响应该block方法.
    • 8. 补充说明

    看到这, 如果你 写demo了, 会发现, 最终效果图与 作者展示的 不一样 . 那是因为作者将 y轴 隐藏后, scrollView 宽度变小后 添加图片后的效果.

    2 柱状图

    柱状图, 作者就不写了, 大同小异, 看官方文档 对应 折线图就可以写出, 效果图如下:

    iOS-Echart.gif

    P.S. 如果这篇文章对你有帮助, 请给 Pluto-Y 点 个 Star, 感谢他的封装; 当然如果你点击 喜欢, 作者也会很开心的, 手动微笑.

    **以上 ! **

    相关文章

      网友评论

      • Be_ingenious:饼状图的 接地瀑布图可以当支出更多时 可以有负数么
      • 提莫酱T:请问作者,我要绘制饼图该怎么弄呢?我按照github上的代码搬,没有显示出来,请教,哈哈。
        提莫酱T:@Mr_Lucifer 我写出来了,谢了:joy::joy:
        Mr_Lucifer:有个讨论群 485591970 你可以加进去问问. 太久了, 我也记不住了
      • 年轻人的心情_爱我所爱:你好,能麻烦你把截图第8条的实现过程贴下吗?或者帮忙发我邮箱(1689582201@qq.com),谢谢亲了
        Mr_Lucifer:grid.x 设置为0 隐藏了坐标轴. 之后自己写控件 与默认坐标轴对应上.
      • rapunzelyeah:可以给每个点设置不同的itemstyle吗
        Mr_Lucifer:有个讨论群 485591970 你可以加进去问问. 太久了, 我也记不住了
      • KevinChein:如何捕捉折线图的点击效果啊?想拿到点击时的数据
        Mr_Lucifer:@rapunzelyeah 有个讨论群 485591970 你可以加进去问问
        rapunzelyeah:有同样的问题!
        Mr_Lucifer:这个真不知道, 可以看下官网文档, 或者去 封装作者建的QQ群 问一下
      • KevinChein:楼主你好,为什么我按照你的代码,将折线图添加到一个cell上就不能点击了呢? 那条黑线也没有!请楼主指点一下啊
        Mr_Lucifer:@KevinCheinCoder 哈哈, 这个真没有了, 写完之后, 就没备份. 不过封装作者建了个QQ群, 实在不会, 你可以去那里问问.
        KevinChein:@Mr_Lucifer 可以给个小demo吗?
        Mr_Lucifer:@KevinCheinCoder 我是将 这些东西 封装在一个 View 中, 然后将这个View 放在 cell 上, 没发现你说的问题. 你可以试试看
      • 年轻人的心情_爱我所爱:楼主能把柱状图的代码贴出来吗,完全看不懂的赶脚'
        Mr_Lucifer:@年轻人的心情_爱我所爱 哦, 那个我也无解, 最后隐藏y轴. 用 label 自己写的.
        年轻人的心情_爱我所爱:@Mr_Lucifer 我已经实现了,唯一就是加了scrollView,Y轴跟着一起滑动,暂时是未解
        Mr_Lucifer:柱状图 是设置 PYCartesianSeries 的 type = @"bar" 就可以, 其他属性 可以查看官网, 或者去封装作者 创建的QQ群 咨询.
      • SuAdrenine:您好,我设置
        .addXAxis([PYAxis initPYAxisWithBlock:^(PYAxis *axis) {
        axis.typeEqual(PYAxisTypeCategory)
        .boundaryGapEqual(@NO)
        .addDataArr(@[@"",@"",@"",@"",@"",@"",@"",@"",@"",@""]);
        PYLineStyle *lineStyle = [[PYLineStyle alloc] init];
        lineStyle.width = @1;
        lineStyle.color = ColorFromRGB(0x00ff00);
        axis.axisLine.lineStyle = lineStyle;
        axis.axisTick.show = NO;
        axis.splitLine.show = NO;
        }])最后分割线还剩下最右边一条黑色竖线分割线, axis.splitLine.show = YES;则分割线全是灰色,最右边那条黑色竖线也变成了灰色,这个是什么问题造成的呢,设置 xAxis.boundaryGap = @(YES);右边黑色竖线还是有
        Mr_Lucifer:@Adrenine 不用, 不用, 开个玩笑.
        SuAdrenine:@Mr_Lucifer 已解决,加了那个群,群里有人回答了, PS:头像你喜欢,我发给你
        Mr_Lucifer:我有写设置 grid.borderWidth = @(0); P.S. 头像蛮漂亮.
      • vet_:请问 (8. 补充说明)这点 Y轴隐藏 用图片是怎么来处理的
        vet_:@Mr_Lucifer 好的谢谢解答
        Mr_Lucifer:// 图片 是, 设置 单位为k, 传入数据 0, 2, 4, 6, 8, 10 就会 形成 想要的y轴, 然后截图
        yAxis.axisLabel.formatter = @"{value} k"

        // 左上角位置, 设置为0, y轴就不显示了, 之后 把图贴上去就行
        grid.x = @(0);
      • 干不动:pod引入iOS-Echarts 一运行就包20个错 Podfile也是按照你给的内容改的
        Mr_Lucifer:@姚兜兜 我刚集成了下, 没有问题, 不知道你遇到什么问题. 不过 cocoaPods 在 我Xcode升级到 8.2.1 时候, 出现过问题, 后来重新安装了下, 你可以集成下别的 框架 测试下, 是不是这个问题.
        干不动:@Mr_Lucifer 肯定是改我的工程名啊
        Mr_Lucifer:@姚兜兜 你是不是 把 YouAppName 也复制了?
      • BluexLu:pod引入iOS-Echarts 直接20个报错
        BluexLu:@Mr_Lucifer 楼主你这个有demo吗分享一个谢谢513401019@qq.com
        干不动:@BluexLu 哥们 你解决没
        Mr_Lucifer:@BluexLu 看 [二次补充 : cocoaPods 如果升级为1.0.1. 那么集成为....] 这里
      • 776745954e44:马一下
      • zym_:category下怎么设置每两个月之间的间距呢,文档没找见
        Mr_Lucifer:@myz_ 那你进行数据处理得了呗, 直接处理为 六个月的数组.
        zym_:@Mr_Lucifer 我们现在是一屏展示十二个月,显示六个月(比如1,3,5,7),现在把十二个月全显示了,没用scrollView
        Mr_Lucifer:@myz_ 确定没有的话, 可以把 self.scrollView.contentSize 与 self.kEchartView 宽度加大, 图表会自动分配宽度, 实现间距变化.
      • Mr_Lucifer:Podfile文件中写入 pod 'iOS-Echarts', 终端 pod install. 就可以了. 你问的问题我没遇到过.
        Mr_Lucifer:@mrsensen 我刚集成一下, 没有问题可以引用. 你的问题, 我看不到, 爱莫能助了. 你可以试试Afn 之类的, 看能不能集成.
        mrsensen:@Mr_Lucifer 是不是ios版本的问题 我是 platform :ios, '9.0'
        mrsensen:@Mr_Lucifer 怎么办怎么办。。。我就是在Podfile里面添加 pod 'iOS-Echarts' 但是执行 pod install 找不到
      • mrsensen:撸主在吗 我通过拖入的方式,在项目里面报语法错误! 怎么解决啊。另外我用pod 'iOS-Echarts'的方式,找不到这个库
      • imwudi:请问一个页面能加载两个PYZoomEchartsView吗?我尝试在一个页面展示2个图表,但始终值显示先loadEcharts的那个view
        344509eb31e5:@imwudi 我也遇到你这个问题,只能显示一个,你的问题解决了吗?
        Mr_Lucifer:@imwudi 这个我没研究, 最近有些忙, 你可以联系下 封装作者 http://www.pluto-y.com/ .
      • Mr_Lucifer:看 demo 下载, 里面是用 NSString *nestedPieJson 直接写的, 你可要拆成 我折线图写的样式, 主要是 series.type = @"pie";
      • 余温夏暖:不太对吧...你这样写 岂不是整个表都在滑动了 包括左边的y轴
        Mr_Lucifer:@余温下暖 对, 因为官方文档没查到对这块的说明. 所以用图片处理了.
        余温夏暖:@Mr_Lucifer 啊~...你那个y轴和下面的 line说明都只是图片啊?
        Mr_Lucifer:@余温下暖 我有写, [8. 补充说明].

      本文标题:iOS - ECharts 使用(折线图, 柱状图)

      本文链接:https://www.haomeiwen.com/subject/fnjijttx.html