Ios Xcode动态实时更新折线图

Ios Xcode动态实时更新折线图,ios,swift,xcode,ios-charts,Ios,Swift,Xcode,Ios Charts,我正在尝试创建一个折线图,其中我将连续绘制数据,以便在实时更新中观察图形,将在大约5点左右每秒绘制。我正在寻找的图形将类似于此处显示的图形 或 我一直在玩一些不同的图表框架,如iOS图表,但我似乎无法获得我正在寻找的确切图形,在那里实时更新可以用不断变化的X轴绘制图表 使用iOS图表,我成功地创建了一种进化图,下面是示例代码 @IBOutlet weak var chartView: LineChartView! var xAxisArray : [String]? var yAxisArr

我正在尝试创建一个折线图,其中我将连续绘制数据,以便在实时更新中观察图形,将在大约5点左右每秒绘制。我正在寻找的图形将类似于此处显示的图形

我一直在玩一些不同的图表框架,如iOS图表,但我似乎无法获得我正在寻找的确切图形,在那里实时更新可以用不断变化的X轴绘制图表

使用iOS图表,我成功地创建了一种进化图,下面是示例代码

@IBOutlet weak var chartView: LineChartView!
var xAxisArray : [String]?
var yAxisArray : [Double]?
var date : NSDate?
var dateFormatter : NSDateFormatter?

override func viewDidLoad() {
    super.viewDidLoad()

    self.title = "Live Graph"

    let stringArray = NSMutableArray()
    let numberArray = NSMutableArray()

    dateFormatter = NSDateFormatter()
    dateFormatter!.dateFormat = "HH:mm:ss"
    date = NSDate()

    //Insert random values into chart
    for(var i = 0; i < 40; i++)
    {
        date = date!.dateByAddingTimeInterval(0.3)
        let stringDate = dateFormatter?.stringFromDate(date!)
        stringArray.addObject(stringDate!)
        let randomNum = self.randomBetweenNumbers(0.0005, secondNum: 0.0015)
        numberArray.addObject(randomNum)
    }

    xAxisArray = stringArray as NSArray as? [String]
    yAxisArray = numberArray as NSArray as? [Double]

    configureChart()
    setData()

    NSTimer.scheduledTimerWithTimeInterval(0.2, target: self, selector: "updateChart", userInfo: nil, repeats: true)
}

func configureChart()
{
    //Chart config
    chartView.descriptionText = ""
    chartView.noDataTextDescription = "Add Data"
    chartView.drawGridBackgroundEnabled = false
    chartView.dragEnabled = true
    chartView.rightAxis.enabled = false
    chartView.doubleTapToZoomEnabled = false
    chartView.legend.enabled = false

    //Configure xAxis
    let chartXAxis = chartView.xAxis as ChartXAxis
    chartXAxis.labelPosition = .Bottom
    chartXAxis.setLabelsToSkip(5)

    //configure yAxis

    chartView.zoom(1.0, scaleY: 1.0, x: 0.0, y: 0.0)
}

func randomBetweenNumbers(firstNum: CGFloat, secondNum: CGFloat) -> CGFloat{
    return CGFloat(arc4random()) / CGFloat(UINT32_MAX) * abs(firstNum - secondNum) + min(firstNum, secondNum)
}

func updateChart()
{
    let mutableArray = NSMutableArray()
    for(var i = 1; i < xAxisArray?.count; i++)
    {
        mutableArray.addObject(xAxisArray![i])
    }

    date = date!.dateByAddingTimeInterval(1.0)
    let str = dateFormatter!.stringFromDate(date!)
    mutableArray.addObject(str)

    xAxisArray = mutableArray as NSArray as? [String]

    //Numbers
    let numberArray = NSMutableArray()
    for(var i = 1; i < yAxisArray?.count; i++)
    {
        numberArray.addObject(yAxisArray![i])
    }


    let randomNum = self.randomBetweenNumbers(0.0005, secondNum: 0.0015)
    let convertToDouble = Double(randomNum)

    numberArray.addObject(convertToDouble)

    yAxisArray = numberArray as NSArray as? [Double]

    setData()
}

