iOS YHChart 折線圖 柱狀圖 餅圖

YHChart 是使用Objective-C語言編寫,目前支持 折線圖 柱狀圖 餅圖 三種圖表

實(shí)現(xiàn)方式

主要基于原生CAShareLayer 和 UIBezierPath 結(jié)合畫線

坐標(biāo)軸支持

  • 平面上四個(gè)頂點(diǎn)為坐標(biāo)系的坐標(biāo)軸
  • 標(biāo)題使用AttributeString來控制顯示纵竖,支持格式化控制
  • 坐標(biāo)軸顯示寬度控制
  • 坐標(biāo)軸顯示位置控制 顯示在軸內(nèi)部還是外部
  • 支持雙Y軸
  • 坐標(biāo)軸刻度設(shè)置
    • 通過給定固定刻度值數(shù)值設(shè)置
    • 通過給定數(shù)據(jù)的值來自動設(shè)置坐標(biāo)軸信息
  • 坐標(biāo)軸按刻度設(shè)置
    • 按數(shù)值 根據(jù)具體的數(shù)值來定位刻度的位置
    • 不按數(shù)值 等分 坐標(biāo)軸 比如指數(shù)坐標(biāo)軸

折線圖支持

  • 平滑控制 曲線還是折線
  • 可虛線
  • 可陰影
  • 左右自動平移動畫
  • 多條
  • 折線點(diǎn)信息
  • 選中點(diǎn)視圖信息
  • 屏幕旋轉(zhuǎn)適配
  • 添加刪除更新

柱狀圖支持

  • 多條水平平分布局
  • 多條垂直疊加布局
  • 添加刪除更新

餅圖

  • 添加刪除
  • 內(nèi)圓
  • 標(biāo)注

示例:

折線圖-簡單

折線圖-平移動畫
折線圖-添加更新刪除
折線圖-右上坐標(biāo)軸
折線圖-對數(shù)坐標(biāo)軸
折線圖-雙Y軸
柱狀圖-簡單
柱狀圖-多條水平布局
柱狀圖-多條垂直布局
柱狀圖+折線圖
餅圖-簡單
餅圖-有內(nèi)圓

代碼示例

  • 坐標(biāo)軸
方式1:
    NSArray * list = @[@"7.59",@"7.5",@"7.4",@"7.3",@"7.2",@"7.1",@"7.0"];
    for(NSString * str in list){
        [scaleList addObject:[YHScaleItem att:YHVTitle(str) value:str.floatValue]];
    }
    [chartView2 updateAxisScaleList:scaleList width:40 position:(YHChartAxisPos_Left) dirction:(YHChartAxisDirection_BottomToTop) config:^(YHAxisElementInfo * _Nonnull axisInfo) {
        axisInfo.maxValue = 7.6;
        axisInfo.minValue = 7;
    }];

方式2:
    NSMutableArray * pointList = [NSMutableArray new];
    for(NSInteger i = 0; i < 11; i++){
        [pointList addObject:[YHLinePointItem valueX:i valueY:(i*4)%11]];
    }
    [chartView updateAxisAutoScaleCount:20
                              pointList:pointList
                                 format:[YHFormatDebug9 new]
                                  width:40
                               position:YHChartAxisPos_Bottom
                               dirction:YHChartAxisDirection_LeftToRight
                                 config:nil];

方式3:
不顯示坐標(biāo)軸
    chartView1.axisInfo.axisPos(YHChartAxisPos_Bottom).maxValue = 50;
    chartView1.axisInfo.axisPos(YHChartAxisPos_Left).maxValue = 50;

方式4:
平分坐標(biāo)軸刻度 指數(shù)軸
[chartView updateAxisScaleList:scaleList width:30 position:(YHChartAxisPos_Left) dirction:(YHChartAxisDirection_BottomToTop) config:^(YHAxisElementInfo * _Nonnull axisInfo) {
        axisInfo.isDeuceByScale = YES; 
        axisInfo.maxValue = 1000;
        axisInfo.minValue = 0.01;
    }];
  • 參考線
四邊坐標(biāo)軸線條:
[chartView addReflineAxisPosition:0xff width:1 color:[UIColor yh_separator] dotted:NO];

坐標(biāo)軸刻度對應(yīng)的參考線:
    [chartView addReflineAllAxisPos:YHChartAxisPos_Left config:^(YHReflineInfo * _Nonnull refline) {
        refline.lineColor = [UIColor yh_separator];
        refline.lineHeight = 1;
    }];
    [chartView addReflineAllAxisPos:(YHChartAxisPos_Bottom) config:^(YHReflineInfo * _Nonnull refline) {
        refline.lineColor = [UIColor yh_separator];
        refline.lineHeight = 1;
    }];

