草庐IT

iOS-Charts(BarChartView)

小K’s Blog 2023-03-28 原文

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];

 

有关iOS-Charts(BarChartView)的更多相关文章

  1. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  2. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  3. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  4. ruby - 为什么不能使用类IO的实例方法noecho? - 2

    print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上

  5. ruby - 为 IO::popen 拯救 "command not found" - 2

    当我将IO::popen与不存在的命令一起使用时,我在屏幕上打印了一条错误消息:irb>IO.popen"fakefake"#=>#irb>(irb):1:commandnotfound:fakefake有什么方法可以捕获此错误,以便我可以在脚本中进行检查? 最佳答案 是:升级到ruby​​1.9。如果您在1.9中运行它,则会引发Errno::ENOENT,您将能够拯救它。(编辑)这是在1.8中的一种hackish方式:error=IO.pipe$stderr.reopenerror[1]pipe=IO.popen'qwe'#

  6. ruby - IO::EAGAINWaitReadable:资源暂时不可用 - 读取会阻塞 - 2

    当我尝试使用“套接字”库中的方法“read_nonblock”时出现以下错误IO::EAGAINWaitReadable:Resourcetemporarilyunavailable-readwouldblock但是当我通过终端上的IRB尝试时它工作正常如何让它读取缓冲区? 最佳答案 IgetthefollowingerrorwhenItrytousethemethod"read_nonblock"fromthe"socket"library当缓冲区中的数据未准备好时,这是预期的行为。由于异常IO::EAGAINWaitReadab

  7. ruby - 如何使用 ruby​​ fibers 避免阻塞 IO - 2

    我需要将目录中的一堆文件上传到S3。由于上传所需的90%以上的时间都花在了等待http请求完成上,所以我想以某种方式同时执行其中的几个。Fibers能帮我解决这个问题吗?它们被描述为解决此类问题的一种方法,但我想不出在http调用阻塞时我可以做任何工作的任何方法。有什么方法可以在没有线程的情况下解决这个问题? 最佳答案 我没有使用1.9中的纤程,但是1.8.6中的常规线程可以解决这个问题。尝试使用队列http://ruby-doc.org/stdlib/libdoc/thread/rdoc/classes/Queue.html查看文

  8. ruby-on-rails - Rails 如何为 Google Charts 构建数据结构 - 2

    我想使用googlecharts创建一个如下所示的图表:GoogleChart.pie_400x200('TacoBell'=>0,'Mediterranean'=>2,'Shivas'=>5)给定一个对象Results(name,count)。如何为GoogleCharts的结构创建一个对象,如上所示?谢谢 最佳答案 从您在评论中列为@results的结果对象开始,以下应该有效:GoogleChart.pie_400x200(@results.map{|r|{r[:title]=>r[:percentage]}})

  9. ruby - 如何从 ruby​​ 中的 IO 对象获取文件名 - 2

    在ruby中...我有一个由外部进程创建的IO对象,我需要从中获取文件名。然而我似乎只能得到文件描述符(3),这对我来说不是很有用。有没有办法从此对象获取文件名甚至获取文件对象?我正在从通知程序中获取IO对象。所以这也可能是获取文件路径的一种方式? 最佳答案 关于howtogetathefilenameinC也有类似的问题,我将在这里以ruby​​的方式给出这个问题的答案。在Linux中获取文件名假设io是您的IO对象。以下代码为您提供了文件名。File.readlink("/proc/self/fd/#{io.fileno}")例

  10. iOS快捷指令:执行Python脚本(利用iSH Shell) - 2

    文章目录前言核心逻辑配置iSH安装Python创建Python脚本配置启动文件测试效果快捷指令前言iOS快捷指令所能做的操作极为有限。假如快捷指令能运行Python程序,那么可操作空间就瞬间变大了。iSH是一款免费的iOS软件,它模拟了一个类似Linux的命令行解释器。我们将在iSH中运行Python程序,然后在快捷指令中获取Python程序的输出。核心逻辑我们用一个“获取当前日期”的Python程序作为演示(其实快捷指令中本身存在“获取当前日期”的操作,因而此需求可以不用Python,这里仅仅为了演示方便),核心代码如下。>>>importtime>>>time.strftime('%Y-%

随机推荐