繼上篇《可視化工具solo show》羅列出一些主要基於Java開發的軟件、插件之后,又仔細揣摩了下哪些可以為我所用。
一番端詳之后,准備挑出其中Processing和Prefuse兩位大將出來一展雄威!
(備注:上次和此次“solo show”都未提及gephi,並不是說它不入流,不上檔次,恰恰它是一款高大上、優秀的可視化工具,只是這兩篇都是在筆者繼初探gephi源碼絆腳后對一些工具的探討對比,所以沒有將其入列。)
1.Processing:
Processing 的最初目標是開發圖形的 sketchbook 和環境,用來形象地教授計算機科學的基礎知識。之后,它逐漸演變成了可用於創建圖形可視化專業項目的一種環境。
Processing 是用 Java 編程語言寫的。
Processing的API地址:http://processing.org/reference/ 有如何着色、畫線、呈現圖形圖像等介紹。
http://processing.org/reference/javadoc/core/
官網地址:http://www.processing.org/
Processing開發的是Java Applet應用程序。Java小程序,也就是Java Applet,可以在Web瀏覽器中運行。Java Applet必須以<applet>腳本的形式嵌入到HTML頁面中,才能在web瀏覽器中運行。它的缺點之一是要使用到Java小應用程序,在某些計算機上載入時可能會很慢,而且並不是每個人都安裝了Java(盡管多數人都安裝了)。不過這也有解決辦法,Processing已經發布了它的JavaScript版本。
但是Java Applet有自己的短處,效率低,需要JVM支持,沒有成型的IDE工具。Java小程序,也就是Java Applet,可以在Web瀏覽器中運行。Java Applet必須以<applet>腳本的形式嵌入到HTML頁面中,才能在web瀏覽器中運行。)
下面簡要介紹Processing API的一部分:
Processing 應用程序是有一定結構的,這一點在開發能夠持續運行且隨時更改顯示窗口的圖形應用程序(比動畫)時非常重要。在這種情況下,就凸顯了 setup 和 draw 這兩個函數的重要性。
setup() 函數用於初始化,由 Processing 運行時執行一次。通常,setup() 函數包含 size ()函數(用於定義窗口的邊界)以及在操作期間要使用的變量的初始化。Processing 運行時會不斷執行 draw ()函數。每次 draw() 函數結束后,就會在顯示窗口繪制一個新的畫面,並且 draw() 函數也會被再次調用。默認的繪制速度是每秒 60 個畫面,但是您也可以通過調用 frameRate() 函數來更改這個速度。
此外,還可以使用 noLoop() 和 draw() 來控制在何時繪制畫面。noLoop() 函數會導致繪制停止,而使用 loop ()函數則可以重新開始繪制。通過調用redraw() 可以控制 draw 在何時調用。
size() 關鍵字指定顯示窗口的 X 和 Y 坐標。 size ()接受可選的第三個參數 mode。 mode 用來定義要使用的呈現引擎並支持 PDF(直接呈現為 Adobe® PDF 文檔)、OPENGL (利用一個可用的 Open-GL 圖形適配器)、P3D(為了迅速的 3-D 呈現)等。默認的是 JAVA2D,它最適合於高質量的 2-D 成像。
可以使用 get() 操作來讀取顯示中的一個給定像素點的顏色。雖然 set() 很簡單,但它不是操做顯示的最快方式。要想快速訪問,可以使用pixels 數組(與 loadPixels 和 updatePixels 函數一致)。
在 Processing 內使用單個函數繪制形狀十分簡單。要設置在繪制形狀時使用何種顏色,可以利用 stroke ()函數。此函數可接受一個單獨的灰度參數或三個 RGB 參數。此外,還可以用 fill 命令定義這個形狀的填充色。
line() 函數接受四個參數,代表的是要在其間繪制線條的點。rect ()函數可繪制一個矩形,並且前兩個點定義位置,而后面兩個點則分別定義寬度和高度。ellipse ()函數也接受四個參數,分別定義位置和寬/高度。當寬和高相等時,就是一個圓形。還可以使用 ellipseMode() 函數定制橢圓,它指定 x,y 位置是否代表了橢圓的角(CORNER)或中心(CENTER)。
quad() 可以很容易地繪制有四個邊的多邊形。四邊形接受八個參數,代表的是這個四邊形的四個頂點。
Processing支持對於鍵盤和鼠標的事件監聽,如keyPressed()、keyRealeased()、mousePressed()、mouseMoved()等。
Processing支持面向對象編程。
但是Processing不像下面要介紹的Prefuse已經集成有布局算法了。
參考資料:http://www.ibm.com/developerworks/cn/opensource/os-datavis/
下面是在Processing客戶端運行的一個demo(當然也可以在Eclipse/Myeclipse中運行,需要安裝Processing的插件):
1 void setup() { 2 size(640, 360, P3D); 3 noStroke(); 4 } 5
6 void draw() { 7 background(0); 8 translate(width / 2, height / 2); 9
10 // Orange point light on the right
11 pointLight(150, 100, 0, // Color
12 200, -150, 0); // Position 13
14 // Blue directional light from the left
15 directionalLight(0, 102, 255, // Color
16 1, 0, 0); // The x-, y-, z-axis direction 17
18 // Yellow spotlight from the front
19 spotLight(255, 255, 109, // Color
20 0, 40, 200, // Position
21 0, -0.5, -0.5, // Direction
22 PI / 2, 2); // Angle, concentration
23
24 rotateY(map(mouseX, 0, width, 0, PI)); 25 rotateX(map(mouseY, 0, height, 0, PI)); 26 box(150); 27 }
運行的效果圖:
2.Prefuse:
Prefuse的API地址:http://prefuse.org/doc/api/
Prefuse的用戶手冊:http://prefuse.org/doc/manual/
Prefuse是采用Java語言開發的數據可視化工具。其支持豐富的數據模型、可視化、交互的特性,具有表格、樹形、一系列的布局和動畫的效果。Prefuse使用Java的2D圖形庫編程,能夠有效集成到Java Swing的應用程序和Applets中,並且是free to use。------源碼可得。
官網地址:http://prefuse.org/
Prefuse是一個提供交互式信息可視化的用戶界面工具包。
Prefuse繪制的圖形可以是一個文件系統、計算機網絡、網站、生物分類或是社交網絡等,圖形的展示需要數據,所以需要先得到數據並導入。
Prefuse提供了圖形接口包括節點、邊、樹狀節點、圖、樹等多種展現形式,其也提供了圖形讀寫接口,包括讀取XML、CSV等格式的數據文件。
Prefuse提供圖形過濾功能,包括鎖定某一限定范圍的圖形進行展示和操作。ItemRegistry(組件注冊機制)是Prefuse中的核心數據結構機制,它控制原始圖形到可視化組件展現之間的映射關系,並且可以針對需要過濾組件提供一個快速迭代的隊列。
Renderers(渲染器)負責畫圖以及計算圖形邊界,其也是RendererFacotry針對給定的可視化組件進行可視化呈現的途徑。
渲染器提供了包括圖形渲染(ShapeRenderer)、文本渲染(TextRenderer)、文本圖像渲染(TextImageRederer)、邊渲染(EdgeRenderer)、聚合子樹渲染(SubtreeAggregateRenderer)等多種渲染方式。
數據展示類(Display)提供了在屏幕上畫圖以及互動性操作,該類繼承了javax.swing.JComponent,並通過ControlListener接口以及prefuse.controls進行圖形界面監聽以及反饋。該類支持屏幕圖形的文本編輯、圖形變換、平移以及縮放。
圖形處理操作(比如過濾、布局、分配屬性等)是通過構造一個叫做Actions的處理模塊管道來實現的。ActionLists通過向ActivityManager提交任務並執行。
Actions中主要包括如下操作:
Filters: GraphFilter, TreeFilter, FisheyeTreeFilter, FisheyeGraphFilter
Layout: ForceDirectedLayout, RadialLayout, SquarifiedTreeMapLayout, …
Assignment: ColorFunction, SizeFunction, FontFunction
Interpolation: ColorInterpolator, LinearInterpolator, PolarInterpolator
如何使用Prefuse構建一個app:
- 設計可視化界面,確定如何布局、交互;
- 確定圖數據的輸入、輸出;
- 初始化ItemRegistry和Display(s)類;
- 選擇或實現Renderers(渲染器)和RendererFactory(渲染工廠);
- 構建各種必須的ActionLists;
- 使用Actions現有的庫,或是定制的模塊(或者子模塊比如Force函數);
- 編寫用戶回調界面來協調ActionLists。
補充:Vizster is a prefuse-built visualization of online social network services such as Friendster and Orkut.
Vizster也是基於Prefuse開發的一款在線社交網絡可視化軟件。
下面我們看看兩個Prefuse自帶demo的顯示效果:
綜上可以發現:Processing簡單靈活,只需幾行代碼即可繪制絢麗的圖形,其更側重藝術效果,如3D效果、投光角度等;
Prefuse靈活度更高,API粒度小,操控方便,而且內置力導向布局、樹狀布局、網格布局等多種布局方式。
如需轉載請標明出處:http://www.cnblogs.com/bigdataZJ/p/VisualizationSoloShow2.html
友情贊助
如果你覺得博主的文章對你那么一點小幫助,恰巧你又有想打賞博主的小沖動,那么事不宜遲,趕緊掃一掃,小額地贊助下,攢個奶粉錢,也是讓博主有動力繼續努力,寫出更好的文章^^。
1. 支付寶 2. 微信