从阵列中提取多个数据时如何使用iOS图表?
在过去的几天里,我一直在学习使用iOS图表,并且在处理从API调用的“单个”数据时成功地使它们工作 但是,我现在被卡住了,因为我想从一个数组中提取多个数据 我的目标是根据以下数组中每个从阵列中提取多个数据时如何使用iOS图表?,ios,swift,charts,ios-charts,Ios,Swift,Charts,Ios Charts,在过去的几天里,我一直在学习使用iOS图表,并且在处理从API调用的“单个”数据时成功地使它们工作 但是,我现在被卡住了,因为我想从一个数组中提取多个数据 我的目标是根据以下数组中每个用户名的连胜记录创建条形图: ["leagueStats": { winningStreak = ( { id = 2; "user_name" = Dicky; "winning_streak" = 5; },
用户名的连胜记录
创建条形图:
["leagueStats": {
winningStreak = (
{
id = 2;
"user_name" = Dicky;
"winning_streak" = 5;
},
{
id = 6;
"user_name" = G;
"winning_streak" = 2;
},
{
id = 5;
"user_name" = Sultan;
"winning_streak" = 0;
}
);
}
]
这是我检索API的代码:
这就是我需要帮助的地方-我需要生成某种循环吗?
在提供的答案中,图形中显示的用户数量是预先编程的。
使用下面的当前代码,它只会选择数组中的第一个对象。如何让它在数组中循环并填充所需的变量?
if let dict = json?["leagueStats"] as? [String:AnyObject] {
// WINNING STREAK
if let dataWinStreak = dict["winningStreak"] as? [[String : AnyObject]] {
let newdictWinStreak = dataWinStreak.first! // I'm guess this needs to be removed and this section re-structured?
let tempWinStreakNumber = newdictWinStreak ["winning_streak"] as? String
let tempWinStreakNewNumber = Int(tempWinStreakNumber!)
let doubleWinStreak = Double(tempWinStreakNewNumber!)
self.winStreak = doubleWinStreak
self.winningStreak = ["Wins"]
let games = [self.winStreak]
self.setWinStreakChart(dataPoints: self.winningStreak, values: games)
}
但是,上面的代码仅从要使用的数组中的第一条记录中提取信息,5
func setWinStreakChart(dataPoints: [String], values: [Double]){
let formato:WinningStreakFormatter = WinningStreakFormatter()
let xaxis:XAxis = XAxis()
winningStreakBarChart.noDataText = "you need to provide some data for the chart."
var dataEntries: [BarChartDataEntry] = Array()
for i in 0..<dataPoints.count {
let dataEntry = BarChartDataEntry(x: Double(i), y: values[i])
dataEntries.append(dataEntry)
formato.stringForValue (Double(i), axis: xaxis)
}
xaxis.valueFormatter = formato
winningStreakBarChart.xAxis.valueFormatter = xaxis.valueFormatter
let chartDataSet = BarChartDataSet(values: dataEntries, label: "Games Played")
let chartData = BarChartData(dataSets: [chartDataSet])
chartData.addDataSet(chartDataSet)
winningStreakBarChart.data = chartData
winningStreakBarChart.xAxis.granularityEnabled = true
winningStreakBarChart.xAxis.granularity = 1.0
self.winningStreakBarChart.xAxis.labelPosition = XAxis.LabelPosition.bottom
}
我希望能够生成3个不同的列,Dicky
,G
,Sultan
,相应的值为5
,2
,和0
这是我显示条形图的代码-当前仅显示1列,显示5
func setWinStreakChart(dataPoints: [String], values: [Double]){
let formato:WinningStreakFormatter = WinningStreakFormatter()
let xaxis:XAxis = XAxis()
winningStreakBarChart.noDataText = "you need to provide some data for the chart."
var dataEntries: [BarChartDataEntry] = Array()
for i in 0..<dataPoints.count {
let dataEntry = BarChartDataEntry(x: Double(i), y: values[i])
dataEntries.append(dataEntry)
formato.stringForValue (Double(i), axis: xaxis)
}
xaxis.valueFormatter = formato
winningStreakBarChart.xAxis.valueFormatter = xaxis.valueFormatter
let chartDataSet = BarChartDataSet(values: dataEntries, label: "Games Played")
let chartData = BarChartData(dataSets: [chartDataSet])
chartData.addDataSet(chartDataSet)
winningStreakBarChart.data = chartData
winningStreakBarChart.xAxis.granularityEnabled = true
winningStreakBarChart.xAxis.granularity = 1.0
self.winningStreakBarChart.xAxis.labelPosition = XAxis.LabelPosition.bottom
}
func setWinStreakChart(数据点:[字符串],值:[双精度]){
let formato:WinningStreakFormatter=WinningStreakFormatter()
设xaxis:xaxis=xaxis()
WinningStreamBarChart.noDataText=“您需要为图表提供一些数据。”
var dataEntries:[BarChartDataEntry]=Array()
对于0中的i..WinningStreakFormatter
类用于格式化xAxis标签,这里我使用了一种从图表对象重用数据的方法,因为WinningStreakFormatter
对图表视图的引用较弱。因此,使用这种方法,我们可以让图表视图保存数据,而不是在thWinningStreamFormatter
import Foundation
import Charts
class WinningStreakFormatter: NSObject, IAxisValueFormatter {
weak var _chartView : BarChartView!
init(chartView : BarChartView) {
self._chartView = chartView
}
public func stringForValue(_ value: Double, axis: AxisBase?) -> String {
let barChartData : IChartDataSet = (self._chartView.barData?.dataSets.first)!
let barChartDataEntry : ChartDataEntry = barChartData.entryForIndex(Int(value))!
return barChartDataEntry.data as! String
}
}
参考下面的代码以准备建议的图表,在下面的代码中,chartView基本上是BarChartView
type实例变量。此外,我使用了与API中相同的数据结构,您可以简单地用解析的数据结构替换数据点
self.chartView.drawBarShadowEnabled = false
self.chartView.drawValueAboveBarEnabled = true
self.chartView.chartDescription?.enabled = false
let xAxis : XAxis = self.chartView.xAxis;
xAxis.labelFont = UIFont(name: "HelveticaNeue-Light", size: 10.0)!
xAxis.labelTextColor = UIColor.black
xAxis.drawAxisLineEnabled = false
xAxis.drawGridLinesEnabled = true
xAxis.granularity = 1;
xAxis.labelPosition = .bottom
xAxis.valueFormatter = WinningStreakFormatter(chartView: self.chartView)
let yAxisLeft : YAxis = self.chartView.leftAxis
yAxisLeft.axisMinimum = 0.0
let yAxisRight : YAxis = self.chartView.rightAxis
yAxisRight.axisMinimum = 0.0
let l : Legend = self.chartView.legend;
l.horizontalAlignment = Legend.HorizontalAlignment.left
l.verticalAlignment = Legend.VerticalAlignment.bottom
l.orientation = Legend.Orientation.horizontal
l.drawInside = false
l.form = Legend.Form.square
l.formSize = 9.0
l.font = UIFont(name: "HelveticaNeue-Light", size: 11.0)!
l.xEntrySpace = 4.0
//Data Structure built for each user for winning streak, you can use your parsing logic to prepare the same
let winningStreakDM1 : [String : Any] = [
"id" : 2,
"user_name" : "Dicky",
"winning_streak" : 5
]
let winningStreakDM2 : [String : Any] = [
"id" : 6,
"user_name" : "G",
"winning_streak" : 2
]
let winningStreakDM3 : [String : Any] = [
"id" : 5,
"user_name" : "Sultan",
"winning_streak" : 0
]
//Array of the each user winning streak dictionary.
let dataPoints = [winningStreakDM1, winningStreakDM2, winningStreakDM3]
var values = [BarChartDataEntry]()
for i in 0..<dataPoints.count {
let xValue = Double(i)
let yValue = Double(dataPoints[i]["winning_streak"] as! Int)
let barChartDataEntry = BarChartDataEntry(x: xValue, y: yValue, data: dataPoints[i]["user_name"] as AnyObject)
values.append(barChartDataEntry)
}
let barChartDataSet = BarChartDataSet(values: values, label: "Winning Streak")
barChartDataSet.colors = ChartColorTemplates.material()
let barChartData = BarChartData(dataSet: barChartDataSet)
barChartData.setValueFont(UIFont.systemFont(ofSize: 12.0))
self.chartView.data = barChartData
self.chartView.trablershadowEnabled=false
self.chartView.DrawValueUpperBarEnabled=true
self.chartView.chartDescription?.enabled=false
让xAxis:xAxis=self.chartView.xAxis;
xAxis.labelFont=UIFont(名称:“HelveticaNeue灯”,大小:10.0)!
xAxis.labelTextColor=UIColor.black
xAxis.drawAxisLineEnabled=false
xAxis.drawGridLinesEnabled=true
xAxis.granularity=1;
xAxis.labelPosition=.bottom
xAxis.valueFormatter=WinningStreamFormatter(图表视图:self.chartView)
让yaxisleet:YAxis=self.chartView.leftAxis
yAxisLeft.axisMinimum=0.0
让yAxisRight:YAxis=self.chartView.rightAxis
yAxisRight.axisMinimum=0.0
让l:Legend=self.chartView.Legend;
l、 horizontalAlignment=Legend.horizontalAlignment.left
l、 垂直对齐=图例.verticalAlignment.bottom
l、 方向=图例。方向。水平
l、 drawInside=false
l、 form=Legend.form.square
l、 formSize=9.0
l、 font=UIFont(名称:“HelveticaNeue灯”,大小:11.0)!
l、 xEntrySpace=4.0
//为每个用户构建的数据结构,您可以使用解析逻辑来准备相同的数据结构
让WinningStreamM1:[字符串:任意]=[
“id”:2,
“用户名”:“迪克”,
“连胜”:5
]
让WinningStreamM2:[字符串:任意]=[
“id”:6,
“用户名”:“G”,
“连胜”:2
]
让WinningStreamM3:[字符串:任意]=[
“id”:5,
“用户名”:“苏丹”,
“连胜”:0
]
//每个用户连胜字典的数组。
让数据点=[winningStreakDM1,winningStreakDM2,winningStreakDM3]
var值=[BarChartDataEntry]()
感谢Prakash-我就快到了:)我的最后一个障碍是winningStreakDM的答案是预先编程的(即3个用户)。我如何循环遍历数组以填充WinningStreamKDM?在我上面的代码中,它只从数组中取出第一个对象,我不知道如何循环遍历以实现我的目标。我已根据这一点更新了问题。Thanks@RDowns您必须遍历winningStreak的数组并准备winningStreakDM或您可以简单地将for循环中的dataPoints
替换为winningStreak
数组,以准备BarChartDataEntry
对象。我需要创建结构和平面图来完成此操作吗?还是我现在走错了路?@RDownsdict[“winningStreak”]
基本上是数组,所以让dataPoints=dict[“winningStreak”]
完全满足您的要求。