Xcode dynamic live update line chart
I have updated Chris Code to Charts 3.0
override func viewDidLoad() {
super.viewDidLoad()
//charts
self.chartView.delegate = self
let set_a: LineChartDataSet = LineChartDataSet(values:[ChartDataEntry(x: Double(0), y: Double(0))], label: "voice")
set_a.drawCirclesEnabled = false
set_a.setColor(UIColor.blue)
let set_b: LineChartDataSet = LineChartDataSet(values: [ChartDataEntry(x: Double(0), y: Double(0))], label: "flow")
set_b.drawCirclesEnabled = false
set_b.setColor(UIColor.green)
self.chartView.data = LineChartData(dataSets: [set_a,set_b])
timer = Timer.scheduledTimer(timeInterval: 0.010, target: self, selector: #selector(updateCounter), userInfo: nil, repeats: true)
}
// add point
var i = 1
func updateCounter() {
self.chartView.data?.addEntry(ChartDataEntry(x: Double(i), y: reading_a![i]), dataSetIndex: 0)
self.chartView.data?.addEntry(ChartDataEntry(x:Double(i) , y:reading_b![i] ), dataSetIndex: 1)
self.chartView.setVisibleXRange(minXRange: Double(1), maxXRange: Double(1000))
self.chartView.notifyDataSetChanged()
self.chartView.moveViewToX(Double(i))
i = i + 1
}
I just made a small that does exactly what you need. It inserts 4 points per second scrolling the chart automatically to new data. (the scroll is smooth, new data is being redrawn well, seriously I don't know why you don't want to give a chance to this approach) You may scroll the chart back to see all its previous points. The chart cells/slices are being reused so you can use this for infinite charts, like displaying heart beat chart for few hours.
Please take a look and let me know what you think.
You can do this with iOS charts:
override func viewDidLoad() {
super.viewDidLoad()
//charts
self.lineChartView.delegate = self
let set_a: LineChartDataSet = LineChartDataSet(yVals: [ChartDataEntry](), label: "a")
set_a.drawCirclesEnabled = false
set_a.setColor(UIColor.blueColor())
let set_b: LineChartDataSet = LineChartDataSet(yVals: [ChartDataEntry](), label: "b")
set_b.drawCirclesEnabled = false
set_b.setColor(UIColor.greenColor())
self.lineChartView.data = LineChartData(xVals: [String](), dataSets: [set_a, set_b])
timer = NSTimer.scheduledTimerWithTimeInterval(0.010, target:self, selector: #selector(ViewController.updateCounter), userInfo: nil, repeats: true)
}
// add point
var i = 0
func updateCounter() {
self.lineChartView.data?.addEntry(ChartDataEntry(value: reading_a[i], xIndex: i), dataSetIndex: 0)
self.lineChartView.data?.addEntry(ChartDataEntry(value: reading_b[i], xIndex: i), dataSetIndex: 1)
self.lineChartView.data?.addXValue(String(i))
self.lineChartView.setVisibleXRange(minXRange: CGFloat(1), maxXRange: CGFloat(50))
self.lineChartView.notifyDataSetChanged()
self.lineChartView.moveViewToX(CGFloat(i))
i = i + 1
}
If you don't manage to find a proper third-party for this, I recommend you to use the following approach:
- Use a tableview rotated 90˚ counterclockwise.
- Implement your custom
UIView
that contains the code to draw (your graph/chart vertex), and then add into into your cell's root view. - Insert 5 cells per second dynamically into the tableview's datasource.
I know its time consuming to implement this engine but this will work 100%. I'm planning to create an open-source project for this. But sadly I don't have any good code to share yet.