[racket] plot w/ log scale
On 11/08/2012 04:29 PM, David Van Horn wrote:
> On 11/8/12 5:48 PM, Vincent St-Amour wrote:
>> You can use axis transforms, but you may need to bound them.
>>
>> #lang racket
>> (require plot)
>> (parameterize ([plot-y-transform (axis-transform-bound log-transform 1
>> 2000)])
>> (plot (discrete-histogram '(#(a 10) #(b 100) #(c 1000)))))
>
> Thanks!
>
> Maybe someone can explain why this doesn't work?
>
> #lang racket
> (require plot)
> (parameterize
> ([plot-y-transform (axis-transform-bound log-transform 1 2000)]
> [plot-y-ticks (log-ticks)])
> (plot (discrete-histogram '(#(a 10) #(b 100) #(c 1000)))))
>
>
> log-ticks-layout: expects type <positive real> as 1st argument, given:
> 0; other arguments were: 1000
It's trying to lay out and format ticks on the entire visible axis,
regardless of the axis's transform. (Ticks and transforms are entirely
independent.) By default, histogram boxes draw from 0 to their given
height. In your example, the layout-er tries to lay out ticks from 0 to
1000 and fails.
This will do what you want (notice the #:y-min argument):
(parameterize ([plot-y-transform log-transform]
[plot-y-ticks (log-ticks)])
(plot (discrete-histogram '(#(a 10) #(b 100) #(c 1000))
#:y-min 1)))
The thing that's bugging me now is that this doesn't work:
(parameterize ([plot-y-transform log-transform]
[plot-y-ticks (log-ticks)])
(plot (discrete-histogram (list (vector 'a (ivl 1 10))
(vector 'b (ivl 1 100))
(vector 'c (ivl 1 1000))))))
"Histograms always draw from 0" is justifiable, but I wish I remembered
making that design decision. :D
Neil ⊥