玩轉(zhuǎn)Charts

  • LineChart 折線圖
  • BarChart 柱狀圖
  • CandleStickChart K線圖
  • PieChart 餅狀圖
  • RadarChart 雷達圖

集成 Charts

source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0'
use_frameworks!
pod 'Charts', '~> 2.2.5'

LineChart

折線圖
import UIKit
import Charts

class TranscriptDetailViewController: UIViewController {
    
    var name:String = ""
    var chartView = LineChartView()
    
    // 柱狀圖橫坐標
    let months = [
        "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep",
        "Oct", "Nov", "Dec"
    ]
    
    // 柱狀的高度值
    let unitsSold = [20.0, 4.0, 6.0, 3.0, 12.0, 16.0, 4.0, 18.0, 2.0, 4.0, 5.0, 4.0]

    @IBOutlet weak var webView: UIWebView!
    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.title = name
        
        self.createLineChartView()
        self.setChart(months, values: unitsSold)
        self.createRightBarButtonItem()
 
    }
    
    // 創(chuàng)建保存按鈕
    func createRightBarButtonItem()
    {
        let buttonRight = UIButton.init(type: UIButtonType.Custom)
        buttonRight.frame = CGRectMake(0, 0, 40, 40)
        self.navigationItem.rightBarButtonItem = UIBarButtonItem(customView: buttonRight)
        buttonRight.setTitle("Save", forState: UIControlState.Normal)
        buttonRight.addTarget(self, action:#selector(self.save(_:)), forControlEvents: UIControlEvents.TouchUpInside)
    }
    
    func save(btn: UIButton)
    {
        // 保存到相冊
        chartView.saveToCameraRoll()
        print("保存成功")
    }
    
    // 創(chuàng)建柱狀圖
    func createLineChartView()
    {
        chartView = LineChartView.init(frame: CGRectMake(0, 64, AppWidth, AppHeight - 64))
        chartView.lineData
        // 簽協(xié)議
        chartView.delegate = self
        chartView.backgroundColor = UIColor.whiteColor()
        self.view.addSubview(chartView)
    }
    
    // 加上模擬數(shù)據(jù)
    func setChart(dataPoints: [String], values: [Double]) {
        var dataEntries: [ChartDataEntry] = []
        for i in 0..<dataPoints.count {
            let dataEntry = ChartDataEntry(value: values[i], xIndex: i)
            dataEntries.append(dataEntry)
        }
        let chartDataSet = LineChartDataSet(yVals: dataEntries, label: "Units Sold")
        let chartData = LineChartData(xVals: months, dataSet: chartDataSet)
        // 加上一個界限, 演示圖中紅色的線
        let jx = ChartLimitLine(limit: 12.0, label: "I am LimitLine")
        chartView.rightAxis.addLimitLine(jx)
        chartView.data = chartData
        // 自定義顏色
        // colors 是一個數(shù)組, 可以給相應的顏色
        chartDataSet.colors = [UIColor.redColor()]
        // API 自帶顏色模板
        // ChartColorTemplates.liberty()
        // ChartColorTemplates.joyful()
        // ChartColorTemplates.pastel()
        // ChartColorTemplates.colorful()
        // ChartColorTemplates.vordiplom()
        chartDataSet.colors = ChartColorTemplates.colorful()
        /**
         // 動畫效果, 簡單列舉幾個, 具體請看API
         case EaseInBack
         case EaseOutBack
         case EaseInOutBack
         case EaseInBounce
         case EaseOutBounce
         case EaseInOutBounce
         */
        chartView.animate(yAxisDuration: 1.0, easingOption: .EaseInBounce)
    }

}

extension TranscriptDetailViewController : ChartViewDelegate {

