Charts 折线图常用属性以及一些扩展

使用:

 _chartView =[[LineChartView alloc]initWithFrame:CGRectMake(10, 0, ScreenWidth -20, SCREEN_HEIGHT - 200)];
    [self.view addSubview:_chartView];
    _chartView.delegate = self;
    _chartView.chartDescription.enabled = NO;
    _chartView.dragEnabled = YES;
    [_chartView setScaleEnabled:NO];
    _chartView.pinchZoomEnabled = NO;
    _chartView.drawGridBackgroundEnabled = YES;

    _chartView.xAxis.gridLineDashLengths = @[@10.0, @10.0];
    _chartView.xAxis.gridLineDashPhase = 0.f;
    //Y轴设置
    ChartYAxis *leftAxis = _chartView.leftAxis;
    [leftAxis removeAllLimitLines];
    leftAxis.axisMaximum = 120.0; //最大值
    leftAxis.axisMinimum = -0.0; //最小值
    leftAxis.gridLineDashLengths = @[@5.f, @5.f];
    leftAxis.drawZeroLineEnabled = NO;
    leftAxis.drawLimitLinesBehindDataEnabled = YES;
    leftAxis.inverted = NO;//是否翻转
    //Y轴上数据格式
    leftAxis.valueFormatter = [[SymbolsValueFormatter alloc]init];
    leftAxis.labelPosition = YAxisLabelPositionOutsideChart;//label位置
    leftAxis.labelTextColor = [UIColor blackColor];//文字颜色
    leftAxis.labelFont = [UIFont systemFontOfSize:10.0f];//文字字体
    leftAxis.gridColor = [UIColor grayColor];//网格线颜色
    leftAxis.gridAntialiasEnabled = NO;//开启抗锯齿
    _chartView.rightAxis.enabled = NO;

    //X轴设置
    ChartXAxis *xAxis = _chartView.xAxis;
    xAxis.granularityEnabled = YES;//设置重复的值不显示
    xAxis.labelPosition= XAxisLabelPositionBottom;//设置x轴数据在底部
    xAxis.gridColor = [UIColor clearColor];
    xAxis.labelTextColor = [UIColor blackColor];//x轴上文字颜色
    xAxis.axisLineColor = [UIColor redColor];
    //X轴上数据格式
    xAxis.valueFormatter = [[DateValueFormatter alloc]init];

    _chartView.legend.form = ChartLegendFormLine;

    ChartViewPortHandler *scaleX = _chartView.viewPortHandler;

    [scaleX setMinimumScaleX:1.5f];//只滑动不缩放:(系统内部默认是先缩放后滑动)及初始化时x轴就缩放1.5倍,就可以滑动了,
    [_chartView animateWithXAxisDuration:2.5];

    [self setDataCount:20 range:100];
 //每一条线代表一条dataSet
    LineChartDataSet *set1 = nil;
    if (_chartView.data.dataSetCount > 0)
    {
        set1 = (LineChartDataSet *)_chartView.data.dataSets[0];
        [set1 replaceEntries: values];
        [_chartView.data notifyDataChanged];
        [_chartView notifyDataSetChanged];
    }
    else
    {
        //折线数据填充
        set1 = [[LineChartDataSet alloc] initWithEntries:values label:@"第一条折线"];
        set1.valueFormatter =[[SetValueFormatter alloc]initWithArr:values];
        set1.mode = LineChartModeCubicBezier;//平滑曲线
        set1.drawIconsEnabled = NO;
        set1.lineDashLengths = @[@5.f, @2.5f];
        set1.highlightLineDashLengths = @[@5.f, @2.5f];
        [set1 setColor:UIColor.blackColor];//线条颜色
        [set1 setCircleColor:UIColor.redColor];//圆圈的颜色
        set1.lineWidth = 1.0;
        set1.circleRadius = 8.0;
        set1.circleHoleRadius = 4;//小圆半径
        set1.circleHoleColor =  UIColor.blueColor;//小圆颜色
        set1.drawCircleHoleEnabled = YES;//是否绘制小圆
        set1.valueFont = [UIFont systemFontOfSize:9.f];//曲线上valulLabel的大小
        
        //最下方第一条折线的设置
        set1.formLineDashLengths = @[@5.f, @2.5f];
        set1.formLineWidth = 1.0;
        set1.formSize = 15.0;
        
        //渐变色设置
        NSArray *gradientColors = @[
                                    (id)[ChartColorTemplates colorFromString:@"#00ff0000"].CGColor,
                                    (id)[ChartColorTemplates colorFromString:@"#ffff0000"].CGColor
                                    ];
        CGGradientRef gradient = CGGradientCreateWithColors(nil, (CFArrayRef)gradientColors, nil);
        
        set1.fillAlpha = 1.0f;
        set1.fill = [ChartFill fillWithLinearGradient:gradient angle:90.f];
        set1.drawFilledEnabled = YES;
        CGGradientRelease(gradient);
        NSMutableArray *dataSets = [[NSMutableArray alloc] init];
        [dataSets addObject:set1];
        
        LineChartData *data = [[LineChartData alloc] initWithDataSets:dataSets];
        
        //赋予chartView数据
        _chartView.data = data;

注意点

x轴,y轴的数据自定义需要遵守协议:IChartAxisValueFormatter
折线上的数据自定义需要遵守协议:IChartValueFormatter

- (NSString *)stringForValue:(double)value axis:(ChartAxisBase *)axis
{
    return [NSString stringWithFormat:@"%.f月",value];
}

上面方法返回的value就是真实值

一些使用细节

WX20190926-165333@2x.png

如上图的需求,对charts做一些定制化,简单总结下属性:

X 轴:

如果需要记录x轴文字选中的属性,需要在高亮的方法中记录LineChartRenderer中记录highLightIndex

 open override func drawHighlighted(context: CGContext, indices: [Highlight])
    {
        guard
            let dataProvider = dataProvider,
            let lineData = dataProvider.lineData
            else { return }
        
        let chartXMax = dataProvider.chartXMax
        
        context.saveGState()
        
        for high in indices
        {
            guard let set = lineData.getDataSetByIndex(high.dataSetIndex) as? ILineChartDataSet
                , set.isHighlightEnabled
                else { continue }
            
            guard let e = set.entryForXValue(high.x, closestToY: high.y) else { continue }
            
            if !isInBoundsX(entry: e, dataSet: set)
            {
                continue
            }
        
            highLightIndex = e.x

在绘制的时候把高亮给x轴,BarLineChartViewBasedraw方法中:

  xAxisRenderer.highLightIndex = index

最后在XAxisRenderer类中 drawLabels(context: CGContext, pos: CGFloat, anchor: CGPoint)的方法中改动即可

if highLightIndex == i {
                 labelAttrs =  [
                    .font: xAxis.labelHighLightFont,
                    .foregroundColor: xAxis.labelHighLighhtTextColor,
                    .paragraphStyle: paraStyle
                ]
            }else{
                labelAttrs = [
                .font: xAxis.labelFont,
                .foregroundColor: xAxis.labelTextColor,
                .paragraphStyle: paraStyle
                ]
            }

Y 轴的一些常用设置:

如果需要定制Y轴的分段个数,必须用以下方法设置设置,这个方法里会重新设置forceLabelsEnabled

leftAxis setLabelCount:count force:YES];

如果需要定制Y轴文字显示的小数点,单位等等
可以继承NSNumberFormatter,遵守协议IChartAxisValueFormatter,实现方法:

//左侧Y轴单位
    ValueFormatter *yFormatter =[[ValueFormatter alloc]init];
        
        yFormatter.positiveSuffix = @"度";
    }
      设置小数点
        yFormatter.maximumFractionDigits = 2;
        yFormatter.minimumFractionDigits = 2;

    }
