Charts分析及使用

1.Charts源碼分析

1.1 文件組結構
QQ20171114-110302@2x.png
1.2 ChartView類型圖表簡析

BarLineChartViewBase與PieRadarChartViewBase共同點為均有橫坐標xAxis區別在于BarLineChartViewBase有YAlxis縱坐標


image.png
1.3 數據源

ChartDataEntry組成ChartDataSet,多組ChartDataSet構成ChartData。

1.4 渲染繪制過程

設置了chartView的data之后,在set方法里調用dataChanged的通知notifyDataSetChanged(),這個方法的具體實現是在每個子類的ChartView中自己實現,主要做的事情是:

1> 重新計算邊界值和offset偏移值
2> 調用setNeedsDisplay(),觸發視圖界面的刷新
3> 在ChartView的幾類和子類的drawRect方法中進行界面渲染:
i>. 獲取當前的CGContext
ii>. 繪制橫縱坐標軸
iii>. 繪制數據(我們提供的數據源)
iv>. 繪制額外的補充數據
v>. 繪制圖例(實際場景中餅圖必須,其他圖按需)
vi>. 繪制description(描述語)

2.使用場景

使用Charts框架可以實現折線圖、柱形圖、折線圖、散點圖、餅圖等,較常用的為折線圖、柱形圖。

3.基本用法 以柱狀圖為例

3.1 創建ChartView表格
    self.barChartView = [[BarChartView alloc] initWithFrame:CGRectMake(10, 300, self.view.frame.size.width - 20, 158)];
    self.barChartView.delegate = self;//設置代理
    [self.view addSubview:self.barChartView];
3.2 基本樣式 (按需設置)
    self.barChartView.backgroundColor = [UIColor colorWithRed:230/255.0f green:253/255.0f blue:253/255.0f alpha:1];
    self.barChartView.noDataText = @"暫無數據";//沒有數據時的文字提示
    self.barChartView.drawValueAboveBarEnabled = YES;//數值顯示在柱形的上面還是下面
    self.barChartView.drawBarShadowEnabled = NO;//是否繪制柱形的陰影背景
    self.barChartView.rightAxis.enabled = NO;//不繪制右邊軸
    self.barChartView.leftAxis.enabled = NO;//不繪制左邊軸
    self.barChartView.xAxis.enabled = NO;//不繪制X軸
    self.barChartView.legend.enabled = NO;//不顯示圖例說明
    self.barChartView.descriptionText = @"";//右下角的description文字樣式不顯示,就設為空字符串即
  /*
     //X軸樣式
     ChartXAxis *xAxis = self.barChartView.xAxis;
     xAxis.axisLineWidth = 1;//設置X軸線寬
     xAxis.labelPosition = XAxisLabelPositionBottom;//X軸的顯示位置,默認是顯示在上面的
     xAxis.drawGridLinesEnabled = NO;//不繪制網格線
     xAxis.labelTextColor = [UIColor brownColor];//label文字顏色
     
    //左邊Y軸樣式
    ChartYAxis *leftAxis = self.barChartView.leftAxis;//獲取左邊Y軸
    leftAxis.labelCount = 5;//Y軸label數量,數值不一定,如果forceLabelsEnabled等于YES, 則強制繪制制定數量的label, 但是可能不平均
    leftAxis.forceLabelsEnabled = NO;//不強制繪制制定數量的label
    leftAxis.axisMaxValue = 105;//設置Y軸的最大值
    leftAxis.inverted = NO;//是否將Y軸進行上下翻轉
    leftAxis.axisLineWidth = 0.5;//Y軸線寬
    leftAxis.axisLineColor = [UIColor blackColor];//Y軸顏色
    leftAxis.labelPosition = YAxisLabelPositionOutsideChart;//label位置
    leftAxis.labelTextColor = [UIColor brownColor];//文字顏色
    leftAxis.labelFont = [UIFont systemFontOfSize:10.0f];//文字字體
    //網格線樣式
    leftAxis.gridLineDashLengths = @[@3.0f, @3.0f];//設置虛線樣式的網格線
    leftAxis.gridColor = [UIColor colorWithRed:200/255.0f green:200/255.0f blue:200/255.0f alpha:1];//網格線顏色
    leftAxis.gridAntialiasEnabled = YES;//開啟抗鋸齒
    //添加限制線
    ChartLimitLine *limitLine = [[ChartLimitLine alloc] initWithLimit:80 label:@"限制線"];
    limitLine.lineWidth = 2;
    limitLine.lineColor = [UIColor greenColor];
    limitLine.lineDashLengths = @[@5.0f, @5.0f];//虛線樣式
    limitLine.labelPosition = ChartLimitLabelPositionRightTop;//位置
    [leftAxis addLimitLine:limitLine];//添加到Y軸上
    leftAxis.drawLimitLinesBehindDataEnabled = YES;//設置限制線繪制在柱形圖的后面
    */