    // 默認的捏拉縮放和雙擊來進行縮放, 如果某個柱形條被單擊摘符,該柱形條會突出顯示
    // 所以單機某個的時候響應不同的事件, 需要自己編寫 遵循ChartViewDelegate協(xié)議
    // 實現(xiàn) Delegate
    func chartValueSelected(chartView: ChartViewBase, entry: ChartDataEntry, dataSetIndex: Int,     highlight: ChartHighlight) {
        print("\(entry.value) in \(months[entry.xIndex])")
    }
    
}

BarChart

柱狀圖
import UIKit
import Charts

class TranscriptDetailViewController: UIViewController {
    
    var name:String = ""
    var chartView = BarChartView()
    // 柱狀圖橫坐標
    let months = [
        "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep",
        "Oct", "Nov", "Dec"
    ]
    
    // 柱狀的高度值
    let unitsSold = [20.0, 4.0, 6.0, 3.0, 12.0, 16.0, 4.0, 18.0, 2.0, 4.0, 5.0, 4.0]


    @IBOutlet weak var webView: UIWebView!
    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.title = name
        
        self.createLineChartView()
        self.setChart(months, values: unitsSold)
        self.createRightBarButtonItem()

 
    }
    
    // 創(chuàng)建保存按鈕
    func createRightBarButtonItem()
    {
        let buttonRight = UIButton.init(type: UIButtonType.Custom)
        buttonRight.frame = CGRectMake(0, 0, 40, 40)
        self.navigationItem.rightBarButtonItem = UIBarButtonItem(customView: buttonRight)
        buttonRight.setTitle("Save", forState: UIControlState.Normal)
        buttonRight.addTarget(self, action:#selector(self.save(_:)), forControlEvents: UIControlEvents.TouchUpInside)
    }
    func save(btn: UIButton)
    {
        // 保存到相冊
        chartView.saveToCameraRoll()
        print("保存成功")
    }
    
    // 創(chuàng)建柱狀圖
    func createLineChartView()
    {
        chartView = BarChartView.init(frame: CGRectMake(0, 64, AppWidth, AppHeight - 64))
        chartView.barData
        // 簽協(xié)議
        chartView.delegate = self
        chartView.backgroundColor = UIColor.whiteColor()
        self.view.addSubview(chartView)
    }
    // 加上模擬數(shù)據(jù)
    func setChart(dataPoints: [String], values: [Double]) {
        var dataEntries: [BarChartDataEntry] = []
        for i in 0..<dataPoints.count {
            let dataEntry = BarChartDataEntry(value: values[i], xIndex: i)
            dataEntries.append(dataEntry)
        }
        let chartDataSet = BarChartDataSet(yVals: dataEntries, label: "Units Sold")
        let chartData = BarChartData(xVals: months, dataSet: chartDataSet)
        // 加上一個界限, 演示圖中紅色的線
        let jx = ChartLimitLine(limit: 12.0, label: "I am LimitLine")
        chartView.rightAxis.addLimitLine(jx)
        chartView.data = chartData
        // 自定義顏色
        // 例子中有十二個柱狀圖
        // colors 是一個數(shù)組, 可以給相應的顏色
//        chartDataSet.colors = [UIColor.blueColor(), UIColor.redColor(), UIColor.cyanColor()]
        // API 自帶顏色模板
        // ChartColorTemplates.liberty()
        // ChartColorTemplates.joyful()
        // ChartColorTemplates.pastel()
        // ChartColorTemplates.colorful()
        // ChartColorTemplates.vordiplom()
//        chartDataSet.colors = ChartColorTemplates.liberty()
        
        chartDataSet.colors = ChartColorTemplates.joyful()
        /**
         // 動畫效果, 簡單列舉幾個, 具體請看API
         case EaseInBack
         case EaseOutBack
         case EaseInOutBack
         case EaseInBounce
         case EaseOutBounce
         case EaseInOutBounce
         */
        chartView.animate(yAxisDuration: 1.0, easingOption: .EaseInBounce)
    }
    


}

extension TranscriptDetailViewController : ChartViewDelegate {
    
