iOS使用Charts框架繪制—柱形圖

首先看一下最終要實(shí)現(xiàn)的效果:

最終效果

一托嚣、初始化barChartView

繪制柱形圖需要用到BarChartView這個(gè)類判沟,下面是初始化代碼:

self.barChartView = [[BarChartView alloc] init];
self.barChartView.delegate = self;//設(shè)置代理
[self.view addSubview:self.barChartView];
[self.barChartView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.size.mas_equalTo(CGSizeMake(self.view.bounds.size.width-20, 300));
        make.center.mas_equalTo(self.view);
}];

二讲冠、設(shè)置barChartView的外觀樣式

1.基本樣式
self.barChartView.backgroundColor = [UIColor colorWithRed:230/255.0f green:253/255.0f blue:253/255.0f alpha:1];
self.barChartView.noDataText = @"暫無數(shù)據(jù)";//沒有數(shù)據(jù)時(shí)的文字提示
self.barChartView.drawValueAboveBarEnabled = YES;//數(shù)值顯示在柱形的上面還是下面
self.barChartView.drawHighlightArrowEnabled = NO;//點(diǎn)擊柱形圖是否顯示箭頭
self.barChartView.drawBarShadowEnabled = NO;//是否繪制柱形的陰影背景
2.barChartView的交互設(shè)置
self.barChartView.scaleYEnabled = NO;//取消Y軸縮放
self.barChartView.doubleTapToZoomEnabled = NO;//取消雙擊縮放
self.barChartView.dragEnabled = YES;//啟用拖拽圖表
self.barChartView.dragDecelerationEnabled = YES;//拖拽后是否有慣性效果
self.barChartView.dragDecelerationFrictionCoef = 0.9;//拖拽后慣性效果的摩擦系數(shù)(0~1)亡嫌,數(shù)值越小运沦,慣性越不明顯
3.設(shè)置barChartView的X軸樣式

首先需要先獲取到barChartView的X軸,然后進(jìn)行設(shè)置.
通過barChartViewxAxis屬性獲取到X軸涮母,代碼如下:

hartXAxis *xAxis = self.barChartView.xAxis;

設(shè)置X軸樣式的代碼如下:

ChartXAxis *xAxis = self.barChartView.xAxis;
xAxis.axisLineWidth = 1;//設(shè)置X軸線寬
xAxis.labelPosition = XAxisLabelPositionBottom;//X軸的顯示位置,默認(rèn)是顯示在上面的
xAxis.drawGridLinesEnabled = NO;//不繪制網(wǎng)格線
xAxis.spaceBetweenLabels = 4;//設(shè)置label間隔躁愿,若設(shè)置為1叛本,則如果能全部顯示,則每個(gè)柱形下面都會顯示label
xAxis.labelTextColor = [UIColor brownColor];//label文字顏色
4.設(shè)置barChartView的Y軸樣式

barChartView默認(rèn)樣式中會繪制左右兩側(cè)的Y軸彤钟,首先需要先隱藏右側(cè)的Y軸来候,代碼如下:

self.barChartView.rightAxis.enabled = NO;//不繪制右邊軸

接著開始設(shè)置左側(cè)Y軸的樣式.
首先設(shè)置Y軸軸線的樣式,代碼如下:

leftAxis.forceLabelsEnabled = NO;//不強(qiáng)制繪制制定數(shù)量的label
leftAxis.showOnlyMinMaxEnabled = NO;//是否只顯示最大值和最小值
leftAxis.axisMinValue = 0;//設(shè)置Y軸的最小值
leftAxis.startAtZeroEnabled = YES;//從0開始繪制
leftAxis.axisMaxValue = 105;//設(shè)置Y軸的最大值
leftAxis.inverted = NO;//是否將Y軸進(jìn)行上下翻轉(zhuǎn)
leftAxis.axisLineWidth = 0.5;//Y軸線寬
leftAxis.axisLineColor = [UIColor blackColor];//Y軸顏色

通過labelCount屬性設(shè)置Y軸要均分的數(shù)量.
在這里要說明一下逸雹,設(shè)置的labelCount的值不一定就是Y軸要均分的數(shù)量营搅,這還要取決于forceLabelsEnabled屬性,如果forceLabelsEnabled等于YES, 則強(qiáng)制繪制指定數(shù)量的label, 但是可能不是均分的.代碼如下:

ChartYAxis *leftAxis = self.barChartView.leftAxis;//獲取左邊Y軸
leftAxis.labelCount = 5;
leftAxis.forceLabelsEnabled = NO;

