gpt4 book ai didi

ios - 使用 danielgindi/ios-charts 库创建折线图

转载 作者:行者123 更新时间:2023-11-29 01:15:43 25 4
gpt4 key购买 nike

我正在尝试使用 danielgindi/ios-charts library 创建折线图通过在 X 轴上传递时间值和在 Y 轴上传递表示货币金额的整数值。

时间值,因为它在一个有限的区间内,因为我试图将它限制为 7 个元素,我首先将它转换为 unix 并检查其中一个是最旧的,然后我用较新的替换旧的所以我得到了 NSNumbers 数组。

这里是我的代码和数组数据:

- (void)addChartWithArray:(NSArray *)dataArray{

NSMutableArray *xVals = [[NSMutableArray alloc] init];
NSMutableArray *yVals = [[NSMutableArray alloc] init];
int maxNumberOfValuesInGraph;
if(dataArray.count >= 7){
maxNumberOfValuesInGraph = (int)dataArray.count - 7;
}else{
maxNumberOfValuesInGraph = 0;
}

for (int cout = maxNumberOfValuesInGraph; cout < dataArray.count; cout++){
TRTargetEstimation *targetEstimation = [dataArray objectAtIndex: cout];
[xVals addObject:[targetEstimation dateCreated]];
}

xVals = [self calculateTimeValues: xVals];
int secondCounter = 0;
for (int cout = maxNumberOfValuesInGraph; cout < dataArray.count; cout++) {
TRTargetEstimation *targetEstimation = [dataArray objectAtIndex: cout];
[yVals addObject:[[ChartDataEntry alloc] initWithValue:[targetEstimation.estimationValue floatValue] xIndex:secondCounter]];
secondCounter++;
}

LineChartDataSet *set1 = [[LineChartDataSet alloc] initWithYVals:yVals label:@"DataSet 1"];

set1.lineWidth = 2.f;
set1.circleRadius = 6.0;
[set1 setColor: [UIColor orangeColor]];
[set1 setCircleColor:[UIColor orangeColor]];
set1.highlightColor = [UIColor orangeColor];
set1.drawValuesEnabled = YES;

LineChartData *data = [[LineChartData alloc] initWithXVals:xVals dataSet:set1];
[data setValueFont:[UIFont fontWithName:@"HelveticaNeue-Light" size:7.f]];


self.lineChartView.minOffset = 0;
self.lineChartView.delegate = self;
self.lineChartView.backgroundColor = [UIColor clearColor];

self.lineChartView.descriptionText = @"";
self.lineChartView.noDataTextDescription = @"No history available.";

self.lineChartView.drawGridBackgroundEnabled = NO;
self.lineChartView.dragEnabled = NO;
[self.lineChartView setScaleEnabled:NO];
self.lineChartView.pinchZoomEnabled = NO;
[self.lineChartView setViewPortOffsetsWithLeft:10.0 top:0.0 right:10.0 bottom:0.0];

self.lineChartView.legend.enabled = NO;

self.lineChartView.leftAxis.enabled = NO;
self.lineChartView.rightAxis.enabled = NO;
self.lineChartView.xAxis.enabled = NO;

self.lineChartView.data = data;

self.lineChartView.hidden = YES;
self.leftLineView.hidden = YES;
self.bottomLineView.hidden = YES;

}

- (NSMutableArray *)calculateTimeValues:(NSMutableArray *)passedArray {
NSMutableArray *returnedArray = [[NSMutableArray alloc] init];

for (int count = 0; count < passedArray.count; count++) {

NSDate *date = [TRUtils getDateOutOfString:[passedArray objectAtIndex:count]
andDateFormat:@"yyyy-MM-dd HH:mm:ss"];
[returnedArray addObject:[NSNumber numberWithInt:[TRUtils getUNIXTimeFromDate:date]]];

}

[returnedArray sortUsingDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"self" ascending:YES]]];

int minValue = [[returnedArray firstObject] intValue];
for (int count = 0; count < passedArray.count; count++) {
[returnedArray replaceObjectAtIndex:count
withObject:[NSString stringWithFormat:@"%d",[[returnedArray objectAtIndex:count] intValue] - minValue]];
}

return returnedArray;
}

这是我的辅助方法:

+ (NSDate *)getDateOutOfString:(NSString *)passedString andDateFormat:(NSString *)dateFormat{

NSString *dateString = passedString;
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:dateFormat];
NSDate *dateFromString = [[NSDate alloc] init];
dateFromString = [dateFormatter dateFromString:dateString];
return dateFromString;

}

+ (int)getUNIXTimeFromDate:(NSDate *) datePassed{

return (int)[datePassed timeIntervalSince1970];

}

xVals 数据是:

<__NSArrayM 0x7fca4b775dd0>(
0,
213,
298,
435,
524,
591,
664
)

yVals 数组是:

[234234,
123123,
2223355,
22222222,
2342,
121212,
121212]

图形显示为:

enter image description here

现在,Y 轴看起来符合预期,但 Y 轴不正确,因为点之间的间距相等,知道我做错了什么吗?

我已经尝试更改下一行:

[yVals addObject:[[ChartDataEntry alloc] initWithValue:[targetEstimation.estimationValue floatValue] xIndex:secondCounter]];

通过提供不同的 xIndex,但图表完全停止显示在屏幕上。

提前感谢所有建设性的回答:)

最佳答案

我假设您的意思是“X 轴不正确,因为点之间的间距相等,知道我做错了什么吗?”

这是设计使然。要解决此问题,您需要为 x 轴插入中间日期值,但不为特定 xIndex 插入任何数据条目。这已经在 github 页面上被问到了。

您必须为 [self hasDataAtIndex:cout] 编写自己的逻辑

for (int cout = maxNumberOfValuesInGraph; cout < dataArray.count; cout++){
TRTargetEstimation *targetEstimation = [dataArray objectAtIndex: cout];
[xVals addObject:[targetEstimation dateCreated]];

if ([self hasDataAtIndex:cout]) {
[yVals addObject:[[ChartDataEntry alloc] initWithValue:[targetEstimation.estimationValue floatValue] xIndex:cout]];
}
}

关于ios - 使用 danielgindi/ios-charts 库创建折线图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35213475/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com