    // 默認的捏拉縮放和雙擊來進行縮放, 如果某個柱形條被單擊领炫,該柱形條會突出顯示
    // 所以單機某個的時候響應不同的事件, 需要自己編寫 遵循ChartViewDelegate協(xié)議
    // 實現(xiàn) Delegate
    func chartValueSelected(chartView: ChartViewBase, entry: ChartDataEntry, dataSetIndex: Int, highlight: ChartHighlight) {
        print("\(entry.value) in \(months[entry.xIndex])")
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}

CandleStickChart

K線圖
import UIKit
import Charts

class TranscriptDetailViewController: UIViewController {
    
    var name:String = ""
    var chartView = CandleStickChartView()


    @IBOutlet weak var webView: UIWebView!
    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.title = name
        
        self.createCandleStickChartView()

 
    }
    

    func createCandleStickChartView()
    {
        chartView = CandleStickChartView.init(frame: CGRectMake(0, 64, AppWidth, AppHeight - 64))
        // 簽協(xié)議
        chartView.delegate = self
        chartView.backgroundColor = UIColor.whiteColor()
        // 畫板顏色
        chartView.gridBackgroundColor = UIColor.clearColor()
        chartView.borderColor = UIColor.whiteColor()
        self.view.addSubview(chartView)
        // 橫軸數(shù)據(jù)
        var xValues = [String]()
        for i in 0...25 {
            xValues.append(NSString(format: "%d", i + 1993) as String)
        }
        // 初始化CandleChartDataEntry數(shù)組
        var yValues = [CandleChartDataEntry]()
        // 產(chǎn)生20個隨機立柱數(shù)據(jù)
        for j in 0...24 {
            let val = (Double)(arc4random_uniform(40))
            let high = (Double)(arc4random_uniform(9)) + 8.0
            let low = (Double)(arc4random_uniform(9)) + 8.0
            let open = (Double)(arc4random_uniform(6)) + 1.0
            let close = (Double)(arc4random_uniform(6)) + 1.0
            
            let even = j % 2 == 0
            
            yValues.append(CandleChartDataEntry.init(xIndex: j, shadowH: val + high, shadowL: val - low, open: even ? val + open : val - open, close: even ? val - close : val + close))
        }
        let set1 = CandleChartDataSet.init(yVals: yValues, label: "data set")
        // defult left
        // set1.axisDependency
        // data set color
        set1.setColor(UIColor.blueColor())
        set1.shadowColor = UIColor ( red: 0.5536, green: 0.5528, blue: 0.0016, alpha: 1.0 )
        // 立線的寬度
        set1.shadowWidth = 0.7
        // close >= open
        set1.decreasingColor = UIColor.redColor()
        // 內(nèi)部是否充滿顏色
        set1.decreasingFilled = true
        // open > close
        set1.increasingColor = UIColor ( red: 0.0006, green: 0.2288, blue: 0.001, alpha: 1.0 )
        // 內(nèi)部是否充滿顏色
        set1.increasingFilled = true
        // 賦值數(shù)據(jù)
        let data = CandleChartData(xVals: xValues, dataSet: set1)
        chartView.data = data
    }
    


}

extension TranscriptDetailViewController : ChartViewDelegate {
    


}

PieChart

餅狀圖
import UIKit
import Charts

class TranscriptDetailViewController: UIViewController {
    
    var name:String = ""
    var pieChartView = PieChartView()


    @IBOutlet weak var webView: UIWebView!
    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.title = name
        
