iOS-Charts(BarChartView)


Charts - BarChartView

初始化

- (BarChartView *)chartView{
    if (!_chartView) {
        _chartView = [[BarChartView alloc]init];
        _chartView.delegate = self;
        
        ///外觀樣式
        //BarChartView
        _chartView.backgroundColor = [UIColor whiteColor];
        //沒有數據時的文字提示
        _chartView.noDataText = @"沒有數據";
        //數值顯示在柱形的上面還是下面
        _chartView.drawValueAboveBarEnabled = YES;
        //是否繪制柱形的陰影背景
        _chartView.drawBarShadowEnabled = NO;
        //交互設置
        //取消Y軸縮放
        _chartView.scaleYEnabled = NO;
        //取消雙擊縮放
        _chartView.doubleTapToZoomEnabled = NO;
        //啟用拖拽圖表
        _chartView.dragEnabled = YES;
        //拖拽后是否有慣性效果
        _chartView.dragDecelerationEnabled = YES;
        //拖拽后慣性效果的摩擦系數(0~1),數值越小,慣性越不明顯
        _chartView.dragDecelerationFrictionCoef = 0.5;
        
        
        ///X 軸
        ChartXAxis *xAxis = _chartView.xAxis;
        xAxis.axisLineWidth = 0.5;//設置X軸線寬
        //X軸的顯示位置
        xAxis.labelPosition = XAxisLabelPositionBottom;
        //不繪制網格線
        xAxis.drawGridLinesEnabled = NO;
        //設置label間隔,若設置為1,每個柱形下面都會顯示label
        xAxis.spaceMin = 1;
        xAxis.labelTextColor = [UIColor lightGrayColor];//label文字顏色
        xAxis.axisLineColor =  [UIColor redColor];//軸顏色
        ///間隔
        xAxis.granularity = 1.0;
        
        ///Y軸
        
        //不繪制右邊軸
        _chartView.rightAxis.enabled = NO;
        ChartYAxis *leftAxis = _chartView.leftAxis;
        //不強制繪制制定數量的label
        leftAxis.forceLabelsEnabled = NO;
        //設置Y軸的最小值
        leftAxis.axisMinimum = 0;
        //從0開始繪制
        leftAxis.drawZeroLineEnabled = YES;
        //設置Y軸的最大值(配合數據源設置,也可不設置)
        leftAxis.axisMaximum = 50;
        //是否將Y軸進行上下翻轉
        leftAxis.inverted = NO;
        //Y軸線寬
        leftAxis.axisLineWidth = 0.5;
        leftAxis.axisLineColor = [UIColor lightGrayColor];//Y軸顏色
        
        leftAxis.zeroLineColor = [UIColor lightGrayColor];
        //label位置
        leftAxis.labelPosition = YAxisLabelPositionOutsideChart;
        //文字顏色
        leftAxis.labelTextColor = [UIColor lightGrayColor];
        //文字字體
        leftAxis.labelFont = [UIFont systemFontOfSize:10.0f];
        
        //設置虛線樣式的網格線
        leftAxis.gridLineDashLengths = @[@3.0f, @3.0f];
        //網格線顏色
        leftAxis.gridColor = [UIColor lightGrayColor];
        leftAxis.gridAntialiasEnabled = YES;//開啟抗鋸齒
        
        //設置Y軸顯示
        NSNumberFormatter *leftAxisFormatter = [[NSNumberFormatter alloc] init];
        leftAxisFormatter.positiveSuffix = @"";
        leftAxis.valueFormatter = [[ChartDefaultAxisValueFormatter alloc] initWithFormatter:leftAxisFormatter];
        
        ///圖例說明
        _chartView.legend.enabled = YES;
        _chartView.legend.verticalAlignment = ChartLegendVerticalAlignmentTop;
        _chartView.legend.horizontalAlignment = ChartLegendHorizontalAlignmentRight;
        _chartView.legend.form = ChartLegendFormCircle;
        _chartView.legend.yOffset = 20;
        
    }
    return _chartView;
}

