2017-04-22 1 views
1

나는 라켓으로 matplotlib.pyplot.matshow과 비슷한 것을하고 싶습니다. 나는 이것이 사소한 질문이라는 것을 이해하고 어쩌면 내가 어리 석다는 것을 알았지 만, 문서를 작성하는 라켓 (Racket)을 읽은 후에 나는 실패했다.라켓에 이미지로 매트릭스를 플롯하는 방법은 무엇입니까?

#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)) 

누군가가 나에게 힌트를 줄 수 : 원의 이미지로 변환 될 수

예 매트릭스?

답변

2

완전히 바보 같은 질문이 아닙니다. 이것은 파이썬 라이브러리 프로그래머 군대와 경쟁하기 어려운 영역 중 하나입니다. 여기 내가 라켓에서 어떻게 할 수 있을까요?

#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)))))))) 
+0

! 고맙습니다! – Raoul

+0

여기서'plot' 라이브러리를 사용하지 않는 이유가 있습니까? –

+0

@ SamTobin-Hochstadt 그런 식으로 할 수 없기 때문에 나는 'plot'라이브러리로 당신의 솔루션을 보는 것에 매우 흥미가있을 것입니다. 답을 예제와 함께 추가 하시겠습니까 ?? – Raoul

1

정확히 무엇을 음모를 꾸미 겠어요. plot 라이브러리는 플로팅 기능을 중심으로 설계되었지만 표현하고자하는 기능을 알지 못합니다. array->vector*의 종류가 충분히 특정하지 않기 때문에

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

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

cast이 필요 :

여기 매트릭스를 플롯의 두 가지 방법이 있습니다.

+0

음, 위의 함수는 'm'이 예제 코드의 결과 인 행렬로 대체 될 때 플로팅 공간의 중심에있는 단일 점만 표시합니다 ('0'으로 채워진 사각형 행렬, ' '중심). 제가 원했던 것은 ** heatmap ** 일종의 것이 었습니다. 여기서 (x; y)에 그려지는 색은 그 좌표의 행렬 값에 따라 달라집니다. – Raoul

관련 문제