PieChart using Charts on swift. Need to remove the values of the elements - swift

In the black circles data that i wont to hide. I wonna to get simple green and red chat w\o text in elements.
I checked all the methods of PieChartView and wont find method to hide this data. Sims it integrated to elements...
Inplementation code:
import Charts
class ViewController: UIViewController {
#IBOutlet weak var pieChart: PieChartView!
override func viewDidLoad() {
super.viewDidLoad()
// pieChart.chartAnimator
// pieChart.drawCenterTextEnabled = false
// pieChart.drawHoleEnabled = false
let months = ["", ""]
let unitsSold = [60.0, 40.0]
setChart(dataPoints: months, values: unitsSold)
}
func setChart(dataPoints: [String], values: [Double]) {
var dataEntries: [ChartDataEntry] = []
// let da = ChartDataEntry(
let dataEntry1 = ChartDataEntry(x: Double(0.0), y: 60.0)
let dataEntry2 = ChartDataEntry(x: Double(0.0), y: 40.0)
dataEntries.append(dataEntry1)
dataEntries.append(dataEntry2)
print(dataEntries[0].data as Any)
let pieChartDataSet = PieChartDataSet(entries: dataEntries, label: nil)
let pieChartData = PieChartData(dataSet: pieChartDataSet)
pieChart.data = pieChartData
let colors: [UIColor] = [UIColor(cgColor: UIColor.red.cgColor), UIColor(cgColor: UIColor.green.cgColor)]
pieChartDataSet.colors = colors
}

You need to set the text color as clear, it will work fine. Check out following change in your current code
let pieChartData = PieChartData(dataSet: pieChartDataSet)
pieChartData.setValueTextColor(NSUIColor.clear)
pieChart.data = pieChartData

Related

Problem with labels using library Charts with UIKit in XCode 12

Hell my friends.I'm developing an app which has to show several charts using UIKit and the library Charts. I've been requested to use both things.
I have two arrays with correct data Ciudades y Precios.
Ciudades is String type and Precios Double type. I'v been reading how to use Charts library for hours but it seems that I dont understand how to use it because the chart I get it's not the one I excpected to. I need a chart with the cities on x label but they are not showed as you can see in the picture.
This is my code
class BarChartViewController: UIViewController, ChartViewDelegate {
#IBOutlet weak var barChartView: BarChartView!
var nombres: [String]!
var precios: [Double]!
override func viewDidLoad() {
super.viewDidLoad()
barChartView.delegate = self
nombres = eventos.devolverNombre()
print(nombres)
precios = eventos.devolverPrecios()
setChart(dataPoints: nombres, values: precios)
}
func setChart(dataPoints: [String], values: [Double]) {
barChartView.noDataText = "Es necesario aƱadir datos."
var dataEntries: [BarChartDataEntry] = []
for i in 0..<dataPoints.count {
let dataEntry = BarChartDataEntry(x: Double(i), y: values[i])
if dataEntry != nil {
dataEntries.append(dataEntry)}
}
let chartDataSet = BarChartDataSet(entries: dataEntries, label: "PRECIOS POR EVENTO")
let chartData = BarChartData(dataSet: chartDataSet)
chartDataSet.colors = [UIColor(red: 230/255, green: 126/255, blue: 34/255, alpha: 1)]
chartDataSet.colors = ChartColorTemplates.colorful()
barChartView.data = chartData
barChartView.xAxis.valueFormatter = DefaultAxisValueFormatter(block: {(index, _) in
return self.nombres[Int(index)] })
let labelCount = nombres.count
print(labelCount)
barChartView.xAxis.setLabelCount(labelCount, force: true)
barChartView.xAxis.labelRotationAngle = 90
barChartView.xAxis.centerAxisLabelsEnabled = true
barChartView.xAxis.labelPosition = .bottom
barChartView.xAxis.labelFont = UIFont.systemFont(ofSize: 10)
barChartView.animate(xAxisDuration: 1.0, yAxisDuration: 1.0, easingOption: .easeInBounce)
}
}

Truncate value label of PieChart in Charts Library Swift

`class PieChartViewController: DemoBaseViewController {
#IBOutlet var chartView: PieChartView!
#IBOutlet var sliderX: UISlider!
#IBOutlet var sliderY: UISlider!
#IBOutlet var sliderTextX: UITextField!
#IBOutlet var sliderTextY: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
self.title = "Pie Chart"
self.setup(pieChartView: chartView)
chartView.delegate = self
chartView.holeRadiusPercent = 0.8
chartView.usePercentValuesEnabled = true
chartView.transparentCircleRadiusPercent = 0
chartView.drawHoleEnabled = true
chartView.transparentCircleColor = UIColor.white.withAlphaComponent(1)
chartView.drawCenterTextEnabled = true
chartView.centerText = nil
let l = chartView.legend
l.enabled = false
//MARK: Entry label Styling (Value Label Above PieChart)
chartView.entryLabelColor = .black
chartView.entryLabelFont = .systemFont(ofSize: 14, weight: .medium)
//MARK: Setting Offset
let frameOffset = chartView.frame.width * 0.12
chartView.setExtraOffsets(left: frameOffset, top: frameOffset, right: frameOffset, bottom: frameOffset)
self.slidersValueChanged(nil)
}
override func updateChartData() {
if self.shouldHideData {
chartView.data = nil
return
}
self.setDataCount()
}
func setDataCount() {
let entry1 = PieChartDataEntry(value: 22, label: "Apple.It is a fruit")
let entry2 = PieChartDataEntry(value: 33, label: "Zebra.It is an animal")
let entry3 = PieChartDataEntry(value: 31, label: "Eagle.It is a bird")
let entry4 = PieChartDataEntry(value: 14, label: "Asia.It is a continent")
var enteries: [PieChartDataEntry] = []
enteries.append(entry1)
enteries.append(entry2)
enteries.append(entry3)
enteries.append(entry4)
let set = PieChartDataSet(entries: enteries, label: "Knowledge")
set.drawIconsEnabled = false
set.sliceSpace = 0
set.selectionShift = 0
set.colors = ChartColorTemplates.vordiplom()
+ ChartColorTemplates.joyful()
+ ChartColorTemplates.colorful()
+ ChartColorTemplates.liberty()
+ ChartColorTemplates.pastel()
+ [UIColor(red: 51/255, green: 181/255, blue: 229/255, alpha: 1)]
// MARK: Setting Value Label
set.valueLinePart1OffsetPercentage = 0.20
set.valueLinePart1Length = 0.4
set.valueLinePart2Length = 0.4
set.valueLineColor = .black
set.valueTextColor = .black
set.xValuePosition = .outsideSlice
set.yValuePosition = .outsideSlice
let data = PieChartData(dataSet: set)
data.setValueFont(.systemFont(ofSize: 13, weight: .medium))
data.setValueTextColor(.black)
chartView.data = data
chartView.highlightValues(nil)
}
override func optionTapped(_ option: Option) {
chartView.setNeedsDisplay()
}
// MARK: - Actions
#IBAction func slidersValueChanged(_ sender: Any?) {
self.updateChartData()
}
}`
How to truncate or word wrap the value label in Pie Chart ?
I am using Charts Library in iOS.
If I add extra offset the pie chart shrink in smaller devices like iPhone 5s or iPhone SE.
If the text is large then the text goes out of the screen as you can see in the uploaded image. I am not able to find any properties (word wrap) to handle the large text issue.

How can I add names/title/values (months) to Y axis for my line chart?

I am trying to simple line chart. Chart is coming fine and I want to add values/names for every point of x and y axis.
See the following image, this is is comming , but I want to add/show values in x and y axis.
For example: Check in my example code, I mentioned months and unitSold values.
in X axis I wants to show months names and Y axis and I wants to show some unit sold values.
How can I do or show values in x and y axis?
import UIKit
import Charts
class ViewController: UIViewController {
var dataEntries: [ChartDataEntry] = []
// var chartDataBeanArray = [ChartDataBean]()
let months = ["Jan" , "Feb", "Mar", "Apr", "May", "June", "July", "August", "Sept", "Oct", "Nov", "Dec"]
let unitsSold = [24.0,43.0,56.0,23.0,56.0,68.0,48.0,120.0,41.0,34.0,55.9,12.0,34.0]
#IBOutlet weak var chartViewOutlet: LineChartView!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
setChart(months, values: unitsSold)
}
func setChart(_ dataPoints: [String], values: [Double]) {
print(values)
print(dataPoints)
chartViewOutlet.noDataText = "No data available!"
for i in 0..<values.count {
print("chart point : \(values[i])")
let dataEntry = ChartDataEntry(x: Double(i), y: values[i])
dataEntries.append(dataEntry)
}
let line1 = LineChartDataSet(entries: dataEntries, label: "Units Consumed")
line1.colors = [NSUIColor.blue]
line1.mode = .cubicBezier
line1.cubicIntensity = 0.2
let gradient = getGradientFilling()
line1.fill = Fill.fillWithLinearGradient(gradient, angle: 90.0)
line1.drawFilledEnabled = true
let data = LineChartData()
data.addDataSet(line1)
chartViewOutlet.data = data
chartViewOutlet.setScaleEnabled(false)
chartViewOutlet.animate(xAxisDuration: 1.5)
chartViewOutlet.drawGridBackgroundEnabled = false
chartViewOutlet.xAxis.drawAxisLineEnabled = false
chartViewOutlet.xAxis.drawGridLinesEnabled = false
chartViewOutlet.leftAxis.drawAxisLineEnabled = false
chartViewOutlet.leftAxis.drawGridLinesEnabled = false
chartViewOutlet.rightAxis.drawAxisLineEnabled = false
chartViewOutlet.rightAxis.drawGridLinesEnabled = false
chartViewOutlet.legend.enabled = false
chartViewOutlet.xAxis.enabled = false
chartViewOutlet.leftAxis.enabled = false
chartViewOutlet.rightAxis.enabled = false
chartViewOutlet.xAxis.drawLabelsEnabled = false
}
/// Creating gradient for filling space under the line chart
private func getGradientFilling() -> CGGradient {
// Setting fill gradient color
let coloTop = UIColor(red: 141/255, green: 133/255, blue: 220/255, alpha: 1).cgColor
let colorBottom = UIColor(red: 230/255, green: 155/255, blue: 210/255, alpha: 1).cgColor
// Colors of the gradient
let gradientColors = [coloTop, colorBottom] as CFArray
// Positioning of the gradient
let colorLocations: [CGFloat] = [0.7, 0.0]
// Gradient Object
return CGGradient.init(colorsSpace: CGColorSpaceCreateDeviceRGB(), colors: gradientColors, locations: colorLocations)!
}
}
EDIT : After adding following code suggested by #marc
chartViewOutlet.xAxis.enabled = true
chartViewOutlet.leftAxis.enabled = true
this is now showing chart.
Now I wants to show months values in bottom (x axis)...how to show it?
You can find source code here if you want to check it: https://drive.google.com/file/d/1vkPqktZ3mX3q9f75-bihVYeublwc2dXE/view?usp=sharing
Add following code in your project.
func setChart(dataPoints: [String], values: [Double]) {
for i in 0 ..< dataPoints.count {
dataEntries.append(ChartDataEntry(x: Double(i), y: values[i]))
}
let lineChartDataSet = LineChartDataSet(entries: dataEntries, label: "Units Consumed")
lineChartDataSet.axisDependency = .left
lineChartDataSet.setColor(UIColor.black)
lineChartDataSet.setCircleColor(UIColor.black) // our circle will be dark red
lineChartDataSet.lineWidth = 1.0
lineChartDataSet.circleRadius = 3.0 // the radius of the node circle
lineChartDataSet.fillAlpha = 1
lineChartDataSet.fillColor = UIColor.black
lineChartDataSet.highlightColor = UIColor.white
lineChartDataSet.drawCircleHoleEnabled = true
var dataSets = [LineChartDataSet]()
dataSets.append(lineChartDataSet)
let lineChartData = LineChartData(dataSets: dataSets)
chartViewOutlet.data = lineChartData
chartViewOutlet.rightAxis.enabled = false
chartViewOutlet.xAxis.drawGridLinesEnabled = false
chartViewOutlet.xAxis.labelPosition = .bottom
chartViewOutlet.xAxis.valueFormatter = IndexAxisValueFormatter(values: dataPoints)
chartViewOutlet.legend.enabled = true
}
Output:
This works 100%. Try it.