代理<ChartViewDelegate>

#pragma mark 圖表中數值被選中
-(void)chartValueSelected:(ChartViewBase *)chartView entry:(ChartDataEntry *)entry highlight:(ChartHighlight *)highlight{
    
}

#pragma mark 圖表中的空白區域被選中
-(void)chartValueNothingSelected:(ChartViewBase *)chartView{
}

#pragma mark 圖表被縮放
-(void)chartScaled:(ChartViewBase *)chartView scaleX:(CGFloat)scaleX scaleY:(CGFloat)scaleY{
}

#pragma mark 圖表被移動
-(void)chartTranslated:(ChartViewBase *)chartView dX:(CGFloat)dX dY:(CGFloat)dY{

}

設置單個柱狀圖數據源

- (BarChartData *)barSingleData{
    //X軸底部數據
    NSMutableArray<NSString *> *xVals = [[NSMutableArray alloc] init];
    //對應Y軸(柱狀圖數據)
    NSMutableArray *yVals = [[NSMutableArray alloc] init];

    double dataSetMax = 0;
    
    for (int i = 0; i < _count; i++) {
        double value =  arc4random()%60 + 6;
        dataSetMax = MAX(value, dataSetMax);
        BarChartDataEntry *entry = [[BarChartDataEntry alloc] initWithX:i y:value];
        [yVals addObject:entry];

        [xVals addObject:[NSString stringWithFormat:@"k-%d",i]];
    }
    self.xValues = xVals;
    ///X 軸
    ChartXAxis *xAxis = self.chartView.xAxis;
    xAxis.labelCount = _count;
    ChartIndexAxisValueFormatter *valueFormatter = [[ChartIndexAxisValueFormatter alloc]initWithValues:xVals];
    xAxis.valueFormatter = valueFormatter;
    
    ChartYAxis *leftAxis = self.chartView.leftAxis;
    leftAxis.axisMaximum = dataSetMax;
    BarChartDataSet *set1 = [[BarChartDataSet alloc] initWithEntries:yVals label:@"柱狀圖-圖例說明"];
    //是否在柱形圖上面顯示數值
    set1.drawValuesEnabled = YES;
    //點擊選中柱形圖是否有高亮效果
    set1.highlightEnabled = NO;
    //柱狀圖顏色
    [set1 setColor:[UIColor paleVioletRed]];
    
    NSNumberFormatter *set1Formatter = [[NSNumberFormatter alloc] init];
    set1Formatter.numberStyle = NSNumberFormatterDecimalStyle;
    set1Formatter.positiveSuffix = @"";
    set1.valueFormatter = [[ChartDefaultValueFormatter alloc] initWithFormatter:set1Formatter];
    set1.axisDependency = AxisDependencyRight;
    BarChartData *data = [[BarChartData alloc] initWithDataSets:@[set1]];
    //文字字體
    data.barWidth = 0.6;
    [data setValueFont:[UIFont fontWithName:@"HelveticaNeue-Light" size:10.f]];
    //文字顏色
    [data setValueTextColor:[UIColor paleVioletRed]];
   
    return data;
}

 加載數據源

self.chartView.data = [self barSingleData];
[self.chartView animateWithYAxisDuration:0.25f];

設置多個柱狀圖組數據源