        self.createPieChartView()

 
    }
    

    func createPieChartView()
    {
        pieChartView = PieChartView.init(frame: CGRectMake(0, 0, AppWidth, AppHeight))
        pieChartView.delegate = self;
        // 可以調(diào)整大小, 位置
        pieChartView.setExtraOffsets(left: 10.0, top: 10.0, right: 10.0, bottom: 10.0)
        self.view.addSubview(pieChartView)
        var yValues = [BarChartDataEntry]()
        
        // 最好從0 開始. 否則第一個將失去點擊效果, 并出現(xiàn)bug...
//        for i in 0...5 {
//            // 占比數(shù)據(jù)
//            yValues.append(BarChartDataEntry.init(value: (Double)(arc4random_uniform(5)) + 2.0, xIndex: i))
//            
//        }
//        var xValues = [String]()
//        
//        for j in 0...5 {
//            // 描述文字
//            let str = String(format: "%d", j+5)
//            xValues.append(str)
//        }
        
        // 占比數(shù)據(jù)
        yValues.append(BarChartDataEntry.init(value: 34, xIndex: 0))
        yValues.append(BarChartDataEntry.init(value: 30, xIndex: 1))
        yValues.append(BarChartDataEntry.init(value: 36, xIndex: 2))
        
        // 描述文字
        var xValues = [String]()
        xValues.append("語文")
        xValues.append("數(shù)學")
        xValues.append("英語")

        let dataSet: PieChartDataSet = PieChartDataSet.init(yVals: yValues, label: "");
        // 空隙
        dataSet.sliceSpace = 5.0
        var colors = [UIColor]()
        colors.append(UIColor ( red: 0.8185, green: 0.8172, blue: 0.0023, alpha: 1.0 ))
        colors.append(UIColor ( red: 0.0, green: 0.81, blue: 0.81, alpha: 1.0 ))
        colors.append(UIColor.greenColor())
        colors.append(UIColor.grayColor())
        colors.append(UIColor.purpleColor())
        colors.append(UIColor.blueColor())
        dataSet.colors = colors
        // 如果你需要指示文字在外部標注百分比, 你需要這樣.
        dataSet.valueLinePart1OffsetPercentage = 0.8;
        dataSet.valueLinePart1Length = 0.2;
        dataSet.valueLinePart2Length = 0.4;
        dataSet.yValuePosition = .OutsideSlice
        let data = PieChartData(xVals: xValues, dataSet: dataSet)
        let formatter = NSNumberFormatter.init()
        formatter.maximumFractionDigits = 1
        formatter.numberStyle = NSNumberFormatterStyle.PercentStyle
        formatter.multiplier = 1.0
        formatter.percentSymbol = " %"
        data.setValueFormatter(formatter)
        data.setValueTextColor(UIColor.blackColor())
        pieChartView.data = data

    }
    


}

extension TranscriptDetailViewController : ChartViewDelegate {
    


}

RadarChart

雷達圖
import UIKit
import Charts

class TranscriptDetailViewController: UIViewController {
    
    var name:String = ""
    var radarBarChartView = RadarChartView()


    @IBOutlet weak var webView: UIWebView!
    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.title = name
        
        self.createRadarChartView()
    }
    

    func createRadarChartView()
    {
        radarBarChartView = RadarChartView.init(frame: CGRectMake(0, 0, AppWidth, AppHeight))
        
        radarBarChartView.setExtraOffsets(left: 10.0, top: 10.0, right: 10.0, bottom: 10.0)
        // 描述文字
        radarBarChartView.descriptionText = "descriptionText"
        // 指向定點線的寬度
        radarBarChartView.webLineWidth = 2.0
        radarBarChartView.innerWebColor = UIColor.blackColor()
        radarBarChartView.innerWebLineWidth = 0.75
        radarBarChartView.webAlpha = 1.0
        self.view.backgroundColor = UIColor.whiteColor()
        self.view.addSubview(radarBarChartView)

        var yValues1 = [ChartDataEntry]()
        var yValues2 = [ChartDataEntry]()
        var xValues = [String]()
        for i in 0...8 {
            yValues1.append(ChartDataEntry(value: (Double)(arc4random_uniform(5)), xIndex: i))
            yValues2.append(ChartDataEntry(value: (Double)(arc4random_uniform(5)), xIndex: i))
            let str = String(format: "%d", i+5)
            xValues.append(str)
        }
        
        let dataSet = RadarChartDataSet.init(yVals: yValues1, label: "data Set")
        dataSet.drawFilledEnabled = true
        dataSet.setColor(UIColor ( red: 0.7913, green: 0.9949, blue: 0.4941, alpha: 1.0 ))
        dataSet.fillColor = UIColor ( red: 0.7913, green: 0.9949, blue: 0.4941, alpha: 1.0 )
        dataSet.lineWidth = 1.0
        
        let dataSet1 = RadarChartDataSet.init(yVals: yValues2, label: "data Set2")
        dataSet1.drawFilledEnabled = true
        dataSet1.setColor(UIColor ( red: 0.4702, green: 1.0, blue: 0.9962, alpha: 1.0 ))
        dataSet1.fillColor = UIColor ( red: 0.4702, green: 1.0, blue: 0.9962, alpha: 1.0 )
        dataSet1.lineWidth = 1.5
        
        let data = RadarChartData.init(xVals: xValues, dataSets: [dataSet, dataSet1])
        radarBarChartView.data = data
    }

}