Line chart fill color is faded

I am trying to setup a line chart with one fill colour but for some reason, the fill colour is faded.
Example
Both the random view I have added to middle of screen and the fill colour of the line chart are set to be red, but for some reason the fill colour of the chart is faded.
Can see code here
#IBOutlet var liveChart : LineChartView!
override func viewDidLoad() {
super.viewDidLoad()
self.title = "Chart Tests"
configureChart(chart: liveChart)
var xAxis = [String]()
var yAxis = [Double]()
for _ in 0..<10
{
xAxis.append("")
let yVal = Double(randomBetweenNumbers(firstNum: 1.0, secondNum: 100.0))
yAxis.append(yVal)
}
setData(xAxisArray: xAxis, yAxisArray: yAxis, chart: liveChart)
let testView = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
testView.center = view.center
testView.backgroundColor = UIColor.red
view.addSubview(testView)
}
func randomBetweenNumbers(firstNum: CGFloat, secondNum: CGFloat) -> CGFloat{
return CGFloat(arc4random()) / CGFloat(UINT32_MAX) * abs(firstNum - secondNum) + min(firstNum, secondNum)
}
func configureChart(chart : LineChartView)
{
chart.chartDescription?.text = ""
chart.noDataText = "Loading Data"
chart.backgroundColor = UIColor.clear
chart.drawGridBackgroundEnabled = false
chart.dragEnabled = true
chart.rightAxis.enabled = false
chart.leftAxis.enabled = true
chart.doubleTapToZoomEnabled = false
chart.legend.enabled = false
chart.pinchZoomEnabled = true
chart.highlightPerTapEnabled = false
chart.highlightPerDragEnabled = false
chart.xAxis.enabled = false
chart.leftAxis.drawAxisLineEnabled = false
chart.leftAxis.drawGridLinesEnabled = false
chart.leftAxis.labelCount = 5
chart.leftAxis.forceLabelsEnabled = true
}
func setData(xAxisArray : [String], yAxisArray : [Double], chart : LineChartView)
{
var yVals1 : [ChartDataEntry] = [ChartDataEntry]()
if(xAxisArray.count > 0)
{
for i in 0 ..< xAxisArray.count
{
let chartEntry = ChartDataEntry(x: Double(i), y: yAxisArray[i], data: nil)
yVals1.append(chartEntry)
}
}
let set1: LineChartDataSet = LineChartDataSet(values: yVals1, label: "")
set1.fillColor = UIColor.red
set1.drawFilledEnabled = true
set1.drawCirclesEnabled = false
let data = LineChartData()
data.addDataSet(set1)
liveChart.data = data
}
Is there a way to fix this? Or is this just the way the fill colour of the chart works?
Edit:
I am using
https://github.com/danielgindi/Charts
I assume you use this library: https://github.com/kevinbrewster/SwiftCharts
So the LineChartView automatically set alpha for the fill color: https://github.com/kevinbrewster/SwiftCharts/blob/master/SwiftCharts/LineChart.swift#L758
try to set fillAlpha property of the data set

