iOS Swift Charts 的使用(一):折線圖的實現(xiàn)

屏幕快照 2018-01-05 下午5.23.09.png

最近項目中遇到了需要獲取網(wǎng)站上的數(shù)據(jù),然后以折線圖的方式表示出來的需求。于是發(fā)現(xiàn)了swift下非常強大的圖表庫-# Charts


下面是這個系列的幾篇匯總:
1其垄、折線圖
2苛蒲、柱狀圖
3、餅狀圖
4绿满、k線圖


下面開始折線圖的實現(xiàn)
首先臂外,我們可以通過cocoapods 的方式,方便的導入Charts喇颁,接下來我們就可以擼代碼了寄月。
因為代碼中基本每個功能后都有注釋,所以就不多做解釋无牵,直接貼代碼:

func test2()
{
    //let lineChartView = LineChartView()
    lineChartView.frame = CGRect(x: 20, y: 60, width: self.view.bounds.width - 40, height: 600)
    self.view.addSubview(lineChartView)
    lineChartView.delegate = self
    
    lineChartView.backgroundColor = UIColor(red: 230/255.0, green: 253/255.0, blue: 253/255.0, alpha: 1.0)
    lineChartView.noDataText = "暫無數(shù)據(jù)"
    
    //設置交互樣式
    lineChartView.scaleYEnabled = false //取消Y軸縮放
    lineChartView.doubleTapToZoomEnabled = true //雙擊縮放
    lineChartView.dragEnabled = true //啟用拖動手勢
    lineChartView.dragDecelerationEnabled = true //拖拽后是否有慣性效果
    lineChartView.dragDecelerationFrictionCoef = 0.9  //拖拽后慣性效果的摩擦系數(shù)(0~1),數(shù)值越小厂抖,慣性越不明顯
    
    //設置X軸樣式
    let xAxis = lineChartView.xAxis
    xAxis.axisLineWidth = 1.0/UIScreen.main.scale //設置X軸線寬
    xAxis.labelPosition = .bottom //X軸的顯示位置茎毁,默認是顯示在上面的
    xAxis.drawGridLinesEnabled = false;//不繪制網(wǎng)格線
    xAxis.spaceMin = 4;//設置label間隔
    xAxis.axisMinimum = 0
    xAxis.labelTextColor = UIColor.blue//label文字顏色
    
    //設置Y軸樣式
    lineChartView.rightAxis.enabled = false  //不繪制右邊軸
    let leftAxis = lineChartView.leftAxis
    leftAxis.labelCount = 16 //Y軸label數(shù)量,數(shù)值不一定忱辅,如果forceLabelsEnabled等于YES, 則強制繪制制定數(shù)量的label, 但是可能不平均
    leftAxis.forceLabelsEnabled = false //不強制繪制指定數(shù)量的label
    leftAxis.axisMinimum = 0 //設置Y軸的最小值
    leftAxis.drawZeroLineEnabled = true //從0開始繪制
    //leftAxis.axisMaximum = 1000 //設置Y軸的最大值
    leftAxis.inverted = false //是否將Y軸進行上下翻轉
    leftAxis.axisLineWidth = 1.0/UIScreen.main.scale //設置Y軸線寬
    leftAxis.axisLineColor = UIColor.cyan//Y軸顏色
    //leftAxis.valueFormatter = NumberFormatter()//自定義格式
    //leftAxis.s  //數(shù)字后綴單位
    leftAxis.labelPosition = .outsideChart//label位置
    leftAxis.labelTextColor = UIColor.red//文字顏色
    leftAxis.labelFont = UIFont.systemFont(ofSize: 10)//文字字體
    
    
    //設置網(wǎng)格樣式
    leftAxis.gridLineDashLengths = [3.0,3.0]  //設置虛線樣式的網(wǎng)格線
    leftAxis.gridColor = UIColor.init(red: 200/255.0, green: 200/255.0, blue: 200/255.0, alpha: 1) //網(wǎng)格線顏色
    leftAxis.gridAntialiasEnabled = true //開啟抗鋸齒
    
    
    //添加限制線
    let litmitLine = ChartLimitLine(limit: 260, label: "限制線")
    litmitLine.lineWidth = 2
    litmitLine.lineColor = UIColor.green
    litmitLine.lineDashLengths = [5.0,5.0] //虛線樣式
    litmitLine.labelPosition = .rightTop  // 限制線位置
    litmitLine.valueTextColor = UIColor.brown
    litmitLine.valueFont = UIFont.systemFont(ofSize: 12)
    leftAxis.addLimitLine(litmitLine)
    leftAxis.drawLimitLinesBehindDataEnabled = true  //設置限制線繪制在折線圖的后面
    
    //設置折線圖描述及圖例樣式
    lineChartView.chartDescription?.text = "折線圖" //折線圖描述
    lineChartView.chartDescription?.textColor = UIColor.cyan  //描述字體顏色
    lineChartView.legend.form = .line  // 圖例的樣式
    lineChartView.legend.formSize = 20  //圖例中線條的長度
    lineChartView.legend.textColor = UIColor.darkGray
    
    
    //設置折線圖的數(shù)據(jù)
    let xValues = ["x1","x2","x3","x4","x5","x6","x7","x8","x9","x10","x11","x12","x13","x14","x15","x16","x17","x18","x19","x20","x21","x22","x23","x24","x25","x26"]
    lineChartView.xAxis.valueFormatter = KMChartAxisValueFormatter.init(xValues as NSArray)
    //ineChartView.xAxis.labelCount = 12
    //lineChartView.leftAxis.valueFormatter = KMChartAxisValueFormatter.init()
    //在這里如果不需要自定義x軸的數(shù)據(jù)格式七蜘,可以使用原生的格式如下:
    //`lineChartView.xAxis.valueFormatter = IndexAxisValueFormatter.init(values: xValues)`
    let leftValueFormatter = NumberFormatter()  //自定義格式
    leftValueFormatter.positiveSuffix = "億"  //數(shù)字后綴單位
    
    lineChartView.leftAxis.valueFormatter = DefaultAxisValueFormatter.init(formatter: leftValueFormatter)
    
    var yDataArray1 = [ChartDataEntry]()
    for i in 0...xValues.count-1 {
        let y = arc4random()%500
        let entry = ChartDataEntry.init(x: Double(i), y: Double(y))
        
        yDataArray1.append(entry)
    }
    
    
    let set1 = LineChartDataSet.init(values: yDataArray1, label: "test1")
    set1.colors = [UIColor.orange]
    set1.drawCirclesEnabled = false //是否繪制轉折點
    set1.lineWidth = 1
    set1.mode = .horizontalBezier  //設置曲線是否平滑
    
    var yDataArray2 = [ChartDataEntry]();
    for i in 0...(xValues.count-1) {
        let y = arc4random()%500+1
        let entry = ChartDataEntry.init(x: Double(i), y: Double(y))
        
        yDataArray2.append(entry);
    }
    let set2 = LineChartDataSet.init(values: yDataArray2, label: "test1")
    set2.colors = [UIColor.green]
    set2.drawCirclesEnabled = false
    set2.lineWidth = 1.0
    
    let data = LineChartData.init(dataSets: [set1,set2])
    
    lineChartView.data = data
    //lineChartView.animate(xAxisDuration: 1.0, yAxisDuration: 1.0, easingOption: .easeInBack)
    lineChartView.animate(xAxisDuration: 1)  //設置動畫時間
    
}

