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]
您必须编写您使用的数据类型,否则数据将无法呈现。
当我在一个数组中有多个点用于折线图上的一条线时,一切都显示得很完美。 但是当只有一个点时,点不显示。我不知道为什么? 代表正在别处设置,但这似乎不是问题。
以下示例显示了测试 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]
您必须编写您使用的数据类型,否则数据将无法呈现。