設(shè)置Y軸上標(biāo)簽的樣式梆砸,代碼如下:

leftAxis.labelPosition = YAxisLabelPositionOutsideChart;//label位置 
leftAxis.labelTextColor = [UIColor brownColor];//文字顏色
leftAxis.labelFont = [UIFont systemFontOfSize:10.0f];//文字字體

設(shè)置Y軸上標(biāo)簽顯示數(shù)字的格式转质,代碼如下:

leftAxis.valueFormatter = [[NSNumberFormatter alloc] init];//自定義格式
leftAxis.valueFormatter.positiveSuffix = @" $";//數(shù)字后綴單位

設(shè)置Y軸上網(wǎng)格線的樣式,代碼如下:

leftAxis.gridLineDashLengths = @[@3.0f, @3.0f];//設(shè)置虛線樣式的網(wǎng)格線
leftAxis.gridColor = [UIColor colorWithRed:200/255.0f green:200/255.0f blue:200/255.0f alpha:1];//網(wǎng)格線顏色
leftAxis.gridAntialiasEnabled = YES;//開啟抗鋸齒

在Y軸上添加限制線帖世,代碼如下:

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(jié)軸上
leftAxis.drawLimitLinesBehindDataEnabled = YES;//設(shè)置限制線繪制在柱形圖的后面
5.設(shè)置barChartView的其它樣式

通過legend獲取到圖例對象休蟹,然后把它隱藏掉,代碼如下:

self.barChartView.legend.enabled = NO;//不顯示圖例說明

隱藏描述文字日矫,代碼如下:

self.barChartView.descriptionText = @"";//不顯示赂弓,就設(shè)為空字符串即可

三、為barChartView的提供數(shù)據(jù)

barChartView提供數(shù)據(jù)是通過其data屬性提供的哪轿,首先需要?jiǎng)?chuàng)建BarChartData數(shù)據(jù)對象盈魁,代碼如下:

//為柱形圖設(shè)置數(shù)據(jù)
- (BarChartData *)setData{
    
    int xVals_count = 12;//X軸上要顯示多少條數(shù)據(jù)
    double maxYVal = 100;//Y軸的最大值
    
    //X軸上面需要顯示的數(shù)據(jù)
    NSMutableArray *xVals = [[NSMutableArray alloc] init];
    for (int i = 0; i < xVals_count; i++) {
        [xVals addObject:[NSString stringWithFormat:@"%d月", i+1]];
    }
    
    //對應(yīng)Y軸上面需要顯示的數(shù)據(jù)
    NSMutableArray *yVals = [[NSMutableArray alloc] init];
    for (int i = 0; i < xVals_count; i++) {
        double mult = maxYVal + 1;
        double val = (double)(arc4random_uniform(mult));
        BarChartDataEntry *entry = [[BarChartDataEntry alloc] initWithValue:val xIndex:i];
        [yVals addObject:entry];
    }
    
    //創(chuàng)建BarChartDataSet對象,其中包含有Y軸數(shù)據(jù)信息窃诉,以及可以設(shè)置柱形樣式
    BarChartDataSet *set1 = [[BarChartDataSet alloc] initWithYVals:yVals label:nil];
    set1.barSpace = 0.2;//柱形之間的間隙占整個(gè)柱形(柱形+間隙)的比例
    set1.drawValuesEnabled = YES;//是否在柱形圖上面顯示數(shù)值
    set1.highlightEnabled = NO;//點(diǎn)擊選中柱形圖是否有高亮效果杨耙,(雙擊空白處取消選中)
    [set1 setColors:ChartColorTemplates.material];//設(shè)置柱形圖顏色
    //將BarChartDataSet對象放入數(shù)組中
    NSMutableArray *dataSets = [[NSMutableArray alloc] init];
    [dataSets addObject:set1];
    
    //創(chuàng)建BarChartData對象, 此對象就是barChartView需要最終數(shù)據(jù)對象
    BarChartData *data = [[BarChartData alloc] initWithXVals:xVals dataSets:dataSets];
    [data setValueFont:[UIFont fontWithName:@"HelveticaNeue-Light" size:10.f]];//文字字體
    [data setValueTextColor:[UIColor orangeColor]];//文字顏色
    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
    //自定義數(shù)據(jù)顯示格式
    [formatter setNumberStyle:NSNumberFormatterDecimalStyle];
    [formatter setPositiveFormat:@"#0.0"];
    [data setValueFormatter:formatter];
    
    return data;
}

barChartView提供數(shù)據(jù)并設(shè)置動(dòng)畫效果赤套,代碼如下:

