Skip to content

Commit

Permalink
[6fa4b7c] combined chart highlighter will return the dataSetIndex of …
Browse files Browse the repository at this point in the history
…the whole data, not each sub data's index

add one more bar data set in demo view controller (+4 squashed commits)
Squashed commits:
[44ce60e] rename some BarChartDataProvider protocol methods not the same as ChartDataProvider
[1bd8c22] Fix issue ChartsOrg#329 check _deltaX when only lineData exists
[90a327d] 1. fix bug in getDataSetIndex, it will detect what dataSet it is and determine how to proceed
2. I also override getMarkerPosition for CombinedChartView
[80aa1b3] add support for grouped bars in CombinedChartView.
add a new demo view controller called GroupedCombinedChartViewController, to illustrate multiple bars + multiple line
  • Loading branch information
liuxuan30 committed Feb 26, 2016
1 parent 796b2f8 commit 8752575
Show file tree
Hide file tree
Showing 11 changed files with 962 additions and 24 deletions.
15 changes: 15 additions & 0 deletions Charts/Classes/Charts/BarChartView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,21 @@ public class BarChartView: BarLineChartViewBase, BarChartDataProvider

// MARK: - BarChartDataProbider

public func getBarChartTransformer(which: ChartYAxis.AxisDependency) -> ChartTransformer
{
return super.getTransformer(which)
}

public var barChartXMax: Double
{
return _chartXMax
}

public var barChartXMin: Double
{
return _chartXMin
}

public var barData: BarChartData? { return _data as? BarChartData }

/// - returns: true if drawing the highlighting arrow is enabled, false if not
Expand Down
118 changes: 118 additions & 0 deletions Charts/Classes/Charts/CombinedChartView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,16 @@ public class CombinedChartView: BarLineChartViewBase, LineChartDataProvider, Bar
/// the fill-formatter used for determining the position of the fill-line
internal var _fillFormatter: ChartFillFormatter!

internal var _barChartXMax = Double(0.0)
internal var _barChartXMin = Double(0.0)
internal var _barChartDeltaX = CGFloat(0.0)

internal var _barChartLeftYAxisRenderer: ChartYAxisRenderer!
internal var _barChartRightYAxisRenderer: ChartYAxisRenderer!

internal var _barChartLeftAxisTransformer: ChartTransformer!
internal var _barChartRightAxisTransformer: ChartTransformer!

/// enum that allows to specify the order in which the different data objects for the combined-chart are drawn
@objc
public enum CombinedChartDrawOrder: Int
Expand All @@ -41,6 +51,12 @@ public class CombinedChartView: BarLineChartViewBase, LineChartDataProvider, Bar
let workaroundFormatter = ChartDefaultFillFormatter()
_fillFormatter = workaroundFormatter

_barChartLeftAxisTransformer = ChartTransformer(viewPortHandler: _viewPortHandler)
_barChartRightAxisTransformer = ChartTransformer(viewPortHandler: _viewPortHandler)

_barChartLeftYAxisRenderer = ChartYAxisRenderer(viewPortHandler: _viewPortHandler, yAxis: _leftAxis, transformer: _leftAxisTransformer)
_barChartRightYAxisRenderer = ChartYAxisRenderer(viewPortHandler: _viewPortHandler, yAxis: _rightAxis, transformer: _rightAxisTransformer)

renderer = CombinedChartRenderer(chart: self, animator: _animator, viewPortHandler: _viewPortHandler)
}

Expand Down Expand Up @@ -71,6 +87,26 @@ public class CombinedChartView: BarLineChartViewBase, LineChartDataProvider, Bar
}
}
}

if (self.barData !== nil)
{
let barData = self.barData

_barChartXMin = _chartXMin
_barChartXMax = _chartXMax
_barChartDeltaX = _deltaX
// increase deltax by 1 because the bars have a width of 1
_barChartDeltaX += 0.5

// extend xDelta to make space for multiple datasets (if ther are one)
_barChartDeltaX *= CGFloat(barData!.dataSetCount)

let maxEntry = _data.xValCount

let groupSpace = barData!.groupSpace
_barChartDeltaX += CGFloat(maxEntry) * groupSpace
_barChartXMax = Double(_barChartDeltaX) - _barChartXMin
}
}

_deltaX = CGFloat(abs(_chartXMax - _chartXMin))
Expand All @@ -81,6 +117,78 @@ public class CombinedChartView: BarLineChartViewBase, LineChartDataProvider, Bar
}
}

internal override func prepareValuePxMatrix()
{
super.prepareValuePxMatrix()

_barChartRightAxisTransformer.prepareMatrixValuePx(chartXMin: _barChartXMin, deltaX: _barChartDeltaX, deltaY: CGFloat(_rightAxis.axisRange), chartYMin: _rightAxis.axisMinimum)
_barChartLeftAxisTransformer.prepareMatrixValuePx(chartXMin: _barChartXMin, deltaX: _barChartDeltaX, deltaY: CGFloat(_leftAxis.axisRange), chartYMin: _leftAxis.axisMinimum)
}

internal override func prepareOffsetMatrix()
{
super.prepareOffsetMatrix()

_barChartRightAxisTransformer.prepareMatrixOffset(_rightAxis.isInverted)
_barChartLeftAxisTransformer.prepareMatrixOffset(_leftAxis.isInverted)
}

/// Returns the Transformer class that contains all matrices and is
/// responsible for transforming values into pixels on the screen and
/// backwards.
public func getBarChartTransformer(which: ChartYAxis.AxisDependency) -> ChartTransformer
{
if (which == .Left)
{
return _barChartLeftAxisTransformer
}
else
{
return _barChartRightAxisTransformer
}
}

public override func getMarkerPosition(entry e: ChartDataEntry, highlight: ChartHighlight) -> CGPoint
{
let dataSetIndex = highlight.dataSetIndex
let dataSet = _data.getDataSetByIndex(dataSetIndex)
var xPos = CGFloat(e.xIndex)
var yPos = e.value

if (dataSet!.dynamicType === BarChartDataSet.self)
{
let bd = (_data as! CombinedChartData).barData
let space = bd.groupSpace

let barDataSetIndex = bd.indexOfDataSet(dataSet)

let x = CGFloat(e.xIndex * (bd.dataSetCount - 1) + barDataSetIndex) + space * CGFloat(e.xIndex) + space / 2.0

xPos += x

if let barEntry = e as? BarChartDataEntry
{
if barEntry.values != nil && highlight.range !== nil
{
yPos = highlight.range!.to
}
}
}

var pt = CGPoint(x: xPos, y: CGFloat(yPos) * _animator.phaseY)

if (dataSet!.dynamicType === BarChartDataSet.self)
{
getBarChartTransformer(_data.getDataSetByIndex(dataSetIndex)!.axisDependency).pointValueToPixel(&pt)
}
else
{
getTransformer(_data.getDataSetByIndex(dataSetIndex)!.axisDependency).pointValueToPixel(&pt)
}

return pt
}

public override var data: ChartData?
{
get
Expand Down Expand Up @@ -138,6 +246,16 @@ public class CombinedChartView: BarLineChartViewBase, LineChartDataProvider, Bar
}
}

public var barChartXMax: Double
{
return _barChartXMax
}

public var barChartXMin: Double
{
return _barChartXMin
}

// MARK: - ScatterChartDataProvider

public var scatterData: ScatterChartData?
Expand Down
Loading

0 comments on commit 8752575

Please sign in to comment.