Rendering CombinedChartView using Swift Charts

I am using https://github.com/danielgindi/Charts and able to successfully render LineChartView. However, trying to render a very simple CombinedChartView renders as a blank chart. Also, any touch event will output "CGAffineTransformInvert: singular matrix."
#IBOutlet weak var chartView: CombinedChartView!
var lineData = [ChartDataEntry]()
lineData.append(ChartDataEntry(x: Double(0), y: drand48()))
let lineDataSet = LineChartDataSet(values: lineData, label: "line")
var barData = [BarChartDataEntry]()
barData.append(BarChartDataEntry(x: Double(0), y: drand48()))
let barDataSet = BarChartDataSet(values: barData, label: "bar")
let combinedData = CombinedChartData(dataSets: [lineDataSet, barDataSet])
chartView.data = combinedData
charView.notifyDataSetChanged()
Am I totally missing something here?
Thank you.
I totally forgot about the demo that comes along with Charts. Basically, we need to set the data sets for each type of graph; then assign the data sets to the CombinedChartData.
#IBOutlet weak var chartView: CombinedChartView!
var lineData = [ChartDataEntry]()
lineData.append(ChartDataEntry(x: Double(0), y: drand48()))
let lineDataSet = LineChartDataSet(values: lineData, label: "line")
let lineChartData = LineChartData(dataSets: [lineDataSet])
var barData = [BarChartDataEntry]()
barData.append(BarChartDataEntry(x: Double(0), y: drand48()))
let barDataSet = BarChartDataSet(values: barData, label: "bar")
let barChartData = BarChartData(dataSets: [barDataSet])
let combinedData = CombinedChartData()
combinedData.lineData = lineChartData
combinedData.barData = barChartData
chartView.data = combinedData
charView.notifyDataSetChanged()