Я думаю, что с iOS -Charts у нас нет стандартных методов отображения предельных линий с заливкой. Но мы можем реализовать их вручную.
Я использовал две основные идеи.
- Мы можем нарисовать заполненную линейную диаграмму.
- Мы можем объединить гистограммы и линейные диаграммы, используя
CombinedChartView
.
Поэтому вам необходимо заменить BarChartView
на CombinedChartView
, добавить заполненную линейную диаграмму и использовать пользовательский fillFormatter
для отображения заполненной области над линией диаграммы.
См. Код пример:
class ViewController: UIViewController {
// Use CombinedChartView instead BarChartView
@IBOutlet weak var chartView: CombinedChartView!
override func viewDidLoad() {
super.viewDidLoad()
// Set draw order - draw filled area behind bars
chartView.drawOrder = [
DrawOrder.line.rawValue,
DrawOrder.bar.rawValue
]
let data = CombinedChartData()
// Just your data
let dataEntries: [ChartDataEntry] = [
BarChartDataEntry (x: 10, y: 20),
BarChartDataEntry (x: 15, y: 40)
]
let barDataSet = BarChartDataSet(entries: dataEntries)
barDataSet.setColor(UIColor.blue)
data.barData = BarChartData(dataSet: barDataSet)
// Data for filled area
let filledAreaDataSet = createFillingAreaDataSet(xMinValue: 8, xMaxValue: 17, yValue: 32)
data.lineData = LineChartData(dataSet: filledAreaDataSet)
chartView.data = data
}
// Create data set for filled area
private func createFillingAreaDataSet(xMinValue: Double, xMaxValue: Double, yValue: Double) -> LineChartDataSet {
let dataEntries: [ChartDataEntry] = [
ChartDataEntry(x: xMinValue, y: yValue),
ChartDataEntry(x: xMaxValue, y: yValue)
]
let chartDataSet = LineChartDataSet(entries: dataEntries, label: nil)
// hide chart line and values
chartDataSet.lineWidth = 0
chartDataSet.drawValuesEnabled = false
chartDataSet.drawCirclesEnabled = false
// customize filled area
chartDataSet.drawFilledEnabled = true
chartDataSet.fillAlpha = 1
chartDataSet.fill = Fill(CGColor: UIColor.green.cgColor)
// use custom fillFormatter for draw filled area from the top of the chart to yValue
chartDataSet.fillFormatter = CustomFillFormatter()
return chartDataSet
}
}
// Define custom fill formatter for drawing filled area from the top of the chart to yValue
class CustomFillFormatter: NSObject, IFillFormatter {
func getFillLinePosition(dataSet: ILineChartDataSet, dataProvider: LineChartDataProvider) -> CGFloat {
return CGFloat( dataProvider.chartYMax )
}
}
И результат:
![Chart example](https://i.stack.imgur.com/Ssj1f.png)