Saghir A. Khatri
Saghir A. Khatri

Reputation: 3128

ios charts not displaying line/bar in charts

I am working on ios-charts by Daniel Gindi on swift 3.0. I have written following code for bar charts

var dataEntries: [BarChartDataEntry] = []
for i in 0..<dateTime.count {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "MM/dd/yyyy hh:mm:ss aa"
    let dateObj = dateFormatter.date(from: dateTime[i])
    let timeIntervalForDate = dateObj!.timeIntervalSince1970
    let dataEntry = BarChartDataEntry(x: Double(timeIntervalForDate), y: Double(readings[i]))
    dataEntries.append(dataEntry)
}
let chartDataSet = BarChartDataSet(values: dataEntries, label: "Units")
let chartData = BarChartData(dataSet: chartDataSet)
self.ChartsView.data = chartData

i get following result in emulator: enter image description here

you can see no red line reflecing my values. I even zoomed to charts but nothing was shown.

I also tried line chart with sample values. Here is the code:

let dollars1 = [20.0, 4.0, 6.0, 3.0, 12.0, 16.0, 4.0, 18.0, 2.0, 4.0, 5.0, 4.0]
let months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
var yValues : [ChartDataEntry] = [ChartDataEntry]()
for i in 0 ..< months.count {
    yValues.append(ChartDataEntry(x: Double(i + 1), y: dollars1[i]))
}
let LineData = LineChartData()
let ds = LineChartDataSet(values: yValues, label: "Months")

LineData.addDataSet(ds)
self.ChartsView.data = LineData

Its result is even more weird. No grid lines are shown either in this chart. Here is the image.

I am not sure what is wrong with these graphs. Am I missing something. So far i am unable to look any furthur as most solutions are using old version of charts(or may be it is something else i am not aware). Please guide me to proper direction. Thanks

enter image description here

Upvotes: 1

Views: 3689

Answers (3)

BugFinder
BugFinder

Reputation: 147

hey nothing is disabled in iOS charts everything is working fine..Here is the code that I have used in my app to display horizontal chart as well as vertical chart hope it helps to anyone who is stucked on IOS chart...stay tune with StackOverflow... enjoy coding :)

import UIKit

import Charts

