V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
KeyboardManAnAn
V2EX  ›  Apple

AAChartKit 2.0 一款极其精美的 iOS 开源图表库

  •  1
     
  •   KeyboardManAnAn · 2017-08-24 23:40:02 +08:00 · 3578 次点击
    这是一个创建于 2648 天前的主题,其中的信息可能已经有所发展或是发生改变。

    IMG_1875.JPG

    GitHub 传送门

    https://github.com/AAChartModel/AAChartKit

    前言

    AAChartKit 项目,是在流行的开源前端图表库Highcharts的基础上,封装的面向对象的,一组简单易用,极其精美的图表绘制控件.
    1. 适配 iOS 6, 支持ARC,支持 OC语言,配置简单.
    2. 功能强大,支持柱状图 条形图 折线图 填充图 雷达图 扇形图 气泡图等多种图形
    3. 动画效果细腻精致,流畅优美.
    4. 支持类 Masonry 链式编程语法
    5. AAChartView +AAChartModel = Chart,在 AAChartKit 封装库当中,遵循这样一个极简主义公式:图表视图控件+图表模型=你想要的图表.

    • 因项目功能较多,文件较大,请移步至 GitHub 下载. 亲爱的,如果您使用时,觉得满意,请赏一颗星星✨,您的鼓励将是我继续努力的一大动力 .

    GitHub 传送门

    https://github.com/AAChartModel/AAChartKit


    使用方法

    准备工作

    1. 将项目 demo 中的文件夹AAChartKitLib拖入到所需项目中.
    2. 在你的项目的 .pch 全局宏定义文件中添加
    #import "AAGlobalMacro.h"
    

    正式开始

    1. 在你的视图控制器文件中添加
    #import "AAChartView.h"
    
    1. 创建视图 AAChartView
    AAChartView *chartView = [[AAChartView alloc]init];
    self.view.backgroundColor = [UIColor whiteColor];
    chartView.frame = CGRectMake(0, 60, self.view.frame.size.width, self.view.frame.size.height-220);
    chartView.contentHeight =self.view.frame.size.height-220;//设置图表视图的内容高度(默认 contentHeight 和 AAChartView 的高度相同)
    [self.view addSubview:chartView];
    
    1. 配置视图模型 AAChartModel
        AAChartModel *chartModel= AAObject(AAChartModel)
        .chartTypeSet(AAChartTypeColumn)//设置图表的类型(这里以设置的为柱状图为例)
        .titleSet(@"编程语言热度")//设置图表标题
        .subtitleSet(@"虚拟数据")//设置图表副标题
        .categoriesSet(@[@"Java",@"Swift",@"Python",@"Ruby", @"PHP",@"Go",@"C",@"C#",@"C++"])//设置图表横轴的内容
        .yAxisTitleSet(@"摄氏度")//设置图表 y 轴的单位
        .seriesSet(@[
                     AAObject(AASeriesElement)
                     .nameSet(@"2017")
                     .dataSet(@[@45,@56,@34,@43,@65,@56,@47,@28,@49]),
                     
                     AAObject(AASeriesElement)
                     .nameSet(@"2018")
                     .dataSet(@[@11,@12,@13,@14,@15,@16,@17,@18,@19]),
                     
                     AAObject(AASeriesElement)
                     .nameSet(@"2019")
                     .dataSet(@[@31,@22,@33,@54,@35,@36,@27,@38,@39]),
                     
                     AAObject(AASeriesElement)
                     .nameSet(@"2020")
                     .dataSet(@[@21,@22,@53,@24,@65,@26,@37,@28,@49]),
                     ])
        ;
    
    1. 绘制图形
    [chartView aa_drawChartWithChartModel:chartModel];//图表视图对象调用图表模型对象,绘制最终图形
    
    1. 刷新图形
     [chartView aa_refreshChartWithChartModel:chartModel];//更新 AAChartModel 数据之后,刷新图表
    
    1. 特别说明

    AAChartKit 中扇形图、气泡图都归属为特殊类型,所以想要绘制扇形图、气泡图,图表模型 AAChartModel 设置稍有不同,示例如下

    • 绘制扇形图,你需要这样配置模型 AAChartModel
    AAChartModel *chartModel= AAObject(AAChartModel)
            .chartTypeSet(AAChartTypePie)
            .titleSet(@"编程语言热度")
            .subtitleSet(@"虚拟数据")
            .dataLabelEnabledSet(true)//是否直接显示扇形图数据
            .yAxisTitleSet(@"摄氏度")
            .seriesSet(
                       @[AAObject(AASeriesElement)
                         .nameSet(@"语言热度占比")
                         .dataSet(@[
                                    @[@"Java"  , @67],
                                    @[@"Swift" , @44],
                                    @[@"Python", @83],
                                    @[@"OC"    , @11],
                                    @[@"Ruby"  , @42],
                                    @[@"PHP"   , @31],
                                    @[@"Go"    , @63],
                                    @[@"C"     , @24],
                                    @[@"C#"    , @888],
                                    @[@"C++"   , @66],
                                    ]),
                         ]
                       
                       )
            ;
    
    • 绘制气泡图,你需要这样配置模型 AAChartModel
    
    
    AAChartModel *chartModel= AAObject(AAChartModel)
            .chartTypeSet(AAChartTypeBubble)
            .titleSet(@"编程语言热度")
            .subtitleSet(@"虚拟数据")
            .yAxisTitleSet(@"摄氏度")
            .seriesSet(
                       @[
                         AAObject(AASeriesElement)
                         .nameSet(@"2017")
                         .dataSet(
                                  @[
                                    @[@97, @36, @79],
                                    @[@94, @74, @60],
                                    @[@68, @76, @58],
                                    @[@64, @87, @56],
                                    @[@68, @27, @73],
                                    @[@74, @99, @42],
                                    @[@7,  @93, @87],
                                    @[@51, @69, @40],
                                    @[@38, @23, @33],
                                    @[@57, @86, @31]
                                    ]),
                         
                         AAObject(AASeriesElement)
                         .nameSet(@"2018")
                         .dataSet(
                                  @[
                                    @[@25, @10, @87],
                                    @[@2, @75, @59],
                                    @[@11, @54, @8],
                                    @[@86, @55, @93],
                                    @[@5, @3, @58],
                                    @[@90, @63, @44],
                                    @[@91, @33, @17],
                                    @[@97, @3, @56],
                                    @[@15, @67, @48],
                                    @[@54, @25, @81]
                                    ]),
                         
                         AAObject(AASeriesElement)
                         .nameSet(@"2019")
                         .dataSet(
                                  @[
                                    @[@47, @47, @21],
                                    @[@20, @12, @4],
                                    @[@6, @76, @91],
                                    @[@38, @30, @60],
                                    @[@57, @98, @64],
                                    @[@61, @17, @80],
                                    @[@83, @60, @13],
                                    @[@67, @78, @75],
                                    @[@64, @12, @10],
                                    @[@30, @77, @82]
                                    ]),
                         
                         ]
                       )
            ;
    
    1. 当前已支持的图表类型有十种以上,说明如下
    typedef NSString *AAChartType;
    static AAChartType const AAChartTypeColumn      = @"column";     //柱形图
    static AAChartType const AAChartTypeBar         = @"bar";        //条形图
    static AAChartType const AAChartTypeArea        = @"area";       //折线区域填充图
    static AAChartType const AAChartTypeAreaspline  = @"areaspline"; //曲线区域填充图
    static AAChartType const AAChartTypeLine        = @"line";       //折线图
    static AAChartType const AAChartTypeSpline      = @"spline";     //曲线图
    static AAChartType const AAChartTypeScatter     = @"scatter";    //散点图
    static AAChartType const AAChartTypePie         = @"pie";        //扇形图
    static AAChartType const AAChartTypeBubble      = @"bubble";     //气泡图
    static AAChartType const AAChartTypePyramid     = @"pyramid";    //金字塔图
    static AAChartType const AAChartTypeFunnel      = @"funnel";     //漏斗图
    static AAChartType const AAChartTypeColumnrange = @"columnrange";//柱形范围图
    
    1. 当前已支持的图表渲染动画类型有三十种以上,说明如下
    typedef NS_ENUM(NSInteger,AAChartAnimationType){
        AAChartAnimationTypeLinear =0,
        AAChartAnimationTypeSwing,
        AAChartAnimationTypeEaseInQuad,
        AAChartAnimationTypeEaseOutQuad,
        AAChartAnimationTypeEaseInOutQuad,
        AAChartAnimationTypeEaseInCubic,
        AAChartAnimationTypeEaseOutCubic,
        AAChartAnimationTypeEaseInOutCubic,
        AAChartAnimationTypeEaseInQuart,
        AAChartAnimationTypeEaseOutQuart,
        AAChartAnimationTypeEaseInOutQuart,
        AAChartAnimationTypeEaseInQuint,
        AAChartAnimationTypeEaseOutQuint,
        AAChartAnimationTypeEaseInOutQuint,
        AAChartAnimationTypeEaseInExpo,
        AAChartAnimationTypeEaseOutExpo,
        AAChartAnimationTypeEaseInOutExpo,
        AAChartAnimationTypeEaseInSine,
        AAChartAnimationTypeEaseOutSine,
        AAChartAnimationTypeEaseInOutSine,
        AAChartAnimationTypeEaseInCirc,
        AAChartAnimationTypeEaseOutCirc,
        AAChartAnimationTypeEaseInOutCirc,
        AAChartAnimationTypeEaseInElastic,
        AAChartAnimationTypeEaseOutElastic,
        AAChartAnimationTypeEaseInOutElastic,
        AAChartAnimationTypeEaseInBack,
        AAChartAnimationTypeEaseOutBack,
        AAChartAnimationTypeEaseInOutBack,
        AAChartAnimationTypeEaseInBounce,
        AAChartAnimationTypeEaseOutBounce,
        AAChartAnimationTypeEaseInOutBounce,
    };
    

    AAChartModel 一些重要属性经过配置之后的图形示例如下

    • line chart - 折线图

    IMG_1867.JPG

    • column chart - 柱形图

    IMG_1483.JPG

    • bar chart - 条形图

    IMG_1880.JPG

    • special area chart one - 区域填充图一

    IMG_1482.JPG- special area chart two - 区域填充图二

    IMG_1874.JPG

    • special area chart three - 区域填充图三

    IMG_1863.JPG

    • radar chart - 雷达图

    IMG_1877.JPG

    • polar chart - 极地图

    IMG_1879.JPG

    • pie chart - 扇形图

    IMG_1878.JPG

    • the oval style column chart - 头部为椭圆形的柱形图

    IMG_1866.JPG

    • mixed chart - 混合图形

    屏幕快照 2017-05-11 下午 11.21.03.png

    AAChartModel 属性配置列表

    AAPropStatementAndFuncStatement(copy, AAChartModel, NSString *, title);//标题内容
    AAPropStatementAndFuncStatement(copy, AAChartModel, NSString *, subtitle);//副标题内容
    AAPropStatementAndFuncStatement(copy, AAChartModel, AAChartSubtitleAlignType, subtitleAlign);//图表副标题文本水平对齐方式。可选的值有 “ left ”,” center “和“ right ”。 默认是:center.
    AAPropStatementAndFuncStatement(copy, AAChartModel, AAChartType, chartType);//图表类型
    AAPropStatementAndFuncStatement(copy, AAChartModel, AAChartStackingType, stacking);//堆积样式
    AAPropStatementAndFuncStatement(copy, AAChartModel, AAChartSymbolType, symbol);//折线曲线连接点的类型:"circle", "square", "diamond", "triangle","triangle-down",默认是"circle"
    AAPropStatementAndFuncStatement(copy, AAChartModel, AAChartZoomType, zoomType);//缩放类型 AAChartZoomTypeX 表示可沿着 x 轴进行手势缩放
    AAPropStatementAndFuncStatement(assign, AAChartModel, BOOL, pointHollow);//折线曲线的连接点是否为空心的
    AAPropStatementAndFuncStatement(assign, AAChartModel, BOOL, inverted);//x 轴是否垂直
    AAPropStatementAndFuncStatement(assign, AAChartModel, BOOL, xAxisReversed);// x 轴翻转
    AAPropStatementAndFuncStatement(assign, AAChartModel, BOOL, yAxisReversed);//y 轴翻转
    AAPropStatementAndFuncStatement(assign, AAChartModel, BOOL, crosshairs);//是否显示准星线(默认显示)
    AAPropStatementAndFuncStatement(assign, AAChartModel, BOOL, gradientColorEnable);//是否要为渐变色
    AAPropStatementAndFuncStatement(assign, AAChartModel, BOOL, polar);//是否极化图形(变为雷达图)
    AAPropStatementAndFuncStatement(assign, AAChartModel, BOOL, dataLabelEnabled);//是否显示数据
    AAPropStatementAndFuncStatement(assign, AAChartModel, BOOL, xAxisLabelsEnabled);//x 轴是否显示数据
    AAPropStatementAndFuncStatement(strong, AAChartModel, NSArray *, categories);//图表横坐标每个点对应的名称
    AAPropStatementAndFuncStatement(strong, AAChartModel, NSNumber *, xAxisGridLineWidth);//x 轴网格线的宽度
    AAPropStatementAndFuncStatement(assign, AAChartModel, BOOL, yAxisLabelsEnabled);//y 轴是否显示数据
    AAPropStatementAndFuncStatement(copy,   AAChartModel, NSString *, yAxisTitle);//y 轴标题
    AAPropStatementAndFuncStatement(strong, AAChartModel, NSNumber *, yAxisGridLineWidth);//y 轴网格线的宽度
    AAPropStatementAndFuncStatement(strong, AAChartModel, NSArray *, colorsTheme);//图表主题颜色数组
    AAPropStatementAndFuncStatement(strong, AAChartModel, NSArray *, series);
    AAPropStatementAndFuncStatement(assign, AAChartModel, BOOL, legendEnabled);//是否显示图例
    AAPropStatementAndFuncStatement(copy,   AAChartModel ,AAChartLegendLayoutType, legendLayout);//图例数据项的布局。布局类型: "horizontal" 或 "vertical" 即水平布局和垂直布局 默认是:horizontal.
    AAPropStatementAndFuncStatement(copy,   AAChartModel ,AAChartLegendAlignType, legendAlign);//设定图例在图表区中的水平对齐方式,合法值有 left,center 和 right。
    AAPropStatementAndFuncStatement(copy,   AAChartModel ,AAChartLegendVerticalAlignType, legendVerticalAlign);//设定图例在图表区中的垂直对齐方式,合法值有 top,middle 和 bottom。垂直位置可以通过 y 选项做进一步设定。
    AAPropStatementAndFuncStatement(copy,   AAChartModel, NSString *, backgroundColor);//图表背景色
    AAPropStatementAndFuncStatement(assign, AAChartModel, BOOL, options3dEnable);//是否 3D 化图形(仅对条形图,柱状图有效)
    AAPropStatementAndFuncStatement(strong, AAChartModel, NSNumber *, options3dAlpha);
    AAPropStatementAndFuncStatement(strong, AAChartModel, NSNumber *, options3dBeta);
    AAPropStatementAndFuncStatement(strong, AAChartModel, NSNumber *, options3dDepth);//3D 图形深度
    AAPropStatementAndFuncStatement(strong, AAChartModel, NSNumber *, borderRadius);//柱状图长条图头部圆角半径(可用于设置头部的形状,仅对条形图,柱状图有效)
    AAPropStatementAndFuncStatement(strong, AAChartModel, NSNumber *, markerRadius);//折线连接点的半径长度
    
    

    更多图形效果

    AAChartKitShow.gif

    作者

    An An

     "CODE IS FAR AWAY FROM BUG WITH THE ANIMAL PROTECTING"
     *          %%       %%
     *         ##       ##
     *       ┏-##┓   ┏-##┓
     *    ┏_┛ ┻---━┛_┻━━┓
     *    ┃           ┃     
     *    ┃   ━       ┃    
     *    ┃ @^   @^    ┃   
     *    ┃        ┃
     *    ┃   ┻    ┃
     *    ┃_      _┃
     *     ┗━┓   ┏━┛
     *      ┃   ┃神兽保佑
     *      ┃   ┃永无 BUG !
     *      ┃   ┗━━━┓----|
     *      ┃         ┣┓}}}
     *      ┃         ┏┛
     *      ┗┓&&&┓-┏&&&┓┏┛-|
     *       ┃┫┫  ┃┫┫
     *       ┗┻┛  ┗┻┛
     *
     *
     "CODE IS FAR AWAY FROM BUG WITH THE ANIMAL PROTECTING"
    

    许可证

    本项目使用 MIT 许可证,详情请点击MIT LICENSE

    附言

    AAChartKit 封装库的初始设计中,为提升.js文件的加载速度,故将所依赖的.js文件放置在本地.然而由于本项目功能较多,故放置于本地的附加JavaScript文件库体积较大,整个AAJSFiles文件夹下所有的.js文件体积合计共有5.3M 左右,若对工程文件体积大小较为敏感的使用者,可使用以下建议的替代方案

    1. 删除在本AAChartKit项目文件中,AAJSFiles文件夹下的5.js文件.需要被删除的文件名称如下
    • AAJQueryLibrary.js
    • AAHighchartsLibrary.js
    • AAHighchartsMore.js
    • AAHighcharts-3d.js
    • AAFunnel.js
    1. AAChartView.html文件中的以下内容
    <script src="AAJQueryLibrary.js">
    </script>
    <script src="AAHighchartsLibrary.js">
    </script>
    <script src="AAHighchartsMore.js">
    </script>
    <script src="AAHighcharts-3d.js">
    </script>
    <script src="AAFunnel.js">
    </script>
    

    替换为

    <script src="https://img.hcharts.cn/jquery/jquery-1.8.3.min.js">
    </script>
    <script src="https://img.hcharts.cn/highcharts/highcharts.js">
    </script>
    <script src="https://img.hcharts.cn/highcharts/highcharts-more.js">
    </script>
    

    即可.

    此方案是将原本加载放置在本地的.js依赖文件改为了加载放置在网络上的.js文件,减小了本地文件大小,但有可能会有一定的网络延迟(0.5s 以内),所以建议AAChartKit用户可根据自己的实际项目的开发需要,酌情选择最终是否使用本替代方案.

    GitHub 传送门

    https://github.com/AAChartModel/AAChartKit

    3 条回复    2017-08-27 18:50:55 +08:00
    shadownet
        1
    shadownet  
       2017-08-26 09:34:28 +08:00 via iPhone
    不错 感谢分析
    cheng4741
        2
    cheng4741  
       2017-08-27 18:50:42 +08:00
    很棒,画图部分是用的 js 还是 oc
    cheng4741
        3
    cheng4741  
       2017-08-27 18:50:55 +08:00
    画图部分是用的 js 还是 oc
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2766 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 08:07 · PVG 16:07 · LAX 00:07 · JFK 03:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.