Raoul
Raoul

Reputation: 1892

How to plot a matrix as an image in racket?

I would like to do something similar to matplotlib.pyplot.matshow with racket. I understand this is a trivial question and maybe I'm just being stupid, but I was unsuccessful after reading the Racket plotting documentation.

An example matrix that would be translated into the image of a circle:

#lang typed/racket

(require math/array)
(require plot)

(: sq (-> Integer Integer))
(define (sq [v : Integer])
  (* v v))

(: make-2d-matrix (-> Integer Integer (Array Boolean)))
(define (make-2d-matrix [s : Integer] [r : Integer])
  (let ([center : Integer (exact-round (/ s 2))])
    (let ([a (indexes-array ((inst vector Integer) s s))])
      (let ([b (inline-array-map (λ ([i : (Vectorof Index)])
                            (+
                             (sq (- (vector-ref i 0) center))
                             (sq (- (vector-ref i 1) center))))
                          a)])
        (array<= b (array (sq r)))
        ))))


(array-map (λ ([i : Boolean]) (if (eq? i #f) 0 1)) (make-2d-matrix 20 6))

Can someone give me a hint?

Upvotes: 1

Views: 557

Answers (3)

soegaard
soegaard

Reputation: 31145

Depending on you situation, you might be interested in flomaps:

http://docs.racket-lang.org/images/flomap_title.html?q=flbitmap

Upvotes: 2

Sam Tobin-Hochstadt
Sam Tobin-Hochstadt

Reputation: 5053

I'm not sure exactly what you want to plot. The plot library is designed around plotting functions, but I don't know what function you want to express.

Here are two ways of plotting a matrix:

(plot (points (cast (array->vector* m) (Vectorof (Vectorof Real)))

(plot3d (points3d (cast (array->vector* m) (Vectorof (Vectorof Real)))

The cast is needed because the type of array->vector* is not specific enough.

Upvotes: 1

John Clements
John Clements

Reputation: 17233

Totally not a dumb question. This is one of those areas where it's hard to compete with an army of python library programmers. Here's how I'd do it in Racket:

#lang racket


(require 2htdp/image
         math/array)

;; a 10x10 array
(define a
  (build-array #(10 10)
               (λ (e)
                 (match e
                   [(vector x y)
                    (cond [(= x y) x]
                          [else 0])]))))

;; map a value to a color
(define (cmap v)
  (color (floor (* 255 (/ v 10)))
         0
         (floor (* 255 (- 1 (/ v 10))))))

(apply
 above
 (for/list ([y (in-range 10)])
  (apply
   beside
  (for/list ([x (in-range 10)])
    (rectangle 10 10 'solid (cmap (array-ref a (vector x y))))))))

Upvotes: 3

Related Questions