【问题标题】:Multiple Line Chart, don't want to plot 0 values. Swift 2多折线图,不想绘制 0 值。斯威夫特 2
【发布时间】:2016-04-06 08:23:13
【问题描述】:

我正在使用 ios-charts 库生成多折线图。 (丹尼尔金迪/图表)。我正在为从 Core Data 检索的 x 轴创建一个数组,如果 x 周没有值,我附加了一个 0。

我有一个示例数组(对于 x 值):

[[0.0,0.0,5.6,3.0,6.0,5.4,2.1,0.0,0.0,1.3,4.1,0.0],[5.2,0.0,3.2,7.0,8.9,0.0,5.0,0.0,4.6,0.0 ,0.0,0.0],[3.6,1.5,3.6,0.0,0.0,3.5,0.0,4.6,5.6,2.8,8.4,0.0]]

对于 y:

[一月、二月、三月、四月、五月、六月、七月、八月、九月、十月、十一月、十二月]

我有以下代码在折线图中显示这 3 条线:

func setChart(xValues: [NSDate], valuesLineChart: [[Double]]) {
    chartView.descriptionText = ""
    chartView.noDataText = "You need to provide data for the chart."

    var dataSets : [LineChartDataSet] = [LineChartDataSet]()
    var yVals1 : [ChartDataEntry] = [ChartDataEntry]()
    for i in 0..<xValues.count {
        yVals1.append(ChartDataEntry(value: valuesLineChart[0][i], xIndex: i))
    }

    var yVals2 : [ChartDataEntry] = [ChartDataEntry]()
    for i in 0..<xValues.count {
        yVals2.append(ChartDataEntry(value: valuesLineChart[1][i], xIndex: i))
    }

    var yVals3 : [ChartDataEntry] = [ChartDataEntry]()
    for i in 0..<xValues.count {
        yVals3.append(ChartDataEntry(value: valuesLineChart[2][i], xIndex: i))
    }

    let set1 = LineChartDataSet(yVals: yVals1, label: nil)
    let set2 = LineChartDataSet(yVals: yVals2, label: nil)
    let set3 = LineChartDataSet(yVals: yVals3, label: nil)

    set1.fillColor = UniversalStatic.data.colourArrayForGraph[0]
    set2.fillColor = UniversalStatic.data.colourArrayForGraph[1]
    set3.fillColor = UniversalStatic.data.colourArrayForGraph[2]

    dataSets.append(set1)
    dataSets.append(set2)
    dataSets.append(set3)

    set1.setColor(UniversalStatic.data.colourArrayForGraph[0])
    set2.setColor(UniversalStatic.data.colourArrayForGraph[1])
    set3.setColor(UniversalStatic.data.colourArrayForGraph[2])

    set1.lineWidth = 2
    set2.lineWidth = 2
    set3.lineWidth = 2

    set1.setCircleColor(UniversalStatic.data.colourArrayForGraph[0])
    set2.setCircleColor(UniversalStatic.data.colourArrayForGraph[1])
    set3.setCircleColor(UniversalStatic.data.colourArrayForGraph[2])

    set1.drawCircleHoleEnabled = false
    set2.drawCircleHoleEnabled = false
    set3.drawCircleHoleEnabled = false

    set1.circleRadius = 5.0
    set2.circleRadius = 5.0
    set3.circleRadius = 5.0

    let data: CombinedChartData = CombinedChartData(xVals: xValues)
    data.lineData = LineChartData(xVals: xValues, dataSets: dataSets)

    chartView.data = data

}

如何避免绘制 0 值?

感谢您的帮助

【问题讨论】:

    标签: swift linechart ios-charts


    【解决方案1】:

    您是否希望完全跳过 0.0 值?您可以在将它们附加到数组之前进行检查。

    也许你可以这样做:

      var yVals1 : [ChartDataEntry] = [ChartDataEntry]()
      for i in 0..<xValues.count {
          if valuesLineChart[0][i] != 0.0 {
              yVals1.append(ChartDataEntry(value: valuesLineChart[0][i], xIndex: i))
          }
      }
    

    与其他 for 循环类似

    【讨论】:

    • 是的,我希望完全跳过它。我正在考虑这个,但我认为这行不通。例如 [0.0,0.0,5.6] 和 [Jan,Feb,March],如果我跳过前 2 个,它不会将 5.6 分配给 Jan 吗?
    • 好的,我知道你现在想要什么了...你想要图表中的换行符。我相信过去有开发人员为库请求此功能,但据我所知,您需要在换行后隔离每个新行并作为新数据集实现......至少可以说变得越来越复杂因为贝塞尔路径的绘制方式存在问题。我不确定现在是否可行。
    • 嗯,好的。我真的不想要换行符,只是在 0.0 值上没有显示圆圈并跳过它,就像将 0 更改为 nil 一样。
    • 你应该使用map而不是for-in
    • 如果我不想在那边画线怎么办?因为跳过 0 会直接将上一个值通过直线映射到下一个值。
    【解决方案2】:

    您可以做到这一点的唯一方法是覆盖默认行为。

    其实很简单,创建LineChartRenderer的子类并覆盖drawLinear(行)、drawValues(值渲染)和drawExtras(圆)。

    只需将超类方法 (LineChartRenderer) 的实现复制到那里并添加所需的条件以跳过零值。

    然后将自定义渲染器分配给您的图表视图。

    另一个可能在不覆盖渲染器的情况下工作的选项是为每个值提供一种颜色。然后你可以为零值设置清晰的颜色。

    【讨论】:

    • 谢谢,我一般是编程新手,但会试一试。通过为每个值设置颜色,是否仍会显示附加 0 的行?理想情况下,对于 0 值,它之前和之后的值用一条线连接。
    • 第二个选项会起作用吗?由于我对编程很陌生,第一个选项似乎有点棘手,因为我真的不知道从哪里开始。
    • @JessMurray 第二个只是一个想法,我不确定它是否适合您的用例。第一个是安全的,但工作量更大。
    猜你喜欢
    • 1970-01-01
    • 2017-03-24
    • 1970-01-01
    • 2017-02-15
    • 2017-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多