Added plot-x-tick-label-angle, plot-x-tick-label-anchor, and similar for y and far axes

This commit is contained in:
Neil Toronto 2012-04-30 16:12:12 -06:00
parent 3862faee64
commit be49a59e4d
6 changed files with 114 additions and 26 deletions

View File

@ -40,6 +40,16 @@
(defparam plot-y-far-axis? boolean? #t)
(defparam plot-z-far-axis? boolean? #t)
(defparam plot-x-tick-label-angle angle real? 0)
(defparam plot-y-tick-label-angle angle real? 0)
(defparam plot-x-far-tick-label-angle angle real? 0)
(defparam plot-y-far-tick-label-angle angle real? 0)
(defparam plot-x-tick-label-anchor anchor anchor/c 'top)
(defparam plot-y-tick-label-anchor anchor anchor/c 'right)
(defparam plot-x-far-tick-label-anchor anchor anchor/c 'bottom)
(defparam plot-y-far-tick-label-anchor anchor anchor/c 'left)
(defparam plot-decorations? boolean? #t)
(define-parameter-group plot-axes?
@ -48,6 +58,16 @@
plot-z-axis? plot-z-far-axis?)
#:struct list)
(define-parameter-group plot-tick-labels
(plot-x-tick-label-anchor
plot-x-tick-label-angle
plot-x-far-tick-label-anchor
plot-x-far-tick-label-angle
plot-y-tick-label-anchor
plot-y-tick-label-angle
plot-y-far-tick-label-anchor
plot-y-far-tick-label-angle))
(define-parameter-group plot-appearance
(plot-width
plot-height
@ -56,7 +76,8 @@
plot-line-width plot-tick-size
plot-font-size plot-font-family
plot-legend-anchor plot-legend-box-alpha
plot-axes? plot-decorations?
plot-axes? plot-tick-labels
plot-decorations?
plot-animating?))
(defproc (pen-gap) real? #:document-body

View File

@ -9,6 +9,14 @@
;; General plot parameters
plot-x-axis? plot-y-axis? plot-z-axis?
plot-x-far-axis? plot-y-far-axis? plot-z-far-axis?
plot-x-tick-label-anchor
plot-y-tick-label-anchor
plot-x-far-tick-label-anchor
plot-y-far-tick-label-anchor
plot-x-tick-label-angle
plot-y-tick-label-angle
plot-x-far-tick-label-angle
plot-y-far-tick-label-angle
plot-width plot-height
plot-foreground plot-foreground-alpha
plot-background plot-background-alpha
@ -71,6 +79,7 @@
;; Parameter groups
plot-parameters
plot-axes?
plot-tick-labels
plot-appearance
plot3d-appearance
plot-output

View File

@ -228,29 +228,37 @@
(define x-far-tick-label-offset (vneg x-tick-label-offset))
(define y-far-tick-label-offset (vneg y-tick-label-offset))
(define (get-tick-label-params ticks tick-label-offset tick-value->dc anchor)
(define (get-tick-label-params ticks tick-label-offset tick-value->dc anchor angle)
(for/list ([t (in-list ticks)] #:when (pre-tick-major? t))
(match-define (tick p _ label) t)
(list label (v+ (tick-value->dc p) tick-label-offset) anchor)))
(list label (v+ (tick-value->dc p) tick-label-offset) anchor (degrees->radians angle))))
(define (get-x-tick-label-params)
(if (plot-x-axis?)
(get-tick-label-params x-ticks x-tick-label-offset x-tick-value->dc 'top)
(get-tick-label-params x-ticks x-tick-label-offset x-tick-value->dc
(plot-x-tick-label-anchor)
(plot-x-tick-label-angle))
empty))
(define (get-y-tick-label-params)
(if (plot-y-axis?)
(get-tick-label-params y-ticks y-tick-label-offset y-tick-value->dc 'right)
(get-tick-label-params y-ticks y-tick-label-offset y-tick-value->dc
(plot-y-tick-label-anchor)
(plot-y-tick-label-angle))
empty))
(define (get-x-far-tick-label-params)
(if (and (plot-x-far-axis?) draw-x-far-tick-labels?)
(get-tick-label-params x-far-ticks x-far-tick-label-offset x-far-tick-value->dc 'bottom)
(get-tick-label-params x-far-ticks x-far-tick-label-offset x-far-tick-value->dc
(plot-x-far-tick-label-anchor)
(plot-x-far-tick-label-angle))
empty))
(define (get-y-far-tick-label-params)
(if (and (plot-y-far-axis?) draw-y-far-tick-labels?)
(get-tick-label-params y-far-ticks y-far-tick-label-offset y-far-tick-value->dc 'left)
(get-tick-label-params y-far-ticks y-far-tick-label-offset y-far-tick-value->dc
(plot-y-far-tick-label-anchor)
(plot-y-far-tick-label-angle))
empty))
;; -----------------------------------------------------------------------------------------------
@ -267,22 +275,35 @@
(define max-x-far-tick-offset (if (plot-x-far-axis?) (max-tick-offset x-far-ticks) 0))
(define max-y-far-tick-offset (if (plot-y-far-axis?) (max-tick-offset y-far-ticks) 0))
(define (max-tick-label-height ts)
(if (ormap pre-tick-major? ts) char-height 0))
(define (get-relative-corners params)
(append* (map (match-lambda
[(list label _ anchor angle)
(send pd get-text-corners label #(0 0) anchor angle)])
params)))
(define (max-tick-label-width ts)
(apply max 0 (for/list ([t (in-list ts)] #:when (pre-tick-major? t))
(send pd get-text-width (tick-label t)))))
(define max-x-tick-label-height
(if (plot-x-axis?)
(apply max 0 (map (λ (corner) (vector-ref corner 1))
(get-relative-corners (get-x-tick-label-params))))
0))
(define max-x-tick-label-height (if (plot-x-axis?) (max-tick-label-height x-ticks) 0))
(define max-y-tick-label-width (if (plot-y-axis?) (max-tick-label-width y-ticks) 0))
(define max-y-tick-label-width
(if (plot-y-axis?)
(- (apply min 0 (map (λ (corner) (vector-ref corner 0))
(get-relative-corners (get-y-tick-label-params)))))
0))
(define max-x-far-tick-label-height (if (and (plot-x-far-axis?) draw-x-far-tick-labels?)
(max-tick-label-height x-far-ticks)
0))
(define max-y-far-tick-label-width (if (and (plot-y-far-axis?) draw-y-far-tick-labels?)
(max-tick-label-width y-far-ticks)
0))
(define max-x-far-tick-label-height
(if (and (plot-x-far-axis?) draw-x-far-tick-labels?)
(- (apply min 0 (map (λ (corner) (vector-ref corner 1))
(get-relative-corners (get-x-far-tick-label-params)))))
0))
(define max-y-far-tick-label-width
(if (and (plot-y-far-axis?) draw-y-far-tick-labels?)
(apply max 0 (map (λ (corner) (vector-ref corner 0))
(get-relative-corners (get-y-far-tick-label-params))))
0))
(define (get-x-label-params)
(define offset (vector 0 (+ max-x-tick-offset max-x-tick-label-height half-char-height)))
@ -293,7 +314,8 @@
(list (plot-y-label) (v- (view->dc (vector x-min y-mid)) offset) 'bottom (/ pi 2)))
(define (get-x-far-label-params)
(define offset (vector 0 (+ max-x-far-tick-offset max-x-far-tick-label-height half-char-height)))
(define offset (vector 0 (+ max-x-far-tick-offset max-x-far-tick-label-height
half-char-height)))
(list (plot-x-far-label) (v- (view->dc (vector x-mid y-max)) offset) 'bottom))
(define (get-y-far-label-params)

View File

@ -57,7 +57,28 @@ See @(racket ->pen-color) and @(racket ->brush-color) for details on how PLoT in
@doc-apply[plot-x-far-label]
@doc-apply[plot-y-far-label]
@doc-apply[plot-z-far-label]{
The tick labels for ``far'' axes. See @racket[plot-x-ticks] for a discussion of near and far axes.
The axis labels for ``far'' axes. See @racket[plot-x-ticks] for a discussion of near and far axes.
}
@doc-apply[plot-x-tick-label-anchor]
@doc-apply[plot-x-tick-label-angle]
@doc-apply[plot-y-tick-label-anchor]
@doc-apply[plot-y-tick-label-angle]
@doc-apply[plot-x-far-tick-label-anchor]
@doc-apply[plot-x-far-tick-label-angle]
@doc-apply[plot-y-far-tick-label-anchor]
@doc-apply[plot-y-far-tick-label-angle]{
Anchor and angles for axis tick labels (2D only).
Angles are in degrees.
The anchor refers to the part of the label attached to the end of the tick line.
Set these when labels would otherwise overlap; for example, in histograms with long category names.
@interaction[#:eval plot-eval
(parameterize ([plot-x-tick-label-anchor 'top-right]
[plot-x-tick-label-angle 30])
(plot (discrete-histogram '(#(really-long-category-name-1 2)
#(long-category-name-2 1.75)
#(long-category-name-3 2.5)))))]
}
@doc-apply[plot-x-axis?]

View File

@ -101,10 +101,11 @@
;; an exact rational function and a floating-point function
;; the plot of the exact rational function's graph should be smooth
(time
(plot (list (function (λ (x) x) #:label "Exact")
(function (λ (x) (exact->inexact x)) #:color 2 #:label "Inexact"))
#:x-min #e100000000000000.0 #:x-max #e100000000000000.1
#:width 450))
(parameterize ([plot-x-tick-label-angle 15])
(plot (list (function (λ (x) x) #:label "Exact")
(function (λ (x) (exact->inexact x)) #:color 2 #:label "Inexact"))
#:x-min #e100000000000000.0 #:x-max #e100000000000000.1
#:width 450)))
(time
(plot (function cos 0 0.0000001)

View File

@ -228,3 +228,17 @@
[plot-y-ticks (currency-ticks)])
(plot (list (function sin -4 4)
(function-label sin 1/3))))
(parameterize ((plot-x-tick-label-angle 45)
(plot-x-tick-label-anchor 'top-right)
(plot-y-tick-label-angle 45)
(plot-y-tick-label-anchor 'bottom-right)
(plot-x-far-tick-label-angle 45)
(plot-x-far-tick-label-anchor 'bottom-left)
(plot-y-far-tick-label-angle 45)
(plot-y-far-tick-label-anchor 'top-left)
(plot-x-far-label "x far axis")
(plot-y-far-label "y far axis"))
(plot (list (discrete-histogram '(#(asdglkj 5399) #(liegjd 5390) #(pqlcxkgfj 3534)))
(x-ticks (list (tick 1 #t "asdgwieasdgwefj")) #:far? #t)
(y-ticks (list (tick 2500 #t "asdgwegawegfgwiej")) #:far? #t))))