extension TranscriptDetailViewController : ChartViewDelegate {

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蒿涎,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子精肃,更是在濱河造成了極大的恐慌灰瞻,老刑警劉巖丧叽,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異糟趾,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門义郑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蝶柿,“玉大人,你說我怎么就攤上這事非驮〗惶溃” “怎么了?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵劫笙,是天一觀的道長芙扎。 經(jīng)常有香客問我,道長填大,這世上最難降的妖魔是什么纵顾? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮栋盹,結(jié)果婚禮上施逾,老公的妹妹穿的比我還像新娘。我一直安慰自己例获,他們只是感情好汉额,可當我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著榨汤,像睡著了一般蠕搜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上收壕,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天妓灌,我揣著相機與錄音,去河邊找鬼蜜宪。 笑死虫埂,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的圃验。 我是一名探鬼主播掉伏,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼澳窑!你這毒婦竟也來了斧散?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤摊聋,失蹤者是張志新(化名)和其女友劉穎鸡捐,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體麻裁,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡箍镜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年瞻鹏,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鹿寨。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡新博,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出脚草,到底是詐尸還是另有隱情赫悄,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布馏慨,位于F島的核電站埂淮,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏写隶。R本人自食惡果不足惜倔撞,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望慕趴。 院中可真熱鬧痪蝇,春花似錦、人聲如沸冕房。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽耙册。三九已至给僵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間详拙,已是汗流浹背帝际。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留饶辙,地道東北人蹲诀。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像畸悬,于是被迫代替她去往敵國和親侧甫。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 一圖勝千文蹋宦,純粹的數(shù)據(jù)枯燥、無聊咒锻,讓人看不下去冷冗,改變一下形式,用圖表裝飾一下惑艇,立馬有趣多了蒿辙。既然有這樣的外部需求拇泛,...
    沉思的Panda閱讀 53,677評論 13 70
  • #define MAIN_WIDTH [[UIScreen mainScreen] bounds].size.wi...
    HuLL樂樂閱讀 9,676評論 14 6
  • 最近公司項目中要加一個折線圖的需求因為是金融項目考慮到后期可能會有大量的餅狀和折線圖的需求,仔細搜索一番覺得用個成...
    約翰丶碼農(nóng)閱讀 19,170評論 10 24
  • 生理期思灌。間隔二十四天俺叭,比先前要正常一些。 本來不打算要盤的泰偿,總覺得少些什么熄守,還是盤了半小時。泡一會腳耗跛,腿還是很僵裕照。...
    冬日蝴蝶結(jié)閱讀 153評論 0 0
  • 壹 C副大大說,她最佩服地方上來的人调塌。這個地方應該是指京城之下晋南,縣城之上的地方。這句話羔砾,是她開完某會回來之后的感慨...
    如一的世界閱讀 231評論 0 0