class DashboardViewController: UIViewController, ChartViewDelegate
{
 @IBOutlet weak var barview: BarChartView!
 @IBOutlet weak var horizontalview: HorizontalBarChartView!
 var attendencelabels = [String]()
 let Present = [60.0, 60.0]
 let Absent = [20.0,40.0]
 var subjects : [String]!
 var maxUnits : Double!
 override func viewDidLoad() {
    super.viewDidLoad()
    barview.delegate = self
    barview.noDataText = "You need to provide data for the chart."
    barview.chartDescription?.text = ""
    attendencelabels.append("March")
    attendencelabels.append("April")
    subjects = ["Physics","Chemistry","Biology","English","Maths"]
    horizontalview.delegate = self
    var marks = [60.0,70.0,60.0,80.0,90.0]
    maxUnits = marks.max()
    setHorizontalChart(dataPoints: subjects, values: marks)
    //legend
    let legend = barview.legend
    legend.enabled = true
    legend.horizontalAlignment = .center
    legend.verticalAlignment = .bottom
    legend.orientation = .horizontal
    legend.drawInside = false
    legend.yOffset = 10.0;
    legend.xOffset = 10.0;
    legend.yEntrySpace = 0.0;
    let xaxis = barview.xAxis
    xaxis.valueFormatter = DefaultAxisValueFormatter.self as! IAxisValueFormatter
    xaxis.drawGridLinesEnabled = true
    xaxis.labelPosition = .top
    xaxis.centerAxisLabelsEnabled = true
    xaxis.valueFormatter = IndexAxisValueFormatter(values:self.attendencelabels)
    xaxis.granularity = 1
    let leftAxisFormatter = NumberFormatter()
    leftAxisFormatter.maximumFractionDigits = 1
    let yaxis = barview.leftAxis
    yaxis.spaceTop = 0.35
    yaxis.axisMinimum = 0
    yaxis.drawGridLinesEnabled = false
    barview.rightAxis.enabled = false
    setChart()
}

func setChart() {
    barview.noDataText = "You need to provide data for the chart."
    var dataEntries: [BarChartDataEntry] = []
    var dataEntries1: [BarChartDataEntry] = []
    for i in 0..<self.attendencelabels.count 
    {

        let dataEntry = BarChartDataEntry(x: Double(i) , y:     self.Present[i])
        dataEntries.append(dataEntry)

let dataEntry1 = BarChartDataEntry(x: Double(i) , y: self.self.Absent[i])
        dataEntries1.append(dataEntry1)

        //stack barchart
        //let dataEntry = BarChartDataEntry(x: Double(i), yValues:  [self.unitsSold[i],self.unitsBought[i]], label: "groupChart")
    }

    let chartDataSet = BarChartDataSet(values: dataEntries, label: "Working Days")
    let chartDataSet1 = BarChartDataSet(values: dataEntries1, label: "Present Days")

    let dataSets: [BarChartDataSet] = [chartDataSet,chartDataSet1]
    chartDataSet.colors = [UIColor(red: 0/255, green: 255/255, blue: 25/255, alpha: 1)]
    chartDataSet1.colors = [UIColor(red: 255/255, green: 0/255, blue: 61/255, alpha: 1)]
    //chartDataSet.colors = ChartColorTemplates.colorful()
    //let chartData = BarChartData(dataSet: chartDataSet)

    let chartData = BarChartData(dataSets: dataSets)


    let groupSpace = 0.3
    let barSpace = 0.05
    let barWidth = 0.3
    // (0.3 + 0.05) * 2 + 0.3 = 1.00 -> interval per "group"

    let groupCount = self.attendencelabels.count
    let startYear = 0


    chartData.barWidth = barWidth;
    barview.xAxis.axisMinimum = Double(startYear)
    let gg = chartData.groupWidth(groupSpace: groupSpace, barSpace: barSpace)
    print("Groupspace: \(gg)")
    barview.xAxis.axisMaximum = Double(startYear) + gg * Double(groupCount)

    chartData.groupBars(fromX: Double(startYear), groupSpace: groupSpace, barSpace: barSpace)
    //chartData.groupWidth(groupSpace: groupSpace, barSpace: barSpace)
    barview.notifyDataSetChanged()

    barview.data = chartData
    //background color
    barview.backgroundColor = UIColor.white

    //chart animation
    barview.animate(xAxisDuration: 1.5, yAxisDuration: 1.5, easingOption: .linear)

}
func setHorizontalChart(dataPoints: [String], values: [Double]) {
    horizontalview.noDataText = "You need to provide data for the chart."

    let formato: horizontalbarformatter = horizontalbarformatter()
    let xaxiss: XAxis = XAxis()
    var dataEntriesss: [BarChartDataEntry] = []
    for i in 0..<dataPoints.count {
        let dataEntryy = BarChartDataEntry(x: Double(Int(i)), y: values[i])
        dataEntriesss.append(dataEntryy)
        formato.stringForValue(Double(i), axis: xaxiss)
    }
    xaxiss.valueFormatter = formato

    let chartHorizontalDataSet = BarChartDataSet(values: dataEntriesss, label: "Marks")
    let horizontalchartData = BarChartData(dataSet: chartHorizontalDataSet)
    chartHorizontalDataSet.colors = ChartColorTemplates.colorful()

    horizontalview.xAxis.valueFormatter = xaxiss.valueFormatter
    horizontalview.data = horizontalchartData
    horizontalview.backgroundColor = UIColor.white
    horizontalview.descriptionText = ""
    horizontalview.xAxis.labelPosition = .bottom
    horizontalview.leftAxis.axisMinimum = 0
    horizontalview.leftAxis.axisMaximum = maxUnits + 1

    //barChartView.animate(xAxisDuration: 2.0, yAxisDuration: 2.0)
    horizontalview.animate(xAxisDuration: 2.0, yAxisDuration: 2.0, easingOption: .easeInBounce)

    let ll = ChartLimitLine(limit: 10.0, label: "Target")
    horizontalview.rightAxis.addLimitLine(ll)
}

func chartValueSelected(chartView: ChartViewBase, entry: ChartDataEntry, highlight: Highlight) {
    print("\(entry.y) in \(attendencelabels[Int(entry.x)])")
  }

 }

Upvotes: 0

Ulrich Hkns
Ulrich Hkns

Reputation: 101

I am struggling with Version 3.0 and Swift 3 and the lack of documentation... May I point you to the best text on the subject which can be found here

Xvals as Parameters are gone, instead you use two-dimensional data on axis

Regarding your problem with timevalues.. you could use the "timeIntervalSince1970" of the date-object and format things with an extension

return dateFormatter.string(from: Date(timeIntervalSince1970: value))

all of which is to be found at the link mentioned above

Upvotes: 1

Prakash Donga
Prakash Donga

Reputation: 558

There is a bug in ios-charts try to use index of timestamp rather than using timestamp or date to show on the x-axis.

// i is the index of that timestamp in data.    
let dataEntry = BarChartDataEntry(x: i, y: Double(readings[i]))

Upvotes: 1

Related Questions