self.data = [self setData];
 //為柱形圖提供數(shù)據(jù)
 self.barChartView.data = self.data;
//設(shè)置動(dòng)畫效果,可以設(shè)置X軸和Y軸的動(dòng)畫效果
[self.barChartView animateWithYAxisDuration:1.0f];

四按脚、實(shí)現(xiàn)barChartView的代理方法

1.點(diǎn)擊選中柱形圖時(shí)的代理方法于毙,代碼如下:

- (void)chartValueSelected:(ChartViewBase * _Nonnull)chartView entry:(ChartDataEntry * _Nonnull)entry dataSetIndex:(NSInteger)dataSetIndex highlight:(ChartHighlight * _Nonnull)highlight{
    NSLog(@"---chartValueSelected---value: %g", entry.value);
}

2.沒有選中柱形圖時(shí)的代理方法,代碼如下:

- (void)chartValueNothingSelected:(ChartViewBase * _Nonnull)chartView{
    NSLog(@"---chartValueNothingSelected---");
}

當(dāng)選中一個(gè)柱形圖后辅搬,在空白處雙擊唯沮,就可以取消選擇,此時(shí)會回調(diào)此方法.
</br>
3.捏合放大或縮小柱形圖時(shí)的代理方法堪遂,代碼如下:

- (void)chartScaled:(ChartViewBase * _Nonnull)chartView scaleX:(CGFloat)scaleX scaleY:(CGFloat)scaleY{
    NSLog(@"---chartScaled---scaleX:%g, scaleY:%g", scaleX, scaleY);
}

4.拖拽圖表時(shí)的代理方法

- (void)chartTranslated:(ChartViewBase * _Nonnull)chartView dX:(CGFloat)dX dY:(CGFloat)dY{
    NSLog(@"---chartTranslated---dX:%g, dY:%g", dX, dY);
}

運(yùn)行結(jié)果如下:

運(yùn)行結(jié)果

Demo地址:BarChartDemo.

官網(wǎng)討論區(qū):https://github.com/danielgindi/Charts/issues?q=is%3Aopen

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末介蛉,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子溶褪,更是在濱河造成了極大的恐慌币旧,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件猿妈,死亡現(xiàn)場離奇詭異吹菱,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)彭则,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門鳍刷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人俯抖,你說我怎么就攤上這事输瓜。” “怎么了芬萍?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵尤揣,是天一觀的道長。 經(jīng)常有香客問我柬祠,道長北戏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任漫蛔,我火速辦了婚禮最欠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘惩猫。我一直安慰自己芝硬,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布轧房。 她就那樣靜靜地躺著拌阴,像睡著了一般启摄。 火紅的嫁衣襯著肌膚如雪因篇。 梳的紋絲不亂的頭發(fā)上胁孙,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天渴庆,我揣著相機(jī)與錄音,去河邊找鬼纤壁。 笑死左刽,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的酌媒。 我是一名探鬼主播欠痴,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼秒咨!你這毒婦竟也來了喇辽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤雨席,失蹤者是張志新(化名)和其女友劉穎菩咨,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體陡厘,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡抽米,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了糙置。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缨硝。...
    茶點(diǎn)故事閱讀 37,997評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖罢低,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情胖笛,我是刑警寧澤网持,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站长踊,受9級特大地震影響功舀,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜身弊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一辟汰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧阱佛,春花似錦帖汞、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至淮逊,卻和暖如春催首,著一層夾襖步出監(jiān)牢的瞬間扶踊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工郎任, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留秧耗,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓舶治,卻偏偏與公主長得像分井,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子歼疮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理杂抽,服務(wù)發(fā)現(xiàn),斷路器韩脏,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,498評論 25 707
  • 選擇qi:是表達(dá)式 標(biāo)簽選擇器 類選擇器 屬性選擇器 繼承屬性: color缩麸,font,text-align赡矢,li...
    love2013閱讀 2,303評論 0 11
  • 從籌備參加上海自行車展開始吹散,到今天伙伴們陸續(xù)離開去忙碌其他的工作弧械,已經(jīng)持續(xù)了一個(gè)多月的時(shí)間。展會期間空民,我們深...
    HarveyLee閱讀 372評論 5 3
  • 同學(xué)(美女界轩、帥哥)画饥,看一下。 我想很多人都聽過類似的話浊猾。畢竟如今發(fā)傳單的人實(shí)在太多了抖甘,走哪都是,或許曾經(jīng)...
    卷毛怕禿頭閱讀 664評論 29 4