ChartsOrg / Charts

Beautiful charts for iOS/tvOS/OSX! The Apple side of the crossplatform MPAndroidChart.
Apache License 2.0
27.51k stars 5.99k forks source link

How to implement line chart with multiple colors #5071

Open myDonghao opened 1 year ago

myDonghao commented 1 year ago
image
eddOrnelas commented 1 year ago

Asking the same thing :D

myDonghao commented 1 year ago

Asking the same thing :D

- (void)setTestData1 {

    ChartLimitLine *maxLine = [[ChartLimitLine alloc] initWithLimit:80 label:@"80"];
    maxLine.valueFont = [UIFont systemFontOfSize:8];
    maxLine.lineWidth = 1;
    maxLine.labelPosition = ChartLimitLabelPositionRightTop;
    maxLine.lineColor = [UIColor qmui_colorWithHexString:@"#FFA200"];
    [self.chartView.leftAxis addLimitLine:maxLine];

    ChartLimitLine *minLine = [[ChartLimitLine alloc] initWithLimit:60 label:@"60"];
    minLine.valueFont = [UIFont systemFontOfSize:8];
    minLine.lineWidth = 1;
    minLine.labelPosition = ChartLimitLabelPositionRightTop;
    minLine.lineColor = [UIColor redColor];
    [self.chartView.leftAxis addLimitLine:minLine];

    NSMutableArray *dataSets = [NSMutableArray array];

    // 第一段
    {
        NSMutableArray *firstValue = [NSMutableArray array];
        for (int i = 0; i < 10; i++) {
            // value 是 0 - 60 的随机数
            int value = [self getRandomNumber:60 to:80];
            ChartDataEntry *entry = [[ChartDataEntry alloc] initWithX:i y:value];
            [firstValue addObject:entry];

        }
        ChartDataEntry *entry = [[ChartDataEntry alloc] initWithX:10 y:60];
        [firstValue addObject:entry];
        LineChartDataSet *dataSet = [[LineChartDataSet alloc] initWithEntries:firstValue];
        dataSet.drawFilledEnabled = YES;
        dataSet.drawCirclesEnabled = YES;
        dataSet.drawCircleHoleEnabled = YES;
        dataSet.circleHoleColor = UIColor.whiteColor;

        dataSet.circleColors = @[
            [UIColor qmui_colorWithHexString:@"#FFA200"],
            [UIColor qmui_colorWithHexString:@"#FFA200"],
            [UIColor qmui_colorWithHexString:@"#FFA200"],
            [UIColor qmui_colorWithHexString:@"#FFA200"],
            [UIColor qmui_colorWithHexString:@"#FFA200"],
            [UIColor qmui_colorWithHexString:@"#FFA200"],
            [UIColor qmui_colorWithHexString:@"#FFA200"],
            [UIColor qmui_colorWithHexString:@"#FFA200"],
            [UIColor qmui_colorWithHexString:@"#FFA200"],
            [UIColor qmui_colorWithHexString:@"#FFA200"],
            [UIColor clearColor]
        ];
        dataSet.circleRadius = 3;
        dataSet.circleHoleRadius = 1;
        dataSet.lineWidth = 1;
        dataSet.mode = LineChartModeCubicBezier;
        dataSet.drawValuesEnabled = NO;
        NSArray *fillColors = @[
            (id)[ChartColorTemplates colorFromString:@"#00FFA200"].CGColor,
            (id)[ChartColorTemplates colorFromString:@"#FFFFA200"] .CGColor,
        ];
        CGGradientRef gradient = CGGradientCreateWithColors(nil, (CFArrayRef)fillColors, nil);
        dataSet.fillAlpha = 1.f;
        dataSet.fill = [[ChartLinearGradientFill alloc] initWithGradient:gradient angle:90.0f];

        [dataSet setColors:@[
            [UIColor qmui_colorWithHexString:@"#FFA200"],
       ]];
        [dataSets addObject:dataSet];
    }

    // 第二段
    {
    NSMutableArray *firstValue = [NSMutableArray array];
    ChartDataEntry *entry = [[ChartDataEntry alloc] initWithX:10 y:60];
    [firstValue addObject:entry];
    for (int i = 11; i < 20; i++) {
        int value = [self getRandomNumber:00 to:60];
        ChartDataEntry *entry = [[ChartDataEntry alloc] initWithX:i y:value];
        [firstValue addObject:entry];

    }

    LineChartDataSet *dataSet = [[LineChartDataSet alloc] initWithEntries:firstValue];
    dataSet.drawFilledEnabled = YES;
    dataSet.drawCirclesEnabled = YES;
    dataSet.drawCircleHoleEnabled = YES;
    dataSet.circleHoleColor = UIColor.whiteColor;

    dataSet.circleColors = @[
        [UIColor clearColor],
        [UIColor redColor],
        [UIColor redColor],
        [UIColor redColor],
        [UIColor redColor],
        [UIColor redColor],
        [UIColor redColor],
        [UIColor redColor],
        [UIColor redColor],
        [UIColor redColor]
    ];
    dataSet.circleRadius = 3;
    dataSet.circleHoleRadius = 1;
    dataSet.lineWidth = 1;
    dataSet.mode = LineChartModeCubicBezier;
    dataSet.drawValuesEnabled = NO;
    NSArray *fillColors = @[
        (id)[ChartColorTemplates colorFromString:@"#00FF0000"].CGColor,
        (id)[ChartColorTemplates colorFromString:@"#FFFF0000"] .CGColor,
    ];
    CGGradientRef gradient = CGGradientCreateWithColors(nil, (CFArrayRef)fillColors, nil);
    dataSet.fillAlpha = 1.f;
    dataSet.fill = [[ChartLinearGradientFill alloc] initWithGradient:gradient angle:90.0f];

    [dataSet setColors:@[
        [UIColor redColor],
        [UIColor orangeColor],
        [UIColor yellowColor],
    ]];

    dataSet.valueColors = @[
        [UIColor blueColor],
        [UIColor purpleColor],
        [UIColor systemPinkColor],
    ];

    [dataSets addObject:dataSet];
    }

    // 第三段

    LineChartData *chartData = [[LineChartData alloc] initWithDataSets:dataSets];
    self.chartView.data = chartData;
}
myDonghao commented 1 year ago

我用了这样一个思路,效果勉勉强强,不知道能不能给你启发