ios图表组合图表:经过图表右轴的条形图

ios图表组合图表:经过图表右轴的条形图,ios,charts,bar-chart,linechart,ios-charts,Ios,Charts,Bar Chart,Linechart,Ios Charts,我正在尝试做类似的东西 我将有4个BarChartDataSet分组,2个LineChartDataSet,每个数据集有7个数据点,用户可以随意添加或删除这些数据集 这些条线看起来分组很好,折线图显示了所有7个点 但是,当我向图表中添加更多的BarChartDataSet时,条形图离开了图表的右侧,折线图保持不变,这是我的一个图像序列,从一个LineChartDataSet开始,然后逐个添加BarChartDataSet,一些条形图的值为0,因此很难看到组,请查找底部的0标签 我怎样才能阻止

我正在尝试做类似的东西

我将有4个BarChartDataSet分组,2个LineChartDataSet,每个数据集有7个数据点,用户可以随意添加或删除这些数据集

这些条线看起来分组很好,折线图显示了所有7个点

但是,当我向图表中添加更多的BarChartDataSet时,条形图离开了图表的右侧,折线图保持不变,这是我的一个图像序列,从一个LineChartDataSet开始,然后逐个添加BarChartDataSet,一些条形图的值为0,因此很难看到组,请查找底部的0标签

我怎样才能阻止条形图偏离图表右侧

代码如下:

//get data and values from DataMOs in the activeFeeds
            var lineChartDataSets = [LineChartDataSet]()
            var barChartDataSets = [BarChartDataSet]()
            for (key, dayValuesArray) in valuesByFeed {
                var barChartDataEntries = [BarChartDataEntry]()
                var lineChartDataEntries = [ChartDataEntry]()
                var lineChartDataSet: LineChartDataSet!
                var barChartDataSet: BarChartDataSet!
                var dataEntry: ChartDataEntry

                for (index, value) in (dayValuesArray?.enumerated())! {
                    //create line chart for Demand and Prod feeds
                    //create bar chart for every other feed
                    if key == "Demand" || key == "Prod"{
                        dataEntry = ChartDataEntry(x: Double(self.activeFeeds.count * index), y: Double(value)!)
                        lineChartDataEntries.append(dataEntry)
                    } else {
                        dataEntry = BarChartDataEntry(x: Double(self.activeFeeds.count * index), y: Double(value)!)
                        barChartDataEntries.append(dataEntry as! BarChartDataEntry)
                    }
                }

                //create line chart data set for Demand and Prod feeds
                //create bar chart data set for every other feed
                if key == "Demand" || key == "Prod"{
                    lineChartDataSet = LineChartDataSet(values: lineChartDataEntries, label: key)
                    lineChartDataSet.drawCirclesEnabled = false
                } else {
                    barChartDataSet = BarChartDataSet(values: barChartDataEntries, label: key)
                }

                switch key {
                case "Solar":
                    barChartDataSet.setColors(UIColor.orange.withAlphaComponent(1.0))
                    barChartDataSet.valueTextColor = UIColor.white
                    break
                case "Wind":
                    barChartDataSet.setColors(UIColor.blue.withAlphaComponent(1.0))
                    barChartDataSet.valueTextColor = UIColor.white
                    break
                case "Battery":
                    barChartDataSet.setColors(UIColor.green.withAlphaComponent(1.0))
                    barChartDataSet.valueTextColor = UIColor.white
                    break
                case "Gen":
                    barChartDataSet.setColors(UIColor.red.withAlphaComponent(1.0))
                    barChartDataSet.valueTextColor = UIColor.white
                    break
                case "Demand":
                    lineChartDataSet.setColors(UIColor.purple.withAlphaComponent(1.0))
                    lineChartDataSet.valueTextColor = UIColor.white
                    lineChartDataSet.drawFilledEnabled = true
                    lineChartDataSet.fillColor = UIColor.purple.withAlphaComponent(0.8)
                    break
                case "Prod":
                    lineChartDataSet.setColors(UIColor.magenta.withAlphaComponent(1.0))
                    lineChartDataSet.valueTextColor = UIColor.white
                    lineChartDataSet.drawFilledEnabled = true
                    lineChartDataSet.fillColor = UIColor.magenta.withAlphaComponent(0.8)
                    break
                default:
                    break
                }

                //append to correct data set array
                if key == "Demand" || key == "Prod"{
                    lineChartDataSets.append(lineChartDataSet)
                } else {
                    barChartDataSets.append(barChartDataSet)
                }
            }

            //set chart data
            let chartData = CombinedChartData()
            chartData.barData = BarChartData(dataSets: barChartDataSets)
            chartData.lineData = LineChartData(dataSets: lineChartDataSets)
            let activeFeedsCount = self.activeFeeds.count
            if activeFeedsCount > 0 {
                self.combinedChartView.data = chartData
                if chartData.barData.dataSetCount > 1 {
                    self.combinedChartView.barData?.groupBars(fromX: 0, groupSpace: 1.0, barSpace: 0.5)
                    self.combinedChartView.notifyDataSetChanged()
                }
            } else {
                self.combinedChartView.data = CombinedChartData()
                self.combinedChartView.noDataText = "No Feeds To Show"
            }

我无法重现0标签的问题,但可以使用combinedChart.xAxis.axisMaximum确保您可以看到右侧的所有条形图

 let activeFeeds = 6
 func dataSet() {

    combinedChart.isUserInteractionEnabled = true
    combinedChart.scaleXEnabled = false
    combinedChart.scaleYEnabled = false

    combinedChart.dragEnabled = true
    //combinedChart.xAxis.axisMinimum = 0.0
    combinedChart.xAxis.axisMaximum = 100.0

    //get data and values from DataMOs in the activeFeeds
    var lineChartDataSets = [LineChartDataSet]()
    var barChartDataSets = [BarChartDataSet]()
    combinedChart.setVisibleXRange(minXRange: 0.0, maxXRange: 26.0)

    let arr1 = [17000,16500,16800,16700,17900,17100,18000]
    let arr2 = [17000,17500,16900,16800,17200,17105,17000]

    let valuesByFeed = ["Solar":arr1, "Wind": arr2, "Battery": arr1, "Gen":arr1, "Demand":arr1, "Prod":arr1]

    for (key, dayValuesArray) in valuesByFeed {
        var barChartDataEntries = [BarChartDataEntry]()
        var lineChartDataEntries = [ChartDataEntry]()
        var lineChartDataSet: LineChartDataSet!
        var barChartDataSet: BarChartDataSet!
        var dataEntry: ChartDataEntry

        for (index, value) in (dayValuesArray.enumerated()) {
            //create line chart for Demand and Prod feeds
            //create bar chart for every other feed
            if key == "Demand" || key == "Prod"{
                dataEntry = ChartDataEntry(x: Double(self.activeFeeds * index), y: Double(value))
                lineChartDataEntries.append(dataEntry)
            } else {
                dataEntry = BarChartDataEntry(x: Double(self.activeFeeds * index), y: Double(value))
                barChartDataEntries.append(dataEntry as! BarChartDataEntry)
            }
        }


        //create line chart data set for Demand and Prod feeds
        //create bar chart data set for every other feed
        if key == "Demand" || key == "Prod"{
            lineChartDataSet = LineChartDataSet(values: lineChartDataEntries, label: key)
            lineChartDataSet.drawCirclesEnabled = false
        } else {
            barChartDataSet = BarChartDataSet(values: barChartDataEntries, label: key)
        }

        switch key {
        case "Solar":
            print("case solar")
            barChartDataSet.setColors(UIColor.orange.withAlphaComponent(1.0))
            barChartDataSet.valueTextColor = UIColor.white
            break
        case "Wind":
            print("case wind")
            barChartDataSet.setColors(UIColor.blue.withAlphaComponent(1.0))
            barChartDataSet.valueTextColor = UIColor.white
            break
        case "Battery":
            print("case battery")
            barChartDataSet.setColors(UIColor.green.withAlphaComponent(1.0))
            barChartDataSet.valueTextColor = UIColor.white
            break
        case "Gen":
            print("case gen")

            barChartDataSet.setColors(UIColor.red.withAlphaComponent(1.0))
            barChartDataSet.valueTextColor = UIColor.white
            break
        case "Gen2":
            print("case gen")

            barChartDataSet.setColors(UIColor.red.withAlphaComponent(1.0))
            barChartDataSet.valueTextColor = UIColor.white
            break
        case "Gen3":
            print("case gen")

            barChartDataSet.setColors(UIColor.red.withAlphaComponent(1.0))
            barChartDataSet.valueTextColor = UIColor.white
            break
        case "Gen4":
            print("case gen")

            barChartDataSet.setColors(UIColor.red.withAlphaComponent(1.0))
            barChartDataSet.valueTextColor = UIColor.white
            break


        case "Demand":
            print("case demand")

            lineChartDataSet.setColors(UIColor.purple.withAlphaComponent(1.0))
            lineChartDataSet.valueTextColor = UIColor.white
            lineChartDataSet.drawFilledEnabled = true
            lineChartDataSet.fillColor = UIColor.purple.withAlphaComponent(0.8)
            break
        case "Prod":
            print("case prod")

            lineChartDataSet.setColors(UIColor.magenta.withAlphaComponent(1.0))
            lineChartDataSet.valueTextColor = UIColor.white
            lineChartDataSet.drawFilledEnabled = true
            lineChartDataSet.fillColor = UIColor.magenta.withAlphaComponent(0.8)
            break
        default:
            break
        }

        //append to correct data set array
        if key == "Demand" || key == "Prod"{
            lineChartDataSets.append(lineChartDataSet)
        } else {
            barChartDataSets.append(barChartDataSet)
        }
    }

    //set chart data
    let chartData = CombinedChartData()
    print("bar count: \(barChartDataSets.count)")
    print("line count: \(lineChartDataSets.count)")
    chartData.barData = BarChartData(dataSets: barChartDataSets)
    chartData.lineData = LineChartData(dataSets: lineChartDataSets)
    let activeFeedsCount = self.activeFeeds
    if activeFeedsCount > 0 {
        self.combinedChart.data = chartData
        if chartData.barData.dataSetCount > 1 {
            self.combinedChart.barData?.groupBars(fromX: 0, groupSpace: 1.0, barSpace: 0.5)
            self.combinedChart.notifyDataSetChanged()
        }
    } else {
        self.combinedChart.data = CombinedChartData()
        self.combinedChart.noDataText = "No Feeds To Show"
    }


}

使用setVisibleXRange可以解决问题,请看我的回答:如果解决不了问题,你能分享一些代码让我重现问题吗?似乎不起作用,我添加了我正在使用的代码,它基本上是过去7天的数据点,将有7组4个条,2个折线图,每个都有7个数据点当我建议更改粒度时:正如您从上面的代码中看到的,我已经在尝试使用它,更改它的值没有任何作用。我将其与fitToScreen()结合使用,谢谢