如何在折线图中的xAxis标签上显示字符串值(MP图表3.0)

时间:2018-03-21 09:42:01

标签: ios objective-c charts

在我的目标c项目中,我需要将MPChart从2.2迁移到3.0,以便在Xcode 9.2中支持我的项目。但总和代码现在改变了。

查看DidLoad

xAxis.valueFormatter = self;

图表更新功能

- (void)setDataCount:(int)count range:(double)range

{
    xVals = [[NSMutableArray alloc] init];

    for (int i = 0; i < dateAll.count; i++)

    {

           [xVals addObject:[dateAll objectAtIndex:i]];

    }

    NSLog(@"xVals  %@",xVals);





    NSMutableArray *yVals = [[NSMutableArray alloc] init];

    for (int i = 0; i < arrtymHr.count; i++)

    {

            double vals = [[NSString stringWithFormat:@"%@.%@",[arrtymHr objectAtIndex:i],[arrtymMnt objectAtIndex:i]] doubleValue];

            [yVals addObject:[[ChartDataEntry alloc] initWithX:i y:vals]];

    }

    NSLog(@"yVals  %@",yVals);







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



    set1.axisDependency = AxisDependencyRight;

    [set1 setColor:[UIColor colorWithRed:51/255.f green:181/255.f blue:229/255.f alpha:1.f]];

    [set1 setCircleColor:[UIColor clearColor]];

    set1.lineWidth = 2.0;

    set1.circleRadius = 3.0;

    set1.fillAlpha = 0.70;

    set1.fillColor = [UIColor colorWithRed:51/255.f green:181/255.f blue:229/255.f alpha:1.f];

    set1.highlightColor = [UIColor colorWithRed:244/255.f green:117/255.f blue:117/255.f alpha:1.f];

    set1.drawCircleHoleEnabled = YES;

    set1.drawFilledEnabled = !set1.isDrawFilledEnabled;





    NSMutableArray *yVals2 = [[NSMutableArray alloc] init];

    for (int i = 0; i < Allpost.count; i++)

    {

          double vals = [[Allpost objectAtIndex:i]doubleValue];

          [yVals2 addObject:[[ChartDataEntry alloc] initWithX:i y:vals]];

    }

    NSLog(@"yVals 2  %@",yVals2);



    LineChartDataSet *set2 = [[LineChartDataSet alloc] initWithValues:yVals2 label:@"DataSet 2"];

    set2.axisDependency = AxisDependencyLeft;

    [set2 setColor:[UIColor colorWithRed:245/255.f green:130/255.f blue:32/255.f alpha:1.f]];

    [set2 setCircleColor:[UIColor clearColor]];

    set2.lineWidth = 3.0;

    set2.circleRadius = 3.0;

    set2.fillAlpha = 1.0;

    set2.fillColor = UIColor.redColor;

    set2.highlightColor = [UIColor colorWithRed:244/255.f green:117/255.f blue:117/255.f alpha:1.f];

    set2.drawCircleHoleEnabled = YES;





    NSMutableArray *dataSets = [[NSMutableArray alloc] init];

    [dataSets addObject:set1];

    [dataSets addObject:set2];





    LineChartData *data = [[LineChartData alloc] initWithDataSets:dataSets];

    [data setValueTextColor:[UIColor clearColor]];

    [data setValueFont:[UIFont systemFontOfSize:9.f]];



    _chartView.data = data;



}

格式化程序函数

- (NSString *)stringForValue:(double)value

                        axis:(ChartAxisBase *)axis

{

    return [xVals objectAtIndex:value];

}

但问题是数组只有一个值,但它显示多个。

印刷阵列

xVals  (
    "03/08",
    "03/16",
    "03/16",
    "03/16"
)

yVals  (
    "ChartDataEntry, x: 0.0, y 0.0",
    "ChartDataEntry, x: 1.0, y 0.0",
    "ChartDataEntry, x: 2.0, y 0.0",
    "ChartDataEntry, x: 3.0, y 0.0"
)

yVals 2  (
    "ChartDataEntry, x: 0.0, y 5.5",
    "ChartDataEntry, x: 1.0, y 7.0",
    "ChartDataEntry, x: 2.0, y 7.0",
    "ChartDataEntry, x: 3.0, y 3.0"
)

enter image description here

2 个答案:

答案 0 :(得分:0)

根据新的图表更新,您需要创建ChartDataEntry,您可以在其中添加 X &amp; Y 值,然后将其添加到LineChartDataSet

请检查以下代码:

//Create values array 
NSMutableArray *values = [[NSMutableArray alloc] init];

//Create 
[yValArray enumerateObjectsUsingBlock:^(NSDictionary *obj, NSUInteger idx, BOOL * _Nonnull stop) {
     [values addObject:[[ChartDataEntry alloc] initWithX:idx y:obj];
}];
  

在上面的代码中,我们在DataEntry形式0 .... N。

中添加索引
//Add dataEntry Object into values array
[values addObject:dataEntry];

//Create DataSet with values array
LineChartDataSet *set1 = [[LineChartDataSet alloc] initWithValues:values label:@"your_label_for_data_set"];

//Add Line Chart Data inro Chart.
LineChartData *data = [[LineChartData alloc] initWithDataSet:set1];

//Set Data to Line Chart
_lineChartTrend.data = data;

现在使用您的Formatter并根据索引返回值,如下所示

- (NSString *)stringForValue:(double)value
                        axis:(ChartAxisBase *)axis
{
    if (yourLineChart.xAxis == axis) {
        return [xValArray objectAtIndex:value];
    }
}

其中value是我们在DataEntry中添加的索引。

通过这样做,你将得到你的X&amp;您的折线图上的Y值。

修改

根据您的评论和问题更新,您需要为XAxis添加一个属性,以便它不会重复XAxis值,并且将保持与您的数组相同,设置在代码下方,您将获得图表上的预期输出。

ChartXAxis *xAxis = self.lineChart.xAxis;
xAxis.granularity = 1.0; 

试试这个,让我知道它是否有效。

答案 1 :(得分:0)

试试这个

@interface ViewController ()<IChartAxisValueFormatter>

viewDidLoad中

xAxis.axisRange = 1;
xAxis.granularity = 1;
xAxis.valueFormatter =self;

#pragma mark - IAxisValueFormatter

- (NSString * _Nonnull)stringForValue:(double)value axis:(ChartAxisBase * _Nullable)axis
{
    NSString *xAxisStringValue = @"";
    int myInt = (int)value;
    if(xVals.count > myInt)
    {
        xAxisStringValue = [xVals objectAtIndex:myInt];
        return xAxisStringValue;
    }
    else
    {
        return 0;
    }
}