3.3 交互設置
    self.barChartView.scaleYEnabled = NO;//取消Y軸縮放
    self.barChartView.doubleTapToZoomEnabled = NO;//取消雙擊縮放
    self.barChartView.dragEnabled = YES;//啟用拖拽圖表
    self.barChartView.dragDecelerationEnabled = YES;//拖拽后是否有慣性效果
    self.barChartView.dragDecelerationFrictionCoef = 0.9;//拖拽后慣性效果的摩擦系數(0~1),數值越小,慣性越不明顯
    [self.barChartView setVisibleXRangeMinimum:10.f];//設置只滑動 不縮放 (系統內部默認是先縮放后滑動)
    [self.barChartView setVisibleXRangeMaximum:10.f];
3.4 設置動畫效果
     [self.barChartView animateWithYAxisDuration:1.5f];//可以設置X軸和Y軸的動畫效果
3.5 表格數據設置
 //為柱形圖設置數據
- (BarChartData *)setData{
    int xVals_count = 18;//X軸上要顯示多少條數據
    //X軸上面需要顯示的數據
    NSMutableArray *xVals = [[NSMutableArray alloc] init];
    for (int i = 0; i < xVals_count; i++) {
        [xVals addObject:[NSString stringWithFormat:@"%d月", i+1]];
    }
    //對應Y軸上面需要顯示的數據
    NSMutableArray *yVals = [[NSMutableArray alloc] init];
    for (int i = 0; i < xVals_count; i++) {
        double val = 20+i>32?32:20+i;
        BarChartDataEntry *entry = [[BarChartDataEntry alloc] initWithX:i y:val];
        [yVals addObject:entry];
    }
    //創建BarChartDataSet對象,其中包含有Y軸數據信息,以及可以設置柱形樣式
    BarChartDataSet *set1 = [[BarChartDataSet alloc] initWithValues:yVals label:nil];
    set1.drawValuesEnabled = YES;//是否在柱形圖上面顯示數值
    set1.highlightEnabled = NO;//點擊選中柱形圖是否有高亮效果,(雙擊空白處取消選中)
    [set1 setColors:ChartColorTemplates.material];//設置柱形圖顏色
    set1.drawValuesEnabled = YES;//是否填充顏色
    //將BarChartDataSet對象放入數組中
    NSMutableArray *dataSets = [[NSMutableArray alloc] init];
    [dataSets addObject:set1];
    
    //創建BarChartData對象, 此對象就是barChartView需要最終數據對象
    BarChartData *data = [[BarChartData alloc] initWithDataSets:dataSets];
    [data setValueTextColor:[UIColor orangeColor]];//文字顏色
    data.barWidth = 0.6;//總共為1 數值越大柱狀條的寬度越大
    return data;
}
 //為柱形圖提供數據
    self.barChartView.data = [self setData];
3.6 常用代理事件
 #pragma mark - ChartViewDelegate
//點擊選中柱形時回調
- (void)chartValueSelected:(ChartViewBase * _Nonnull)chartView entry:(ChartDataEntry * _Nonnull)entry dataSetIndex:(NSInteger)dataSetIndex highlight:(ChartHighlight * _Nonnull)highlight{
}
//沒有選中柱形圖時回調,當選中一個柱形圖后,在空白處雙擊,就可以取消選擇,此時會回調此方法
- (void)chartValueNothingSelected:(ChartViewBase * _Nonnull)chartView{
    NSLog(@"---chartValueNothingSelected---");
}
//放大圖表時回調
- (void)chartScaled:(ChartViewBase * _Nonnull)chartView scaleX:(CGFloat)scaleX scaleY:(CGFloat)scaleY{
//    NSLog(@"---chartScaled---scaleX:%g, scaleY:%g", scaleX, scaleY);
}
//拖拽圖表時回調
- (void)chartTranslated:(ChartViewBase * _Nonnull)chartView dX:(CGFloat)dX dY:(CGFloat)dY{
//    NSLog(@"---chartTranslated---dX:%g, dY:%g", dX, dY);
}
3.7 數據改變時 刷新數據
   -(void)updateData{
    //數據改變時,刷新數據
    self.data = [self setData];
    self.barChartView.data = self.data;
    [self.barChartView notifyDataSetChanged];
}

4.使用注意事項

1> y軸顯示默認為double類型,需要自定義的,比如需要顯示為9%,此時需要去自定義一個類遵循<IChartAxisValueFormatter>的協議來完成
2> 未提供方法設置柱狀圖的圓角,需要自行修改三方庫文件drawDataSet方法,可參照如下https://github.com/danielgindi/Charts/issues/1066

5.參考資料

【Charts開源庫鏈接】 https://github.com/danielgindi/Charts
【Charts源碼解讀】http://www.lxweimin.com/p/b183ff57df01

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容