I’ve come across this problem many times, but I can’t find any mentions of it anywhere on here or the Plots repo. Consider:
julia> using Plots
julia> histogram(rand(Date(2000, 1, 1):Day(1):Date(2001, 1, 1), 100))
Here, Plots uses
Dates.value(date) on the x-axis, which means one has to be pretty good at mental arithmetic to interpret what the graph actually shows. I’ve tried using
xformatter = x -> string(Date(0) + Day(x)) but to no avail (yes, I’ve also forgotten which function gives a
Date from the
Dates.value of a date, something I asked Jacob a long time ago on Slack…)
Are there issues related to this that I’ve missed? And does anybody have an idea for a workaround?
Relatedly, I just realized that
histogram entirely ignores
julia> histogram(rand(1_000:2_000, 100), yformatter = x -> x/1_000)
julia> plot(rand(1_000:2_000, 100), yformatter = x -> x/1_000)
This seems to work (no bells and whistles):
using Dates, Plots; gr()
d1, d2 = Date(2000, 1, 1), Date(2001, 1, 1)
d = rand(d1:Day(1):d2, 100)
de = Dates.date2epochdays.(d)
xb = range(Dates.date2epochdays(d1), stop = Dates.date2epochdays(d2), length=5)
xd = Dates.epochdays2date.(round.(Int,xb))
histogram(de, bins = xb, xticks=false, label="Dates histogram")
Thanks, although it is of course severly limiting if one has to specify bins manually…
If one knows the exact algorithm used by
histogram(), one could set the manual value in workaround above equal to the automatic value.
This could be obtained from a command like:
nbins = length(fit(Histogram,de).edges) - 1
Actually I’ve found an easier workaround: while
histogram ignores formatters, they can be added to an existing histogram if it is plotted again. So:
plot(histogram(rand(Date(2000, 1, 1):Day(1):Date(2001, 1, 1), 100)),
xformatter = x -> Dates.epochdays2date(x+365))
(Thanks for reminding me of the epochdays2date function!)
@nilshg, could you please verify the plot posted as the dates displayed run back to 1998 while the input data are from 2000 onward.
Indeed - it looks as though
Dates.value is offset by one year from the
julia> Dates.value(Date(2000, 1, 1))
so above one needs
Dates.epochdays2date(x+365) to get the right answer
I’m pretty sure I ran into this offset by 1 year issue quite a while ago. I ended up defining a conversion function that adjusted by the 1 year at the time.
That code has long since gone by the wayside.