func showMarkerView(value:String)
{
    let marker = MarkerView.init(frame: CGRect(x: 20, y: 20, width: 60, height: 20))
    marker.chartView = self.lineChartView
    let label = UILabel(frame: CGRect(x: 0, y: 0, width: 60, height: 20))
    label.text = value
    label.textColor = UIColor.white
    label.font = UIFont.systemFont(ofSize: 12)
    label.backgroundColor = UIColor.gray
    label.textAlignment = .center
    marker.addSubview(label)
    self.lineChartView.marker = marker
}

func chartValueSelected(_ chartView: ChartViewBase, entry: ChartDataEntry, highlight: Highlight)
{
    self.showMarkerView(value: "\(entry.y)")
}

在文中提到的 KMChartAxisValueFormatter 這是我自定義的一個類,用于處理x軸的數(shù)據(jù)格式墙懂。實現(xiàn)代碼如下:

import Foundation

class KMChartAxisValueFormatter: NSObject,IAxisValueFormatter,IValueFormatter
{
    func stringForValue(_ value: Double, entry: ChartDataEntry, dataSetIndex: Int, viewPortHandler: ViewPortHandler?) -> String
    {
        //print("======\(value)")
        return String(format:"%.2f%%",value)
    }
    
    var values:NSArray?
    override init()
    {
        super.init()
    }
    
    init(_ values: NSArray)
    {
        super.init()
        
        self.values = values
    }
    
    
    
