iOS Swift Charts 的使用(一):折线图的实现

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

最近项目中遇到了需要获取网站上的数据,然后以折线图的方式表示出来的需求。于是发现了swift下非常强大的图表库-# Charts


下面是这个系列的几篇汇总:
1、折线图
2、柱状图
3、饼状图
4、k线图


下面开始折线图的实现
首先,我们可以通过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 = "暂无数据"
    
    //设置交互样式
    lineChartView.scaleYEnabled = false //取消Y轴缩放
    lineChartView.doubleTapToZoomEnabled = true //双击缩放
    lineChartView.dragEnabled = true //启用拖动手势
    lineChartView.dragDecelerationEnabled = true //拖拽后是否有惯性效果
    lineChartView.dragDecelerationFrictionCoef = 0.9  //拖拽后惯性效果的摩擦系数(0~1),数值越小,惯性越不明显
    
    //设置X轴样式
    let xAxis = lineChartView.xAxis
    xAxis.axisLineWidth = 1.0/UIScreen.main.scale //设置X轴线宽
    xAxis.labelPosition = .bottom //X轴的显示位置,默认是显示在上面的
    xAxis.drawGridLinesEnabled = false;//不绘制网格线
    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数量,数值不一定,如果forceLabelsEnabled等于YES, 则强制绘制制定数量的label, 但是可能不平均
    leftAxis.forceLabelsEnabled = false //不强制绘制指定数量的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  //数字后缀单位
    leftAxis.labelPosition = .outsideChart//label位置
    leftAxis.labelTextColor = UIColor.red//文字颜色
    leftAxis.labelFont = UIFont.systemFont(ofSize: 10)//文字字体
    
    
    //设置网格样式
    leftAxis.gridLineDashLengths = [3.0,3.0]  //设置虚线样式的网格线
    leftAxis.gridColor = UIColor.init(red: 200/255.0, green: 200/255.0, blue: 200/255.0, alpha: 1) //网格线颜色
    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
    
    
    //设置折线图的数据
    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轴的数据格式,可以使用原生的格式如下:
    //`lineChartView.xAxis.valueFormatter = IndexAxisValueFormatter.init(values: xValues)`
    let leftValueFormatter = NumberFormatter()  //自定义格式
    leftValueFormatter.positiveSuffix = "亿"  //数字后缀单位
    
    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轴的数据格式。实现代码如下:

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轴上的第几个数据
        if values == nil {
            return "\(value)"
        }
      
        //print("\(Int(value))")
        return self.values![Int(value)] as! String;
    
    }
    
}

由于作者水平有限,对于文中出现的错误,欢迎批评、指正。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,943评论 4 60
  • 序曲遇上你是命运的使命我用歌声将你从沉睡中唤醒你是我心中的天使为我的世界增添了光明 进行曲为你演奏夜的音乐如同我此...
    magicdmer阅读 543评论 0 2
  • 有生之年,狭路相逢,终不能幸免~ 听到这句的时候,心里的情绪已经翻江倒海的在肆虐,有生之年我们两条线到底要不要在某...
    丶慕城阅读 202评论 0 0
  • 年少的轻狂 不羁的放浪 贪恋你温柔的目光 晴朗的秋季 有人在歌唱 湛蓝天空下 深远的忧伤 听不见的呢喃 是谁在诉说...
    清浅佳人阅读 181评论 0 2
  • 假如对生活不满意,要么改变生活,要么改变世界
    无黎月阅读 161评论 0 0