#lang racket (require rackunit plot plot/utils) ;(plot-new-window? #t) (plot (function / -249 250)) (time (define xs (build-list 10000 (λ _ (random)))) (plot (density xs 1/2))) (time (plot empty #:x-min -1 #:x-max 1 #:y-min -1 #:y-max 1)) (time (plot (points empty) #:x-min -1 #:x-max 1 #:y-min -1 #:y-max 1)) (plot (list (function values -4 4) (axes 1 2))) (time (plot (function values 0 1000))) (parameterize ([plot-x-transform log-transform] [plot-x-ticks (log-ticks #:base 4)] [plot-y-transform log-transform] [plot-y-ticks (linear-ticks #:number 10)]) (plot (function values 1 243))) (parameterize ([plot-background "black"] [plot-foreground "white"] [plot-background-alpha 1/2] [plot-foreground-alpha 1/2]) (plot (function sin -4 4 #:label "y = sin(x)"))) (parameterize ([plot-x-transform (hand-drawn-transform 200)] [plot-y-transform (hand-drawn-transform 200)]) (plot (function sqr -1 1))) (parameterize ([plot-x-transform log-transform] #;[plot-y-transform log-transform]) (time (plot (list (function (λ (x) x) 0.1 10 #:samples 2 #:label "y = x") (polar-axes)) #:title "Nonlinear scaling" #:x-label "x axis" #:y-label "y-axis"))) (define (degrees->point θ [r 1]) (vector (* r (cos (degrees->radians θ))) (* r (sin (degrees->radians θ))))) (plot (list (lines (list (degrees->point 0) (degrees->point 120) (degrees->point 180 0) (degrees->point 240) (degrees->point 0))) (polar (λ (θ) 1) #:color 0))) ;(plot-x-transform cbrt-transform) ;(plot-y-transform cbrt-transform) ;(plot-x-transform (hand-drawn-transform 100)) ;(plot-y-transform (hand-drawn-transform 100)) (time (plot (vector-field (λ (x y) (vector x y)) -5 5 -5 5 #:scale 'auto))) (time (plot (vector-field (λ (x y) (vector (- y) x)) -2 2 -1 4 #:scale 'normalized))) (time (plot (list (lines (for/list ([i (in-range 6)]) (degrees->point (* 2 72 i)))) (list (polar (λ (θ) 1) #:color 0) (polar (λ (θ) 0.38) #:color 0))))) (time (plot (list (lines (for/list ([i (in-range 4)]) (degrees->point (* 120 i)))) (lines (for/list ([i (in-range 4)]) (degrees->point (+ 60 (* 120 i))))) (polar (λ (θ) 1) #:color 0) (polar (λ (θ) 0.5) #:color 0)))) (time (define xs (build-list 100 (λ _ (random)))) (define ys (build-list 100 (λ _ (random)))) (plot (list (points (map vector ys xs) #:sym 'full6star #:color 1) (points (map vector xs ys) #:sym "B" #:color 3)))) (time (plot (vector-field (λ (x y) (vector +nan.0 +nan.0))) #:x-min -2 #:x-max 2 #:y-min -2 #:y-max 2)) #;; high-contrast white-on-black: (begin (plot-foreground "white") (plot-background "black") (point-color "white") (histogram-line-color "white") (histogram-fill-color "black") (contour-color "white")) ;; an exact rational function and a floating-point function ;; the plot of the exact rational function's graph should be smooth (time (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) #:width 500)) (time (plot (list (function sin #:label "Sine" #:color "Blue" #:style 'long-dash #:width 3) (function sqr #:label "Square")) #:x-min -3 #:x-max 3 #:legend-anchor 'top-left)) (time (plot (list (axes) (function sqr -2.1 2.1 #:label "x^2") (error-bars (map (λ (x) (vector x (sqr x) (/ 1/2 (+ (abs x) 1)))) (sequence->list (in-range -2 2.1 1/8))) #:x-min -1)))) (time (plot (list (points '(#(1 1) #(2 2) #(3 3)) #:sym "bob" #:size 10 #:x-min 2 #:x-max 3 #:y-min 1 #:y-max 3)) #:x-min 0 #:x-max 4 #:y-min 0 #:y-max 4)) (time (plot (list (x-axis 1) (y-axis 1) (function sqr #f 2 #:color 1) (inverse sqr #:color 2) (function values #:color 0 #:style 1)) #:x-min -2 #:y-min -1)) (time (plot (list (polar-axes #:number 4) (polar (λ (θ) (+ 0.5 (cos (* 1/2 θ)))) (* -2 pi) (* 2 pi))))) ; draws both functions with x in [-1,1] (plot (list (function sqr #f 1) (function (λ (x) (* 2 (sqr x))) -1 #f #:color "blue") (axes 1 0 #:y-ticks? #f))) ;; error: could not determine x bounds (check-exn exn:fail? (λ () (plot (list (function sqr #f -1) (function sqr 1 #f))))) ; draws both functions with x in [-1,2] (meaning nothing is drawn) (plot (list (function sqr #f -1) (function sqr 2 #f))) ; draws first function with x in [-2,-1] (plot (list (function sqr #f -1) (function sqr 1 #f)) #:x-min -2) ; draws second function with x in [1,2] (plot (list (function sqr #f -1) (function sqr 1 #f)) #:x-max 2) ; draws both functions with x in [-2,2] (plot (list (function sqr #f -1) (function sqr 1 #f)) #:x-min -2 #:x-max 2) ; draws both in full (particularly, without chopping off the top of the parabola), in [-2,2] (plot (list (function sqr) (function sin -2 2))) (time (plot (list (discrete-histogram (build-list 10 (λ (n) (vector (string-ref "abcdefghij" n) (sqr n)))) #:label "ord(x)^2") (function truncate)))) (time (plot (list (x-axis) (discrete-histogram '((a -1) (b 2.6) (c 4) (d 3.1)) #:y-min #f #:color 5 #:line-color 5 #:line-style 'long-dash #:label "Corrupt") (discrete-histogram '(#(a 1) #(b 2.6) #(c 4) #(d 3.1)) #:x-min 5 #:color 1 #:line-color 1 #:line-width 3 #:label "Clean")) #:title "Widgetyness of Widgets" #:x-label "Widget" #:y-label "Widgetyness" #:legend-anchor 'bottom-right)) (time (plot (stacked-histogram '(#(a (1 1 1)) #(b (1.5 3)) #(c ()) #(d (1/2))) #:labels '("Red" #f "Blue")))) (time (parameterize ([discrete-histogram-gap 0] [discrete-histogram-skip 3] [rectangle-line-width 2]) (plot (list (discrete-histogram '(#(a 1) #(b 2.5) #(c 2)) #:label "Blue") (discrete-histogram '(#(a 2) #(b 4) #(c 1)) #:x-min 2/3 #:color 1 #:line-color 1 #:label "Red") (discrete-histogram '(#(a 3) #(b 3) #(c 2.5)) #:x-min 4/3 #:color 2 #:line-color 2 #:label "Green"))))) (time (parameterize ([discrete-histogram-gap 0] [discrete-histogram-skip 2] [stacked-histogram-line-widths '(3)]) (plot (list (stacked-histogram '(#(a (0.2 1)) #(b (2.5 1.2)) #(c (2 0)))) (stacked-histogram '((a (2 1)) (b (1.1 0.9)) (c (1 1.1))) #:x-min 7/8 #:colors '(3 4) #:line-colors '(3 4)))))) (time (parameterize ([plot-x-ticks (currency-ticks)]) (plot (discrete-histogram (list (vector '(a . a) 1) (vector '(a . b) 2) (vector '(b . b) 3) (vector '(b . a) 4)) #:invert? #t #:add-ticks? #f)))) (time (parameterize ([plot-x-ticks (currency-ticks)]) (plot (stacked-histogram (list (vector '(a . a) '(1 2 1)) (vector '(a . b) '(2 1 3)) (vector '(b . b) '()) (vector '(b . a) '(4 4 2))) #:invert? #t #:add-ticks? #f)))) (time (plot (rectangles (map vector (bounds->intervals (map log (linear-seq 10 20 10))) (build-list 9 (λ (n) (ivl (sqr n) (- (sqr n))))))))) (time (define (f x) (* (/ 1 (sqrt (* 2 pi))) (exp (* -1/2 (sqr x))))) (plot (list (area-histogram f (linear-seq -4 4 10)) (function f -4 4)))) (time (plot (list (area-histogram sqr (map (λ (x) (* (sqrt x) (sqrt 8))) (linear-seq 0 8 10))) (function sqr 0 8)))) (time (define xs (build-list 10000 (λ _ (random)))) (define ys (build-list 10000 (λ _ (random)))) (plot (list (points (map vector xs ys) #:x-min -1 #:x-max 1 #:y-min 0.5 #:y-max 1 #:sym 'fullcircle #:size 6.5 #:alpha 1/8 #:label "Dots")) #:y-max 1.5)) (time (plot (vector-field (λ (x y) (vector x y)) -0.5 1.85 -5 0.5 #:color "blue" #:line-width 2/3 #:scale 'auto #:label "(vector x y)") #:x-min -1 #:x-max 5)) (time (plot (list (function (λ (x) (* 220 (cos (* 4 x)))) -2 2) (function (λ (x) (* 200 (sin (* 3 x)))) 0 #f #:y-min -150 #:y-max 150 #:color "blue")) #:x-min -1/2 #:x-max 3)) (time (plot (lines (reverse (for/fold ([lst (list (vector 0 0))]) ([i (in-range 1 400)]) (match-define (vector x y) (first lst)) (cons (vector i (+ y (* 1/100 (- (random) 1/2)))) lst))) #:alpha 0.5 #:label "Random walk"))) (time (plot (function (λ (x) (/ 1.0 (exact->inexact x))) -2 2))) (time (plot (parametric (λ (t) (vector (sin t) (cos t))) (- pi) pi #:x-min -0.5 #:y-max 0.5) #:x-min -1)) (time (plot (list (function sin -1/2 1) (parametric (λ (t) (vector (cos t) (sin t))) -2 1 #:color "blue" #:style 'short-dash)))) (define (norm mx my x y) (exp (* -1/2 (+ (sqr (- x mx)) (sqr (- y my)))))) (define (f1 x y) (+ (norm -1.5 -1.5 x y) (* 2 (norm 1 1 x y)) (* 1.5 (norm 2 -2 x y)))) (define (f2 x y) (- (sqr x) (sqr y))) (time (plot (list (contours f1 0 5 #:label "Cyan/Redness") (contours f2 -5 0 #:colors '("blue") #:label "Blueness" #:widths '(2) #:styles '(dot))) #:x-min -5 #:x-max 5 #:y-min -5 #:y-max 5)) ;; Both plots should be blank (plot (contours f2 -5 0) #:x-min 1 #:x-max 3 #:y-min 1 #:y-max 3) (plot (contour-intervals f2 -5 0) #:x-min 1 #:x-max 3 #:y-min 1 #:y-max 3) (time (plot (contour-intervals f1 -5 5 -5 5 #:label "z"))) (time (plot (contour-intervals (λ (x y) (define z (- x y)) (cond [(< z -1) -1] [(> z 1) 1] [else z])) -2 2 -2 2))) (time (plot (list (tick-grid) (contour-intervals f1 -5 2 -5 2 #:levels 5 #:contour-styles '(transparent) #:label "") (contours f1 -2 5 -2 5 #:levels 5 #:label "")) #:x-min -5 #:x-max 5 #:y-min -5 #:y-max 5 #:legend-anchor 'center)) (time (plot (list (tick-grid) (contour-intervals f1 -5 2 -5 2 #:levels '(0.25 0.5 0.75 1.0 1.25 1.5 1.75) #:colors (compose default-contour-colors (curry map ivl-center)) #:styles '(0 1 2 3 4 5 6) #:contour-styles '(transparent) #:label "z") (contours f1 -2 5 -2 5 #:levels '(0.25 0.5 0.75 1.0 1.25 1.5 1.75))) #:x-min -5 #:x-max 5 #:y-min -5 #:y-max 5 #:legend-anchor 'top-left)) ; tests contour 7-sided and 8-sided saddle facets ; contour shading should line up with contour lines, no matter how weird (parameterize ([contour-samples 10]) (define (f x y) (sqr (sin (- x y)))) (time (plot (contour-intervals f) #:x-min -5 #:x-max 5 #:y-min -5 #:y-max 5))) (time (define (f2 x) (sin (* x pi))) (plot (list (x-tick-lines) (function-interval atan (λ (x) (- (atan x))) #:color 6 #:line1-color 6 #:line2-color 6) (function-interval sqr f2 -1 1 #:alpha 0.5) (function-label f2 -1/4 #:anchor 'top-left)))) (time (define amps (linear-seq 1/4 1 8)) (define colors (color-seq* '("darkred" "white" "darkblue") 7)) (plot (flatten (list (x-tick-lines) (for/list ([a1 (in-list amps)] [a2 (in-list (rest amps))] [color (in-list colors)]) (inverse-interval (λ (y) (* a1 (sin y))) (λ (y) (* a2 (sin y))) (- pi) pi #:color color #:alpha 1 #:label (format "f(~a,~a)" a1 a2))) (y-tick-lines) (inverse-label (λ (y) (* 1/4 (sin y))) (* -1/2 pi) "x = 1/4 sin(y)"))) #:legend-anchor 'top-left)) (time (define a #(0 0)) (define b #(1 1/2)) (define c #(0 1)) (define d #(1 3/2)) (plot (list (tick-grid) (lines-interval (list a b) (list c d) #:color 4 #:line1-color 4 #:line2-color 4 #:label "Parallelogram") (point-label #(1/2 5/4) #:anchor 'bottom-right #:alpha 0.5)) #:legend-anchor 'bottom-left)) (time (define (fa t) (vector (* 2 (cos (* 4/5 t))) (* 2 (sin (* 4/5 t))))) (define (fb t) (vector (cos t) (sin t))) (define (fc t) (vector (* 1/2 (cos (* 4/5 t))) (* 1/2 (sin (* 4/5 t))))) (define t1 (- pi)) (define t2 pi) (plot (list (x-tick-lines) (lines (list (fa t1) (fb t1) (vector +nan.0 +nan.0) (fb t1) (fc t1)) #:color "black" #:style 'dot) (lines (list (fa t2) (fb t2) (vector +nan.0 +nan.0) (fb t2) (fc t2)) #:color "black" #:style 'dot) (parametric fa t1 t2 #:color 5 #:label "fa") (parametric-interval fa fb t1 t2 #:color 5 #:label "(fa,fb)" #:line1-style 'transparent #:line2-style 'transparent) (parametric fb t1 t2 #:color 1 #:label "fb") (parametric-interval fb fc t1 t2 #:color 2 #:label "(fb,fc)" #:line1-style 'transparent #:line2-style 'transparent) (parametric fc t1 t2 #:color 2 #:label "fc") (x-axis #:ticks? #f) (parametric-label fa t1 "fa(-π)" #:size 14 #:anchor 'left #:point-size 5) (parametric-label fa t2 "fa(π)" #:size 14 #:anchor 'left #:point-size 5)) #:legend-anchor 'top-right)) (time (define (f1 θ) (+ 1/2 (* 1/6 (cos (* 5 θ))))) (define (f2 θ) (+ 1 (* 1/4 (cos (* 10 θ))))) (plot (list (polar-axes #:number 10) (polar-interval f1 f2 #:color 3 #:label "[f1,f2]" #:line1-color 1 #:line1-width 2 #:line1-style 'dot #:line2-color 2 #:line2-width 2) (polar-label f1 0 #:anchor 'top-left) (polar-label f2 (degrees->radians 36) #:anchor 'bottom-right) (point-label #(1/2 1/2))))) (time (define (f1 θ) (/ θ pi 2)) (define (f2 θ) (+ (/ θ pi 2) 1)) (plot (list (tick-grid) (polar-interval f1 f2 0 (* 5 pi) #:color 4 #:alpha 3/4 #:line1-color 1 #:line2-color 1 #:label "[f1,f2]")) #:legend-anchor 'center)) (time (define ((make-fun y) x) (+ y (sqr x))) (values (plot (build-list 20 (λ (n) (function (make-fun n) #:color n #:style n #:width 2))) #:x-min -2 #:x-max 2) (plot (list (tick-grid) (function-interval (λ (x) 0) (λ (x) 16) #:color "black" #:alpha 1/20) (build-list 12 (λ (n) (function-interval (make-fun n) (make-fun (add1 n)) -2 0 #:color (->pen-color n) #:style n #:alpha 1 #:line1-style 'transparent #:line2-style 'transparent))) (build-list 12 (λ (n) (function-interval (make-fun n) (make-fun (add1 n)) 0 2 #:color n #:line1-style 'transparent #:line2-style 'transparent))) (build-list 13 (λ (n) (function (make-fun n) -2 0 #:color n #:width 2))) (build-list 13 (λ (n) (function (make-fun n) 0 2 #:color n #:width 2 #:style n)))) #:x-min -2 #:x-max 2))) (time (define (f x) (/ (sin x) x)) (parameterize ([plot-x-transform (stretch-transform -1 1 10)] [plot-x-ticks (ticks-add (plot-x-ticks) '(-1 1))] [plot-y-ticks (fraction-ticks)]) (plot (list (y-axis -1 #:ticks? #f) (y-axis 1 #:ticks? #f) (function f -1 1 #:width 2 #:color 4) (function f -14 -1 #:color 4 #:label "y = sin(x)/x") (function f 1 14 #:color 4) (point-label (vector 0 1) "y → 1 as x → 0" #:anchor 'bottom-right)) #:y-max 1.2)))