ChartsOrg / ChartsOrg/Charts

How to align labels bottom of the dots

Open
#5,120 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
Swift
Stars
28k
Forks
6k
PR merge metrics
No merged PRs in 30d

Description

`let chart = LineChartView()
chart.border(color: .init(named: "Grey3"), width: 1, radius: 8)
chart.isUserInteractionEnabled = false
chart.legend.enabled = false

// others
let desc = Description()
desc.enabled = false
desc.text = " "
chart.chartDescription = desc
chart.rightAxis.enabled = false

// entries
var entries: [ChartDataEntry] = []
var colors: [NSUIColor] = []
var dats: [String] = []

// data set
let set = LineChartDataSet(entries: entries)
set.drawIconsEnabled = false
set.drawCircleHoleEnabled = false
set.colors = colors
set.circleColors = colors
set.mode = .horizontalBezier
let data = LineChartData(dataSet: set)
chart.data = data

// setup y
let dFormatter = DayAxisValueFormatter()
dFormatter.months = dats
chart.xAxis.valueFormatter = dFormatter
chart.xAxis.labelPosition = .bottom
chart.xAxis.labelCount = dats.count
chart.xAxis.granularity = 1
chart.xAxis.centerAxisLabelsEnabled = true

chart.xAxis.yOffset = 5
chart.xAxis.spaceMin = 5
chart.xAxis.spaceMax = 5
chart.setExtraOffsets(left: 10, top: 5, right: 10, bottom: 5)
chart.minOffset = 20`


My value formatter;
`public class DayAxisValueFormatter: AxisValueFormatter {
weak var chart: BarLineChartViewBase?
var months = ["Jan", "Feb", "Mar",
"Apr", "May", "Jun",
"Jul", "Aug", "Sep",
"Oct", "Nov", "Dec"]


public func stringForValue(_ value: Double, axis: AxisBase?) -> String {
print("string for value data: ", value)
let days = Int(value)
let year = determineYear(forDays: days)
let month = determineMonth(forDayOfYear: days)

let monthName = months[month % months.count]
let yearName = "\(year)"

if let chart = chart,
chart.visibleXRange > 30 * 6 {
return monthName + yearName
} else {
let dayOfMonth = determineDayOfMonth(forDays: days, month: month + 12 * (year - 2016))
var appendix: String

switch dayOfMonth {
case 1, 21, 31: appendix = "st"
case 2, 22: appendix = "nd"
case 3, 23: appendix = "rd"
default: appendix = "th"
}

return dayOfMonth == 0 ? "" : monthName
}
}


private func days(forMonth month: Int, year: Int) -> Int {
// month is 0-based
switch month {
case 1:
var is29Feb = false
if year < 1582 {
is29Feb = (year < 1 ? year + 1 : year) % 4 == 0
} else if year > 1582 {
is29Feb = year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)
}

return is29Feb ? 29 : 28

case 3, 5, 8, 10:
return 30

default:
return 31
}
}

private func determineMonth(forDayOfYear dayOfYear: Int) -> Int {
var month = -1
var days = 0

while days < dayOfYear {
month += 1
if month >= 12 {
month = 0
}

let year = determineYear(forDays: days)
days += self.days(forMonth: month, year: year)
}

return max(month, 0)
}

private func determineDayOfMonth(forDays days: Int, month: Int) -> Int {
var count = 0
var daysForMonth = 0

while count < month {
let year = determineYear(forDays: days)
daysForMonth += self.days(forMonth: count % 12, year: year)
count += 1
}

return days - daysForMonth
}

private func determineYear(forDays days: Int) -> Int {
switch days {
case ...366: return 2016
case 367...730: return 2017
case 731...1094: return 2018
case 1095...1458: return 2019
default: return 2020
}
}
}`

Contributor guide

Open the contributing guide

Research direction

Start with the chart.xAxis configuration, especially labelPosition, yOffset, spaceMin, spaceMax, and the formatter's stringForValue method. Reproduce the label placement with the provided LineChartView setup and determine the expected alignment relative to the plotted dots. Done means the labels consistently appear at the requested bottom alignment.

Written by the indexing model from the issue text.

Assessment

Tech stack
swift
Domain
data-visualization, mobile-dev
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
25/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.