Matthew Spencer
Matthew Spencer

Reputation: 2295

Swift - How to set x-Axis to show hourly intervals using iOS Charts

I have the following data:

2019-08-14T13:00:00.000Z, 0.0015378000
2019-08-14T12:30:00.000Z, 0.0015172000
2019-08-14T12:00:00.000Z, 0.0014922000
2019-08-14T11:30:00.000Z, 0.0014706000
2019-08-14T11:00:00.000Z, 0.0014229000
2019-08-14T10:30:00.000Z, 0.0000989000
2019-08-14T10:00:00.000Z, 0.0000736000
2019-08-14T09:30:00.000Z, 0.0000508000
2019-08-14T09:00:00.000Z, 0.0000214000
2019-08-13T17:30:00.000Z, 0.0012805000

And have plotted this data into a Line Chart using the Charts library as shown below:

Graph

The data appears correct in the graph, however I've noticed that the x Axis is showing a scale that is not hourly, which I would ideally like to show.

The following code was applied to generate the above graph in an attempt to set an hourly scale on the x-Axis:

xAxis.drawAxisLineEnabled = true
xAxis.drawGridLinesEnabled = true
xAxis.granularityEnabled = true
xAxis.granularity = 1.0 / 24.0

When applying a granularity of 1.0 / 2.4 however, I was able to show a 10 hour interval on the graph as shown below:

10 Hour Interval graph

It seems that the granularity does not line up to the hourly rate for the given graph, which may be associated with the fact that it contains a minimum interval between axis-values (In my case the maximum duration can be up to 2 days).

Is there a way to lock/snap the x-Axis grid to an hourly scale?

Upvotes: 0

Views: 2773

Answers (1)

Matthew Spencer
Matthew Spencer

Reputation: 2295

While I believe this is a workaround, I was able to snap the grid to an hourly basis for up to 5 x-axis labels using the following code (where diff is the date range in days presented on the graph:

// Determine a reasonable scale that complies to an hourly grid (Assume no more than 5 labels on grid)
let hourRange = diff * 24.0
let interval = Int(hourRange.rounded(FloatingPointRoundingRule.up)) / 5
if (interval <= 0)
{
    xAxis.granularity = 1.0 / 24.0
} else {
    xAxis.granularity = 1.0 / 24.0 * Double(interval)
}

Graph Image

Upvotes: 1

Related Questions