//為柱形圖設置數據
- (BarChartData *)barGroupData{
    //X軸底部數據
    NSMutableArray<NSString *> *xVals = [[NSMutableArray alloc] init];
    //對應Y軸(柱狀圖數據)
    NSMutableArray *yVals1 = [[NSMutableArray alloc] init];
    //對應Y軸(柱狀圖數據)
    NSMutableArray *yVals2 = [[NSMutableArray alloc] init];
    //對應Y軸(柱狀圖數據)
    NSMutableArray *yVals3 = [[NSMutableArray alloc] init];
    
    //對應Y軸(柱狀圖數據)
    NSMutableArray *yVals4 = [[NSMutableArray alloc] init];
    
    double dataSetMax = 0;
//    float groupSpace = 0.2;
//    float barSpace = 0.05;
//    float barWidth = 0.15;
    
    float groupSpace = 0.3;
    float barSpace = 0.05;
    float barWidth = 0.3;
    
    for (int i = 0; i < _count; i++) {
        double value1 =  arc4random()%60 + 6;
        double value2 =  arc4random()%65 + 6;
        double value3 =  arc4random()%65 + 2;
        double value4 =  arc4random()%30 + 2;
        
        dataSetMax = MAX(value1, dataSetMax);
        dataSetMax = MAX(value2, dataSetMax);
        dataSetMax = MAX(value3, dataSetMax);
        
        dataSetMax = MAX(value4, dataSetMax);
        
        BarChartDataEntry *entry1 = [[BarChartDataEntry alloc] initWithX:i y:value1];
        [yVals1 addObject:entry1];

        BarChartDataEntry *entry2 = [[BarChartDataEntry alloc] initWithX:i y:value2];
        [yVals2 addObject:entry2];
        
        BarChartDataEntry *entry3 = [[BarChartDataEntry alloc] initWithX:i y:value3];
        [yVals3 addObject:entry3];
        
        BarChartDataEntry *entry4 = [[BarChartDataEntry alloc] initWithX:i y:value4];
        [yVals4 addObject:entry4];
        
        [xVals addObject:[NSString stringWithFormat:@"k-%d",i]];
    }
    self.xValues = xVals;
   
    
    BarChartDataSet *set1 = [[BarChartDataSet alloc] initWithEntries:yVals1 label:@"圖例說明1"];
    //是否在柱形圖上面顯示數值
    set1.drawValuesEnabled = YES;
    //點擊選中柱形圖是否有高亮效果
    set1.highlightEnabled = NO;
    //柱狀圖顏色
    [set1 setColor:[UIColor paleVioletRed]];
    set1.valueTextColor = [UIColor paleVioletRed];


    
    BarChartDataSet *set2 = [[BarChartDataSet alloc] initWithEntries:yVals2 label:@"圖例說明2"];
    //是否在柱形圖上面顯示數值
    set2.drawValuesEnabled = YES;
    //點擊選中柱形圖是否有高亮效果
    set2.highlightEnabled = NO;
    //柱狀圖顏色
    [set2 setColor:[UIColor rosyBrown]];
    set2.valueTextColor = [UIColor rosyBrown];

    
    
    BarChartDataSet *set3 = [[BarChartDataSet alloc] initWithEntries:yVals3 label:@"圖例說明3"];
    //是否在柱形圖上面顯示數值
    set3.drawValuesEnabled = YES;
    //點擊選中柱形圖是否有高亮效果
    set3.highlightEnabled = NO;
    //柱狀圖顏色
    [set3 setColor:[UIColor darkCyan]];
    set3.valueTextColor = [UIColor darkCyan];

    BarChartDataSet *set4 = [[BarChartDataSet alloc] initWithEntries:yVals4 label:@"圖例說明4"];
    //是否在柱形圖上面顯示數值
    set4.drawValuesEnabled = YES;
    //點擊選中柱形圖是否有高亮效果
    set4.highlightEnabled = NO;
    //柱狀圖顏色
    [set4 setColor:[UIColor darkSlateGray]];
    set4.valueTextColor = [UIColor darkSlateGray];
    
    
    BarChartData *data = [[BarChartData alloc] initWithDataSets:@[set1,set3]];
    //文字字體
    data.barWidth = barWidth;
    [data setValueFont:[UIFont fontWithName:@"HelveticaNeue-Light" size:10.f]];
    //文字顏色
//    [data setValueTextColor:[UIColor forestGreen]];
    ///X 軸
    ChartXAxis *xAxis = self.chartView.xAxis;
    xAxis.labelCount = _count;
    ChartIndexAxisValueFormatter *valueFormatter = [[ChartIndexAxisValueFormatter alloc]initWithValues:xVals];
    xAxis.valueFormatter = valueFormatter;
    
    ChartYAxis *leftAxis = self.chartView.leftAxis;
    leftAxis.axisMaximum = dataSetMax;
    
    
    self.chartView.xAxis.axisMaximum = -0.5 + [data groupWidthWithGroupSpace:groupSpace barSpace: barSpace] * xVals.count;
    [self.chartView.xAxis setLabelCount:xVals.count];
    [data groupBarsFromX: -0.5 groupSpace: groupSpace barSpace: barSpace];
    
    return data;
}

 加載數據源