func setData()
{
    // 1 - creating an array of data entries
    var yVals1 : [ChartDataEntry] = [ChartDataEntry]()
    for var i = 0; i < xAxisArray!.count; i++ {
        yVals1.append(ChartDataEntry(value: yAxisArray![i], xIndex: i))
    }

    // 2 - create a data set with our array
    let set1: LineChartDataSet = LineChartDataSet(yVals: yVals1, label: "")

    set1.axisDependency = .Left // Line will correlate with left axis values
    set1.setColor(UIColor.blueColor().colorWithAlphaComponent(0.5)) // our line's opacity is 50%
    set1.setCircleColor(UIColor.blueColor()) // our circle will be dark red
    set1.lineWidth = 2.0
    set1.circleRadius = 6.0 // the radius of the node circle
    set1.fillAlpha = 65 / 255.0
    set1.fillColor = UIColor.blueColor()
    set1.highlightColor = UIColor.whiteColor()
    set1.drawCircleHoleEnabled = true
    set1.drawFilledEnabled = true

    //3 - create an array to store our LineChartDataSets
    var dataSets : [LineChartDataSet] = [LineChartDataSet]()
    dataSets.append(set1)

    //4 - pass our months in for our x-axis label value along with our dataSets
    let data: LineChartData = LineChartData(xVals: xAxisArray, dataSets: dataSets)

    //5 - finally set our data
    self.chartView.data = data

    //Clear text color
    chartView.data?.setValueTextColor(UIColor.clearColor())
}
@ibvar图表视图:线条图表视图!
var xAxisArray:[字符串]?
变量:数组:[Double]?
var日期:NSDate?
var dateFormatter:NSDateFormatter?
重写func viewDidLoad(){
super.viewDidLoad()
self.title=“实时图形”
设stringArray=NSMutableArray()
设numberArray=NSMutableArray()
dateFormatter=NSDateFormatter()
dateFormatter!.dateFormat=“HH:mm:ss”
date=NSDate()
//在图表中插入随机值
对于(变量i=0;i<40;i++)
{
日期=日期!.dateByAddingTimeInterval(0.3)
设stringDate=dateFormatter?.stringFromDate(日期!)
stringArray.addObject(stringDate!)
让randomNum=self.randomBetweenNumber(0.0005,secondNum:0.0015)
numberraray.addObject(随机数)
}
xAxisArray=stringArray作为NSArray作为?[String]
yAxisArray=numberArray作为NSArray作为?[双精度]
配置图表()
setData()
scheduledTimerWithTimeInterval(0.2,目标:self,选择器:“updateChart”,userInfo:nil,repeats:true)
}
函数配置图表()
{
//图表配置
chartView.descriptionText=“”
chartView.noDataTextDescription=“添加数据”
chartView.drawGridBackgroundEnabled=false
chartView.dragEnabled=true
chartView.rightAxis.enabled=false
chartView.doubleTapToZoomEnabled=false
chartView.legend.enabled=false
//配置xAxis
让chartXAxis=chartView.xAxis作为chartXAxis
chartXAxis.labelPosition=.Bottom
chartXAxis.setLabelsToSkip(5)
//配置yAxis
缩放(1.0,缩放比例:1.0,x:0.0,y:0.0)
}
func random介于数字之间(firstNum:CGFloat,secondNum:CGFloat)->CGFloat{
返回CGFloat(arc4random())/CGFloat(UINT32_MAX)*abs(firstNum-secondNum)+min(firstNum,secondNum)
}
func updateChart()
{
设mutableArray=NSMutableArray()
对于(变量i=1;i
但是如果你尝试一下,你会发现它相当不稳定,加上每一个x轴标签都会更新,我希望x轴能继续发展,并在绘图继续时在屏幕上设置动画,如示例中所示

有谁知道有什么绘图软件可以让我复制这种类型的图表,或者是否可以使用iOS图表实现这种效果

编辑:

我正在尝试实现这种类型的绘图示例


希望更顺利,

如果您没有找到合适的第三方,我建议您使用以下方法:

  • 使用逆时针旋转90˚的桌面视图
  • 实现自定义
    ui视图
    ,其中包含要绘制的代码(图形/图表顶点),然后添加到单元格的根视图中
  • 每秒动态插入5个单元格到tableview的数据源中
  • 我知道实现这个引擎很费时,但这将100%起作用。 我计划为此创建一个开源项目。但遗憾的是,我还没有任何好的代码可以共享。

    我刚刚编写了。它每秒插入4个点,自动将图表滚动到新数据。(滚动是平滑的,新数据正在被重新绘制好,说真的,我不知道你为什么不想给这种方法一个机会)你可以滚动图表,查看它以前的所有点。正在重用图表单元格/切片,因此您可以将其用于无限图表,例如显示图表
    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
    }