自定義位置添加參考線:
    [chartView3 addReflineConfig:^(YHReflineInfo * _Nonnull refline) {
        refline.showHorizontal = YES;
        refline.axisYValue = 30;
    }];

  • 折線實(shí)例
    YHLineChartItem * item = [YHLineChartItem new];
    item.coordInfoViewShow = YES; 顯示點(diǎn)坐標(biāo)數(shù)據(jù)信息
    item.lineColor = [UIColor yh_blue]; 折線顏色
    item.lineShowShadow = YES; 折線陰影
    item.lineShadowColorTop = [[UIColor yh_blue]  colorWithAlphaComponent:0.8]; 漸變開始顏色
    item.lineShadowColorBottom = [[UIColor yh_blue] colorWithAlphaComponent:0.1]; 漸變結(jié)束顏色
    item.pointFillColor = [UIColor whiteColor]; 折線點(diǎn) 填充色
    item.pointLineColor = [UIColor yh_blue]; 折線點(diǎn) 描邊色
    item.pointLineWidth = 1; 折線點(diǎn) 描邊大小
    item.pointRadius = 3; 折線點(diǎn) 圓點(diǎn)大小
    item.pointPicker.showReflineVertical = YES; 折線點(diǎn) 選中顯示垂直參考線
    item.pointPicker.showReflineHorizontal = YES; 折線點(diǎn) 選中顯示水平參考線
    item.pointPicker.canSelect = YES; 折線點(diǎn) 可選中
    item.pointPicker.radius = 4; 折線點(diǎn) 選中之后點(diǎn)的顏色
    item.pointPicker.fillColor = [UIColor yh_blue];
    item.pointPicker.lineWidth = 0;
  折線點(diǎn) 可選Toast提示視圖
    [item.pointPicker setToastViewBlock:^UIView * _Nonnull(YHLinePointItem * _Nonnull passPoint) {
        YHPointToastView * toastView = [YHPointToastView new];
        NSString * contentY = [NSString stringWithFormat:@"Y軸: %lf",passPoint.valueY];
        NSString * contentX = [NSString stringWithFormat:@"X軸: %lf",passPoint.valueX];
        NSString * content = [NSString stringWithFormat:@"%@\n%@",contentY,contentX];
        toastView.textTitle.text = content;
        return toastView;
    }];
    
    折線點(diǎn)的數(shù)據(jù)信息
    for(NSInteger i = 0; i < 11; i++){
        [item addPoint:[YHLinePointItem valueX:i valueY:(i*4)%11]];
    }
    添加到視圖中
    [chartView addLineChart:item];
  • 柱狀圖實(shí)例

        YHLineChartItem * item = [YHLineChartItem new];
        item.showType = YHChartShowType_Bar; 水平
        YHChartShowType_BarCombine 垂直
        item.barCenterToScaleOffset = 0; 水平布局的話 相對刻度點(diǎn)布局
        item.lineWidth = Adapted(5); 柱狀圖的寬度
        item.pointPicker.canSelect = YES;
        item.pointPicker.radius = Adapted(10);
        item.pointPicker.barSelectSingle = YES;可選中
        ...其他設(shè)置跟折線圖一樣
        [chartView addLineChart:item];

  • 餅圖實(shí)例
餅圖視圖
    YHPieChartView * chartView = [YHPieChartView new];
    chartView.backgroundColor = [[UIColor redColor] colorWithAlphaComponent:0.05];
    chartView.circleBgFillColor = [[UIColor grayColor] colorWithAlphaComponent:0.1];底色
    chartView.circleTopFillColor = [UIColor whiteColor];
    chartView.circleBorderWidth = 30;內(nèi)圓底色
    chartView.circleTopCenterAttTitle = [NSMutableAttributedString yh_initWithStr:@"我是中間的\n標(biāo)題內(nèi)容" customBlock:^(NSMutableAttributedString *att) {
        [att yh_font:[UIFont yh_pfOfSize:14]];
        [att yh_color:[UIColor yh_title_h3_note]];
        [att yh_color:[UIColor yh_red] range:[att.string rangeOfString:@"標(biāo)題內(nèi)容"]];
    }];
    [contentView addSubview:chartView];


餅塊信息
        YHPieChartItem * item = [YHPieChartItem new];
        item.value = arc4random()%100 + 1; 數(shù)值信息
        item.percent = item.value/200.0; 占的總比例 