    func stringForValue(_ value: Double, axis: AxisBase?) -> String
    {
        //此處的value指的是x軸上的第幾個數(shù)據(jù)
        if values == nil {
            return "\(value)"
        }
      
        //print("\(Int(value))")
        return self.values![Int(value)] as! String;
    
    }
    
}

由于作者水平有限橡卤,對于文中出現(xiàn)的錯誤,歡迎批評损搬、指正碧库。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市巧勤,隨后出現(xiàn)的幾起案子嵌灰,更是在濱河造成了極大的恐慌,老刑警劉巖颅悉,帶你破解...
    沈念sama閱讀 216,843評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件沽瞭,死亡現(xiàn)場離奇詭異,居然都是意外死亡剩瓶,警方通過查閱死者的電腦和手機驹溃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來延曙,“玉大人豌鹤,你說我怎么就攤上這事≈Φ蓿” “怎么了傍药?”我有些...
    開封第一講書人閱讀 163,187評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我拐辽,道長拣挪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,264評論 1 292
  • 正文 為了忘掉前任俱诸,我火速辦了婚禮菠劝,結果婚禮上,老公的妹妹穿的比我還像新娘睁搭。我一直安慰自己赶诊,他們只是感情好,可當我...
    茶點故事閱讀 67,289評論 6 390
  • 文/花漫 我一把揭開白布园骆。 她就那樣靜靜地躺著舔痪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪锌唾。 梳的紋絲不亂的頭發(fā)上锄码,一...
    開封第一講書人閱讀 51,231評論 1 299
  • 那天,我揣著相機與錄音晌涕,去河邊找鬼滋捶。 笑死,一個胖子當著我的面吹牛余黎,可吹牛的內容都是我干的重窟。 我是一名探鬼主播,決...
    沈念sama閱讀 40,116評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼惧财,長吁一口氣:“原來是場噩夢啊……” “哼巡扇!你這毒婦竟也來了?” 一聲冷哼從身側響起垮衷,我...
    開封第一講書人閱讀 38,945評論 0 275
  • 序言:老撾萬榮一對情侶失蹤霎迫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后帘靡,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體知给,經...
    沈念sama閱讀 45,367評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,581評論 2 333
  • 正文 我和宋清朗相戀三年描姚,在試婚紗的時候發(fā)現(xiàn)自己被綠了涩赢。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,754評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡轩勘,死狀恐怖筒扒,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情绊寻,我是刑警寧澤花墩,帶...
    沈念sama閱讀 35,458評論 5 344
  • 正文 年R本政府宣布悬秉,位于F島的核電站,受9級特大地震影響冰蘑,放射性物質發(fā)生泄漏和泌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,068評論 3 327
  • 文/蒙蒙 一祠肥、第九天 我趴在偏房一處隱蔽的房頂上張望武氓。 院中可真熱鬧,春花似錦仇箱、人聲如沸县恕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽忠烛。三九已至,卻和暖如春权逗,著一層夾襖步出監(jiān)牢的瞬間美尸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評論 1 269
  • 我被黑心中介騙來泰國打工旬迹, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人求类。 一個月前我還...
    沈念sama閱讀 47,797評論 2 369
  • 正文 我出身青樓奔垦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親尸疆。 傳聞我的和親對象是個殘疾皇子椿猎,可洞房花燭夜當晚...
    茶點故事閱讀 44,654評論 2 354

推薦閱讀更多精彩內容

  • 發(fā)現(xiàn) 關注 消息 iOS 第三方庫、插件寿弱、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,096評論 4 62
  • 序曲遇上你是命運的使命我用歌聲將你從沉睡中喚醒你是我心中的天使為我的世界增添了光明 進行曲為你演奏夜的音樂如同我此...
    magicdmer閱讀 557評論 0 2
  • 有生之年犯眠,狹路相逢,終不能幸免~ 聽到這句的時候症革,心里的情緒已經翻江倒海的在肆虐筐咧,有生之年我們兩條線到底要不要在某...
    丶慕城閱讀 209評論 0 0
  • 年少的輕狂 不羈的放浪 貪戀你溫柔的目光 晴朗的秋季 有人在歌唱 湛藍天空下 深遠的憂傷 聽不見的呢喃 是誰在訴說...
    清淺佳人閱讀 185評論 0 2
  • 假如對生活不滿意,要么改變生活噪矛,要么改變世界
    無黎月閱讀 161評論 0 0