如何在Swift中的图表中启用小数?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Swift中的图表中启用小数?相关的知识,希望对你有一定的参考价值。

我正在使用图表来创建我自己的图表,但我很难看到我的表的值有小数而不是整数。

我的图表初始化如下,但我找不到格式化点的方法来显示小数部分,因为它们是双打的。我试图设置targetChartView.xAxis.decimalstargetChartView.leftAxis.decimals没有结果。

如何启用十进制表示法?

init(withGraphView aGraphView: LineChartView, noDataText aNoDataTextString: String, minValue aMinValue: Double, maxValue aMaxValue: Double, numberOfDataSets aDataSetCount: Int, dataSetNames aDataSetNameList: [String], dataSetColors aColorSet: [UIColor], andMaxVisibleEntries maxEntries: Int = 10) {
    originalMaxValue     = aMaxValue
    originalMinValue     = aMinValue
    dateFormatter        = DateFormatter()
    targetChartView      = aGraphView
    lineChartData        = LineChartData()
    maximumVisiblePoints = maxEntries
    timestamps           = [Date]()

    for i in 0..<aDataSetCount {
        let firstEntry = ChartDataEntry(x: 0, y: 0)
        var entries    = [ChartDataEntry]()
        entries.append(firstEntry)
        let aDataSet = LineChartDataSet(values: entries, label: aDataSetNameList[i])
        aDataSet.setColor(aColorSet[i])
        aDataSet.lineWidth = 3
        aDataSet.lineCapType = .round
        aDataSet.drawCircleHoleEnabled = false
        aDataSet.circleRadius = 2
        aDataSet.axisDependency = .left
        aDataSet.highlightEnabled = true

        lineChartData.addDataSet(aDataSet)
    }

    targetChartView.data = lineChartData
    targetChartView.noDataText = aNoDataTextString
    targetChartView.chartDescription?.text = ""
    targetChartView.rightAxis.drawLabelsEnabled = false
    targetChartView.xAxis.drawGridLinesEnabled = false
    targetChartView.xAxis.labelPosition = .bottom
    targetChartView.leftAxis.drawGridLinesEnabled = false
    targetChartView.dragEnabled = true
    targetChartView.xAxis.granularityEnabled = true
    targetChartView.xAxis.granularity = 1
    targetChartView.xAxis.decimals = 0
    targetChartView.leftAxis.granularityEnabled = true
    targetChartView.leftAxis.granularity = 1
    targetChartView.leftAxis.decimals = 0
    targetChartView.xAxis.axisMinimum = Double(0)
    targetChartView.xAxis.axisMaximum = Double(maximumVisiblePoints)
    targetChartView.leftAxis.axisMinimum = aMinValue
    targetChartView.leftAxis.axisMaximum = aMaxValue
    targetChartView.setScaleEnabled(false)
    super.init()
    targetChartView.xAxis.valueFormatter = self
    targetChartView.delegate = self

    // This gesture recognizer will track begin and end of touch/swipe.
    // When user presses the graph we don't want it to be moving when new data is received even when the most recent value is visible.
    let clickRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(didLongPress))
    clickRecognizer.minimumPressDuration = 0
    clickRecognizer.delegate = self
    targetChartView.addGestureRecognizer(clickRecognizer)
}
答案

仅当您使用默认格式化程序时才使用decimals属性。但是,我看到你也在设置

targetChartView.xAxis.valueFormatter = self

这意味着你的班级正在实施IAxisValueFormatter及其stringForValue(:axis:)方法。然后忽略decimals(应该是非零)中的值,因为您有自定义格式化程序。

您可以删除分配,然后显示小数,或者您必须在stringForValue(:axis:)中正确格式化小数。

您尚未添加此部分实现,但问题可能就在那里。

我看到AxisRenderer中还有一些魔法,如果值之间的间隔大于1,它可能会删除小数。因此,对两个轴使用自定义格式化器可能是最好的解决方案。

另一答案

正如我在@Sulthan中提到的那样,问题不在于图表本身,而是数据集(aDataSet)必须如何格式化,因此添加下面的代码段会在图表中的数据上启用三位小数

init(withGraphView aGraphView: LineChartView, noDataText aNoDataTextString: String, minValue aMinValue: Double, maxValue aMaxValue: Double, numberOfDataSets aDataSetCount: Int, dataSetNames aDataSetNameList: [String], dataSetColors aColorSet: [UIColor], andMaxVisibleEntries maxEntries: Int = 10) {

        originalMaxValue     = aMaxValue
        originalMinValue     = aMinValue
        dateFormatter        = DateFormatter()
        targetChartView      = aGraphView
        lineChartData        = LineChartData()
        maximumVisiblePoints = maxEntries
        timestamps           = [Date]()
        //Setting 3 decimals for the number that are going to be displayed
        let formatter = NumberFormatter()//ADD THIS
        formatter.numberStyle = .decimal//ADD THIS
        formatter.maximumFractionDigits = 3//ADD THIS
        formatter.minimumFractionDigits = 3//ADD THIS

        for i in 0..<aDataSetCount {
            let firstEntry = ChartDataEntry(x: 0, y: 0)
            var entries    = [ChartDataEntry]()
            entries.append(firstEntry)
            let aDataSet = LineChartDataSet(values: entries, label: aDataSetNameList[i])
            aDataSet.setColor(aColorSet[i])
            aDataSet.lineWidth = 3
            aDataSet.lineCapType = .round
            aDataSet.drawCircleHoleEnabled = false
            aDataSet.circleRadius = 2
            aDataSet.axisDependency = .left
            aDataSet.highlightEnabled = true

            lineChartData.addDataSet(aDataSet)
            //Use formater that allows showing decimals
            lineChartData.setValueFormatter(DefaultValueFormatter(formatter: formatter))//ADD THIS
        }
    ...}

以上是关于如何在Swift中的图表中启用小数?的主要内容,如果未能解决你的问题,请参考以下文章

对话框片段中的 MP 图表

swift中的图表数据

kotlin-从一个片段更改多个片段的小数位

如何使用 Swift 使用此代码片段为 iOS 应用程序初始化 SDK?

如何将这个 Objective-C 代码片段写入 Swift?

如何在 python 中更改 matplotlib ax.text 中的小数位? [复制]