//返回y轴的数据
- (NSString *)stringForValue:(double)value axis:(ChartAxisBase *)axis
{
        return [self stringFromNumber:[NSNumber numberWithDouble:value]];
    }
    
}

如上图,需求是Y轴6条线,需要显示3个分段,我们可以这样处理:

//返回y轴的数据
- (NSString *)stringForValue:(double)value axis:(ChartAxisBase *)axis
{
    NSArray *array = axis.entries;
    NSInteger index = 0;
    for (NSNumber *obj in array) {
        if ([obj doubleValue] == value) {
            index = [array indexOfObject:obj];
            break;
        }
    }
    if (index % _ignoreCount == 0 && _ignoreCount != 0) {
        return @"";
    }else{
        return [self stringFromNumber:[NSNumber numberWithDouble:value]];
    }
    
}

折线的设置:
如果需要做选中的一些操作,必须打开,set.highlightEnabled = YES,否则高亮时没有的; 打开后,会出现十字线。十字线的启动属性:

//选中拐点,是否开启高亮效果(显示十字线)
            set.drawVerticalHighlightIndicatorEnabled = NO;
            set.drawHorizontalHighlightIndicatorEnabled = NO;

如果是多条折线,不同的折线代表的内容不同,必如一个是温度曲线,一个是水量曲线,那么就需要设置折线依赖属性:axisDependency

set.axisDependency = AxisDependencyLeft; //AxisDependencyRight 依赖左侧Y轴,依赖右侧Y轴

是否绘制曲线上的文字:

set.drawValuesEnabled = NO
圆.png

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

推荐阅读更多精彩内容

  • 折线图 import UIKit importCharts publicclassLineChartControl...
    你美你媚儿阅读 2,795评论 0 1
  • Charts是一个很强大的工具,内容丰富。正因为内容包含之广,所以他的各种配置至关重要。下面我就为大家简单介绍一下...
    莹莹张阅读 391评论 0 3
  • 公司的项目要使用到折线图,然后用的是第三方Charts框架,不得不说Charts很强大的一个第三方,几乎所有你想要...
    遥远de年代阅读 38,391评论 105 74
  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 13,523评论 0 38
  • This chapter covers the basic setup for using this librar...
    ngugg阅读 940评论 0 1