如果添加單個(gè)要設(shè)置percent比例信息 如果是全部平分可不設(shè)置
        item.filleColor = [UIColor yh_randomcolor]; 填充色
        item.format = format;
        item.showAnnotation = YES; 顯示標(biāo)注點(diǎn)
        item.showAnnotationInside = YES; 標(biāo)注點(diǎn)位置
        [chartView addPercentPieBlock:item];
    YHLineChartView * chartView = [YHLineChartView new];

    坐標(biāo)軸Y
    NSMutableArray * scaleList = [NSMutableArray new];
    for(NSInteger i = 0; i < 11; i++){
        [scaleList addObject:[YHScaleItem att:YHHTitle(@(i).stringValue) value:i]];
    }
    [chartView updateAxisScaleList:scaleList width:40 position:(YHChartAxisPos_Bottom) dirction:(YHChartAxisDirection_LeftToRight)];

    坐標(biāo)軸X
    [scaleList removeAllObjects];
    for(NSInteger i = 0; i < 11; i++){
        [scaleList addObject:[YHScaleItem att:YHHTitle(@(i).stringValue) value:i]];
    }
    [chartView updateAxisScaleList:scaleList width:30 position:(YHChartAxisPos_Left) dirction:(YHChartAxisDirection_BottomToTop)];

    參考線
    [chartView addReflineAxisPosition:(YHChartAxisPos_Left) width:2 color:[UIColor yh_separator_dark] dotted:NO];
    [chartView addReflineAxisPosition:(YHChartAxisPos_Bottom) width:2 color:[UIColor yh_separator_dark] dotted:NO];
    [chartView addReflineAxisPosition:(YHChartAxisPos_Right) width:2 color:[UIColor yh_separator_dark] dotted:NO];
    [chartView addReflineAxisPosition:(YHChartAxisPos_Top) width:2 color:[UIColor yh_separator_dark] dotted:NO];
    [chartView addReflineAllAxisPos:YHChartAxisPos_Left config:^(YHReflineInfo * _Nonnull refline) {
        refline.lineColor = [UIColor yh_separator];
        refline.lineHeight = 1;
    }];
    [chartView addReflineAllAxisPos:(YHChartAxisPos_Bottom) config:^(YHReflineInfo * _Nonnull refline) {
        refline.lineColor = [UIColor yh_separator];
        refline.lineHeight = 1;
    }];

    折線圖
    YHLineChartItem * item = [YHLineChartItem new];
    item.coordInfoViewShow = YES;
    item.lineColor = [UIColor yh_blue];
    item.lineShowShadow = YES;
    item.lineShadowColorTop = [[UIColor yh_blue] colorWithAlphaComponent:0.8];
    item.lineShadowColorBottom = [[UIColor yh_blue] colorWithAlphaComponent:0.1];
    item.pointFillColor = [UIColor whiteColor];
    item.pointLineColor = [UIColor yh_blue];
    item.pointLineWidth = 1;
    item.pointRadius = 3;
    item.pointPicker.showReflineVertical = YES;
    item.pointPicker.showReflineHorizontal = YES;
    item.pointPicker.canSelect = YES;
    item.pointPicker.radius = 4;
    item.pointPicker.fillColor = [UIColor yh_blue];
    item.pointPicker.lineWidth = 0;
    [item.pointPicker setToastViewBlock:^UIView * _Nonnull(YHLinePointItem * _Nonnull passPoint) {
        YHPointToastView * toastView = [YHPointToastView new];
        NSString * contentY = [NSString stringWithFormat:@"Y軸: %lf",passPoint.valueY];
        NSString * contentX = [NSString stringWithFormat:@"X軸: %lf",passPoint.valueX];
        NSString * content = [NSString stringWithFormat:@"%@\n%@",contentY,contentX];
        toastView.textTitle.text = content;
        return toastView;
    }];
    
    數(shù)據(jù)
    for(NSInteger i = 0; i < 11; i++){
        [item addPoint:[YHLinePointItem valueX:i valueY:(i*4)%11]];
    }
    
    [chartView addLineChart:item];
    
    [contentView addSubview:chartView];
    [chartView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.right.top.equalTo(contentView);
        make.height.mas_equalTo(Adapted(180));

    }];

項(xiàng)目地址:https://github.com/MaiyaT/YHChart.git

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末巫俺,一起剝皮案震驚了整個(gè)濱河市恨旱,隨后出現(xiàn)的幾起案子罢维,更是在濱河造成了極大的恐慌函荣,老刑警劉巖唾戚,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡统求,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門扇雕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人窥摄,你說我怎么就攤上這事镶奉。” “怎么了?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵哨苛,是天一觀的道長鸽凶。 經(jīng)常有香客問我,道長建峭,這世上最難降的妖魔是什么玻侥? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮亿蒸,結(jié)果婚禮上凑兰,老公的妹妹穿的比我還像新娘。我一直安慰自己边锁,他們只是感情好姑食,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著茅坛,像睡著了一般矢门。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上灰蛙,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天,我揣著相機(jī)與錄音隔躲,去河邊找鬼摩梧。 笑死,一個(gè)胖子當(dāng)著我的面吹牛宣旱,可吹牛的內(nèi)容都是我干的仅父。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼浑吟,長吁一口氣:“原來是場噩夢啊……” “哼笙纤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起组力,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤省容,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后燎字,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體腥椒,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年候衍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了笼蛛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,696評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蛉鹿,死狀恐怖滨砍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤惋戏,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布领追,位于F島的核電站,受9級特大地震影響日川,放射性物質(zhì)發(fā)生泄漏蔓腐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一龄句、第九天 我趴在偏房一處隱蔽的房頂上張望回论。 院中可真熱鬧,春花似錦分歇、人聲如沸傀蓉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽葬燎。三九已至,卻和暖如春缚甩,著一層夾襖步出監(jiān)牢的瞬間谱净,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工擅威, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留壕探,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓郊丛,卻偏偏與公主長得像李请,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子厉熟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評論 2 353