2010-09-28 59 views
4

我正在寻找一种方法来可视化在clojure编写的模拟中更新的2d java数组,这与我将在matplotlib中使用imshow以可视化numpy数组的方式相同。相当于在Clojure中的imshow?

这样做的最好方法是什么?或者我可以将数组保存到磁盘并在matplotlib中将其可视化。最好的办法是什么?


下面是一个基于Java的代码here我的尝试,但使BufferedImage的很慢。有什么办法加速它:

(import 
'(java.awt Color Graphics Graphics2D Dimension GradientPaint BorderLayout) 
'(java.awt.image BufferedImage) 
'(javax.swing JPanel JFrame)) 

(def L 1024) 

(def image (BufferedImage. (* L 1) (* L 1) (. BufferedImage TYPE_INT_RGB))) 
(def g2 (. image createGraphics)) 

(defn get-color-map [] 
    (let [STEPS 100 
     colormap (BufferedImage. STEPS 1 (BufferedImage/TYPE_INT_RGB)) 
     g (.createGraphics colormap) 
     paint (GradientPaint. 0 0 (Color/RED) STEPS 0 (Color/GREEN)) 
     ] 
    (doto g 
     (.setPaint paint) 
     (.fillRect 0 0 STEPS 1)) 
    colormap)) 

(defn get-color [x start finish colormap] 
    (let [y (/ (- x start) (- finish start)) 
     STEPS 100] 
    (Color. (.getRGB colormap (int (* y STEPS)) 0)))) 

(defn fill-image [^"[[D" arr ^Graphics2D g sideX sideY ^BufferedImage colormap] 
    (dotimes [i (alength arr)] 
    (dotimes [j (alength ^"[D" (aget arr 0))] 
     (doto g 
     (.setColor (get-color (aget ^"[[D" arr (int i) (int j)) -10.0 10.0 colormap)) 
     (.fillRect (int (* i sideX)) (int (* j sideY)) sideX sideY))))) 


(def panel 
    (doto (proxy [JPanel] [] 
      (paintComponent [g] (.drawImage g image 0 0 nil))))) 

(def frame 
    (doto (JFrame. "Heat Map") 
     (.add panel BorderLayout/CENTER) 
     (.pack) 
     (.setLocationRelativeTo nil) 
     (.setVisible true))) 

而这里是一个尝试使用从incanter处理。这也是很慢:

(let [sktch (sketch 
      (setup [] 
        (doto this 
         ;no-loop 
         (size 1024 1024) 
         (framerate 15) 
         smooth)) 

       ;; define the draw function 
       (draw [] 
        (def A (gaussian-matrix 1024 0 1)) 
        (dotimes [i 1024] 
         (dotimes [j 1024] 
         (doto this 
          (stroke (int (abs (* (aget A i j) 255)))) 
          (point i j))))))] 

    (view sktch :size [1024 1024])) 
+0

我试过你的第一个代码,它使一个黑色的矩形非常快*。 – 2014-04-04 21:50:50

+0

也链接被打破 – 2014-04-04 22:01:26

回答

0

它不是一个完全等效的,虽然你也许Pretty Printer Library将帮助您了解:

 
(pprint (for [x (range 10)] (range x)))   
(() 
(0) 
(0 1) 
(0 1 2) 
(0 1 2 3) 
(0 1 2 3 4) 
(0 1 2 3 4 5) 
(0 1 2 3 4 5 6) 
(0 1 2 3 4 5 6 7) 
(0 1 2 3 4 5 6 7 8)) 
nil 

这不是兴田同等规模imshow(即纯文本),所以我我真的认为,这是你可能想使用的东西,直到你找到更漂亮的东西。

+0

我真的很想看到一个方形阵列,约100万像素的时间在变化。但是,当我建立模拟时,这对我检查我的函数输出是有用的。谢谢。 – 2daaa 2010-09-28 17:52:43

2

使用Octave的java package将Java对象转换为Octave,然后调用Octave的imshow。