- (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;
}
#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];


self.chartView.xAxis.labelRotationAngle = -30;

以柱形图上面显示数值为例,自定义 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;

自定义一个基于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];

这里有一个很好的答案解释了如何在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返回它复制的字节数,但是当我还没有下
我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的
1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里
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上
当我将IO::popen与不存在的命令一起使用时,我在屏幕上打印了一条错误消息:irb>IO.popen"fakefake"#=>#irb>(irb):1:commandnotfound:fakefake有什么方法可以捕获此错误,以便我可以在脚本中进行检查? 最佳答案 是:升级到ruby1.9。如果您在1.9中运行它,则会引发Errno::ENOENT,您将能够拯救它。(编辑)这是在1.8中的一种hackish方式:error=IO.pipe$stderr.reopenerror[1]pipe=IO.popen'qwe'#
当我尝试使用“套接字”库中的方法“read_nonblock”时出现以下错误IO::EAGAINWaitReadable:Resourcetemporarilyunavailable-readwouldblock但是当我通过终端上的IRB尝试时它工作正常如何让它读取缓冲区? 最佳答案 IgetthefollowingerrorwhenItrytousethemethod"read_nonblock"fromthe"socket"library当缓冲区中的数据未准备好时,这是预期的行为。由于异常IO::EAGAINWaitReadab
我需要将目录中的一堆文件上传到S3。由于上传所需的90%以上的时间都花在了等待http请求完成上,所以我想以某种方式同时执行其中的几个。Fibers能帮我解决这个问题吗?它们被描述为解决此类问题的一种方法,但我想不出在http调用阻塞时我可以做任何工作的任何方法。有什么方法可以在没有线程的情况下解决这个问题? 最佳答案 我没有使用1.9中的纤程,但是1.8.6中的常规线程可以解决这个问题。尝试使用队列http://ruby-doc.org/stdlib/libdoc/thread/rdoc/classes/Queue.html查看文
我想使用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]}})
在ruby中...我有一个由外部进程创建的IO对象,我需要从中获取文件名。然而我似乎只能得到文件描述符(3),这对我来说不是很有用。有没有办法从此对象获取文件名甚至获取文件对象?我正在从通知程序中获取IO对象。所以这也可能是获取文件路径的一种方式? 最佳答案 关于howtogetathefilenameinC也有类似的问题,我将在这里以ruby的方式给出这个问题的答案。在Linux中获取文件名假设io是您的IO对象。以下代码为您提供了文件名。File.readlink("/proc/self/fd/#{io.fileno}")例
文章目录前言核心逻辑配置iSH安装Python创建Python脚本配置启动文件测试效果快捷指令前言iOS快捷指令所能做的操作极为有限。假如快捷指令能运行Python程序,那么可操作空间就瞬间变大了。iSH是一款免费的iOS软件,它模拟了一个类似Linux的命令行解释器。我们将在iSH中运行Python程序,然后在快捷指令中获取Python程序的输出。核心逻辑我们用一个“获取当前日期”的Python程序作为演示(其实快捷指令中本身存在“获取当前日期”的操作,因而此需求可以不用Python,这里仅仅为了演示方便),核心代码如下。>>>importtime>>>time.strftime('%Y-%