self.chartView.data = [self barGroupData];
[self.chartView animateWithYAxisDuration:0.25f]

 

 多組柱狀圖設置注意事項

(barWidth + barSpace)* 組內個數 + groupSpace = 1.00->每個""的間隔 granularity
self.chartView.xAxis.axisMaximum = -0.5 + [data groupWidthWithGroupSpace:groupSpace barSpace: barSpace] * xVals.count;
[data groupBarsFromX: -0.5 groupSpace: groupSpace barSpace: barSpace];

設置初始可見數量

需設置數據源后設置,設置可見數量后,可滑動顯示其后面數據

[self.chartView setVisibleXRangeMaximum:7];

 

 

設置X軸 Label 旋轉 角度

self.chartView.xAxis.labelRotationAngle = -30;

自定義 valueFormatter

以柱形圖上面顯示數值為例,自定義 valueFormatter ,首先創建 自定義 valueFormatter 文件,實現相關代理(同理X軸與Y軸也可自定義)

@interface KBarValueFormatter : NSObject<IChartValueFormatter>
@property (weak, nonatomic) id<IChartValueFormatter> delegate;
@property (strong, nonatomic) NSNumberFormatter * formatter;
- (instancetype)initWithNumber:(NSNumberFormatter *)formatter;
@end
@implementation KBarValueFormatter
- (instancetype)initWithNumber:(NSNumberFormatter *)formatter{
    
    if (self = [super init]) {
        self.delegate = self;
        self.formatter = formatter;
    }
    
    return self;
}

- (NSString *)stringForValue:(double)value entry:(ChartDataEntry *)entry dataSetIndex:(NSInteger)dataSetIndex viewPortHandler:(ChartViewPortHandler *)viewPortHandler{
    return [[self.formatter stringForObjectValue:@(value)] stringByAppendingFormat:@"-%d",arc4random()%9];
}
@end

 初始化自定義valueFormatter

- (KBarValueFormatter *)barValueFormatter{
    if (!_barValueFormatter) {
        NSNumberFormatter *set1Formatter = [[NSNumberFormatter alloc] init];
        set1Formatter.numberStyle = NSNumberFormatterDecimalStyle;
        set1Formatter.positiveSuffix = @"";
        _barValueFormatter = [[KBarValueFormatter alloc]initWithNumber:set1Formatter];
    }
    return _barValueFormatter;
}

設置 BarChartDataSet 的 valueFormatter

set1.valueFormatter = self.barValueFormatter.delegate;

 

關於 makerView

自定義一個基於UIView 的 makerView,同時需要將柱狀圖的點擊高亮打開

set1.highlightEnabled = YES;
[set1 setHighlightColor:[UIColor paleVioletRed]];

初始化 makerView

- (KBarMarkerView *)barMarkerView{
    if (!_barMarkerView) {
        _barMarkerView = [[KBarMarkerView alloc]init];
        _barMarkerView.frame = (CGRect){0,0,120,60};
    }
    return _barMarkerView;
}

配置 makerView

ChartMarkerView *makerView = [[ChartMarkerView alloc]init];
makerView.offset = CGPointMake(- self.barMarkerView.frame.size.width/2,-self.barMarkerView.frame.size.height);
makerView.chartView = self.chartView;
self.chartView.marker = makerView;
[makerView addSubview:self.barMarkerView];

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM