iOS 图表 - 未显示单个值 Swift

iOS Charts - single values not showing Swift

当我在一个数组中有多个点用于折线图上的一条线时,一切都显示得很完美。 但是当只有一个点时,点不显示。我不知道为什么? 代表正在别处设置,但这似乎不是问题。

以下示例显示了测试 2 和测试练习。第一张图片每个都有一个值,第二张图片每个都有 2.

这是我的代码

    func startChart(){

        chart.dragEnabled = true
        chart.legend.form = .circle
        chart.drawGridBackgroundEnabled = false

        let xaxis = chart.xAxis

        xaxis.valueFormatter = axisFormatDelegate
        xaxis.labelCount = dataSets.count
        xaxis.labelPosition = .bottom

        xaxis.granularityEnabled = true
        xaxis.granularity = 1.0
        xaxis.avoidFirstLastClippingEnabled = true
        xaxis.forceLabelsEnabled = true
        let rightAxis = chart.rightAxis

        rightAxis.enabled = false
        rightAxis.axisMinimum = 0

        let leftAxis = chart.leftAxis
        leftAxis.drawGridLinesEnabled = true
        leftAxis.axisMinimum = 0

        let chartData = LineChartData(dataSets: dataSets)
        chart.data = chartData
 }

如果我加上

chart.setVisibleXRangeMinimum(myMinDate)

该值将正确显示。但是它会将值挤压到左侧并重叠 2 x 值日期

我能解决这个问题的唯一方法是添加一条额外的隐形线。

我创建了一条清晰的线,从前一天开始到我的单值后一天结束。

只要图表上有一条线从一个点到另一个点,其他单个值都会显示。

  var singleValue = false
    for i in 0...(dataSets.count - 1) {
        if dataSets[i].values.count > 1{
            singleValue = true
        }
    }
    var data = dataSets
    if singleValue == false {
        let minNS = Calendar.current.date(byAdding: .day, value: -1, to: minNSDate as! Date)
        let maxNS =  Calendar.current.date(byAdding: .day, value: 1, to: maxNSDate as! Date)

        var dataEntries: [ChartDataEntry] = []

        let dataEntry1 = ChartDataEntry(x:Double(String(format: "%.2f",Double((minNS?.timeIntervalSince1970)!)))!,y:00.00)
        let dataEntry2 = ChartDataEntry(x:Double(String(format: "%.2f",Double((maxNS?.timeIntervalSince1970)!)))!,y:00.00)
        dataEntries.append(dataEntry1)
        dataEntries.append(dataEntry2)
        let set = LineChartDataSet(values: dataEntries, label: "")
        set.setCircleColor(UIColor.clear)
        set.circleHoleColor = UIColor.clear
        set.setColor(UIColor.white, alpha: 0.0)
        set.drawValuesEnabled = false
        data.append(set)

    }
    chart.chartDescription?.text = ""
    let chartData = LineChartData(dataSets: data)
    chart.data = chartData

我想我找到了更好的解决方案。单个点不足以画一条线(您至少需要两个点),因此 LineChartView 无法呈现您的数据。您可以通过将 LineChartView 替换为 CombinedChartView 来解决此问题。 CombinedChartView 提供了在一张图表上混合不同类型数据的可能性。您可以检查您拥有多少数据并决定哪种类型的 DataSet 是合适的。

代码示例:

    if dataEntry.count == 1 {
        let scatterDataSet = ScatterChartDataSet(values: dataEntry, label: title)
        scatterDataSet.setColor(UIColor.pmd_darkBlue)
        scatterDataSet.setScatterShape(.circle)
        scatterDataSet.drawValuesEnabled = false

        combinedChartData.scatterData = ScatterChartData(dataSets: [scatterDataSet])
    }
    else {
        let lineDataSet = LineChartDataSet(values: dataEntry, label: title)
        lineDataSet.setColor(UIColor.pmd_darkBlue)
        lineDataSet.lineWidth = 3.0
        lineDataSet.drawCirclesEnabled = false
        lineDataSet.drawValuesEnabled = false

        combinedChartData.lineData = LineChartData(dataSets: [lineDataSet])
    }

    combinedChart.data = combinedChartData 

您还可以在一个图表中组合两种或更多类型 DataSets

重要

不要忘记添加这一行:

combinedChart.drawOrder = [DrawOrder.line.rawValue, DrawOrder.scatter.rawValue]

您必须编写您使用的数据类型,否则数据将无法呈现。