ビジュアライゼーション(10) 様々な視覚化プログラミング環境 2016/12/22
様々な視覚化プログラミング環境
視覚化プログラミング入門時の要件
無料 or 安価
どこでも動く
導入が簡単
プログラミングが楽
作成結果を公開可能
視覚化プログラミング入門時の要件
視覚化プログラミング入門時の要件
無料 or 安価
どこでも動く
導入が簡単
プログラミングが楽
作成結果を公開可能
望ましい点
簡単にプログラムできること
表現力があること
様々な環境で利用できること
Windows, Mac, ...
ブラウザで動くこと
Firefox, IE, ...
ブラウザで動かせるシステム
table:描画システム
complexity power standard Web open future
Processing ◎ ◯ ◯ ◯ ◯ △
Flash △ ◯ ◯ ◯ △ ×
Java △ ◯ ◯ ◎ ◯ ×
JS+Canvas △ ◯ ◯ ◎ ◯ ◯
JS+SVG △ ◯ ◯ ◯ ◯ ◯
HTML ◯ × ◎ ◎ ◯ ×
各種システムで動くもの
table:描画システム
complexity power standard Web open
OpenGL × ◎ ◯ ◯ ◯
PostScript △ ◯ ◯ × △
機種依存
table:描画システム
complexity power standard Web open
GDI(Win) △ △ × × ×
DirectX(Win) × ◎ × × ×
Cocoa(Mac) △ ◯ × × ×
Xlib(Linux) △ △ × × ×
HTMLを視覚化に使う
四角と文字を様々な位置に配置
自動配置を使える
矩形や縦横線だけ利用する視覚化
http://gyazo.com/46c2235e3b033375409439e210ffd00e.png
JavaScriptによる対話処理
文字や矩形の位置やサイズを対話的に動かす
ユーザ操作に対応して動かすことができる
動的表示が可能
サーバとHTTP通信
code:html
<div id="rect"></rect>
<script type="text/javascript">
document.addEventListener('mousedown', mousedown, true);
document.addEventListener('mouseup', mouseup, true);
document.addEventListener('mousemove', mousemove, true);
var rect = document.getElementById('rect');
var down = false;
function mousedown(){ down = true; }
function mouseup(){ down = false; }
function mousemove(e){
if(down){
rect.style.backgroundColor = "#ffff00";
rect.style.height = e.pageY;
rect.style.width = e.pageX;
}
}
</script>
</body>
</html>
PostScript
Adobeの「ページ記述言語」
PDFの元システム
Apple社「LaserWriter」で採用
2次元一次変換+平行移動
移動、回転、変型、
透視変換は不可
ベジェ曲線
アフィン変換
線型変換(回転、拡大縮小、剪断)と平行移動の組み合わせ
製図などの基本
アフィン変換
http://gyazo.com/5ddd1b241cb69e927c19a787461bc270.png
透視変換
3次元CGなどで利用される変換
遠近法的描画
透視変換
遠いところを小さく描く
http://gyazo.com/8d60d74cbf382a9bd6bee628e0c34875.png
円の透視変換?
円の透視変換
http://gyazo.com/4c5aa4823b10c5a9647f338eff95b334.png
PostScript
http://gyazo.com/cc314d3ea71e6e2eea90b4880e91e46c.png
LaserWriter
Appleが1986年ごろ発売したレーザープリンタ
200万円ぐらいしたかも
http://gyazo.com/2b78cf30bc6eba3a69a3486b0730e868.png
NeXT Computer
1985創業 by ジョブズ
1988 NeXT Cube発売
現在のMacの原型
Display PostScriptによる描画
Objective-Cによるプログラミング
http://gyazo.com/66d94e93c6a0d0153f171b88692e2445.png
Adobeの歴史
1985 PostScript開発
レーザープリンタの草分け
1989 PhotoShop発売
1994 アルダス買収
2005 マクロメディア買収
PostScriptを展開したもの
Acrobatの「Distiller」で変換
PostScriptと関係なく生成も可能
DTP文章の標準になっている
PostScript
描画命令を含むプログラミング言語
後置記法言語
c.f. Forth
言語インタプリタがプリンタ内蔵
プリンタにログイン可能
計算機とプリンタとの通信量を減らす
入力は無い
c.f. Display PostScript
後置記法
数式
1 + 2 (通常の式)
1 2 add (後置)
HPの電卓で採用されていた
括弧が不要
スタックマシンで簡単に実装できる
デモ: dcコマンド
10 20 + 30 * p ⇒ 900
後置記法
一般的な言語
for(i=0;i<10;i++){ printf("abc"); }
Forthの後置記法
1 10 { (abc) show } for
lines.ps
線を一本ずつ描画
code:lines.ps
%!PS-Adobe-3.0
0 0 moveto 0 400 lineto stroke
10 0 moveto 0 400 lineto stroke
20 0 moveto 0 400 lineto stroke
30 0 moveto 0 400 lineto stroke
%....
390 0 moveto 0 400 lineto stroke
400 0 moveto 0 400 lineto stroke
showpage
描画結果
http://gyazo.com/158a2c0d520dae1fa19fcc32d6a2933d.png
ループの利用
code:lines2.ps
%!PS-Adobe-3.0
0.5 setgray
0 10 400 {
0 moveto
0 400 lineto
stroke
} for
showpage
描画結果
http://gyazo.com/8aa4873f89a38e1b8d46282e0ba22fc8.png
Distiller
PostScriptをPDFに変換
ループなどは実行結果がPDFになる
http://gyazo.com/b37638d22c0df9d079f111f8c3280961.png
Canvas
Apple社が作成
HTMLのCanvasタグで描画プリミティブを指定
様々な図形を描画可能
HTML5で標準化
最近のブラウザでは動作する
JavaScript拡張なので利用が簡単
jQueryによるライブラリ多数
code:html
<html>
<body>
<canvas id="canvas"></canvas>
<script type="text/javascript">
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
ctx.beginPath();
ctx.moveTo(75,50);
ctx.lineTo(100,75);
ctx.lineTo(100,25);
ctx.fill();
</script>
</body>
</html>
描画結果
http://gyazo.com/cdf7dabe75857161b440ded84b4dda85.png
code:html
<html>
<body>
<canvas id="canvas" width="300" height="300"></canvas>
<script type="application/x-javascript">
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
ctx.strokeStyle = "rgb(0,0,200)";
var i;
for(i=0;i<300;i++){
ctx.beginPath();
ctx.moveTo(300-i,0);
ctx.lineTo(0,i);
ctx.stroke();
}
</script>
</body>
</html>
描画結果
http://gyazo.com/2f4849f0c5b321975576039ae95bb412.png
code:html
<html>
<body>
<canvas id="canvas"></canvas>
<script type="text/javascript">
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
ctx.fillRect(25,25,100,100);
ctx.clearRect(45,45,60,60);
ctx.strokeRect(50,50,50,50);
</script>
</body>
</html>
描画結果
http://gyazo.com/b3aa7686556ec60f67193ca047f261c0.png
code:html
<html>
<body onload="draw()">
<canvas id="canvas" width="300" height="300"></canvas>
<script type="application/x-javascript">
function draw()
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
ctx.fillStyle = "rgb(200,0,0)";
ctx.fillRect (10, 10, 55, 50);
ctx.fillStyle = "rgba(0, 0, 200, 0.5)";
ctx.fillRect (30, 30, 55, 50);
}
</script>
</body>
</html>
描画結果
http://gyazo.com/ce38b07db1970b6396ac9fd69a70087e.png
code:html
<html>
<body>
<canvas id="canvas"></canvas>
<script type="text/javascript">
var ctx = document.getElementById('canvas').getContext('2d');
// Create gradients
var lingrad = ctx.createLinearGradient(0,0,0,150);
lingrad.addColorStop(0, '#00ABEB');
lingrad.addColorStop(0.5, '#fff');
lingrad.addColorStop(0.5, '#66CC00');
lingrad.addColorStop(1, '#fff');
var lingrad2 = ctx.createLinearGradient(0,50,0,95);
lingrad2.addColorStop(0.5, '#000');
lingrad2.addColorStop(1, 'rgba(0,0,0,0)');
// assign gradients to fill and stroke styles
ctx.fillStyle = lingrad;
ctx.strokeStyle = lingrad2;
// draw shapes
ctx.fillRect(10,10,130,130);
ctx.strokeRect(50,50,50,50);
</script>
</body>
</html>
描画結果
http://gyazo.com/30bb7098159442c5f9d53a875934f0ae.png
jQuery
JavaScriptを使いやすくするライブラリ
拡張プラグインを作成しやすい
描画用プラグインが多数作られている
SparklineをCanvasに描画する
Sparkline
Edward Tufteが提唱する簡単な視覚化
テキストの中にグラフを混雑させる
http://gyazo.com/97043cdd33cf04787690a2afcbc59815.png
jQuery Sparklineの例
code:html
<span class="line">1,3,5,7,9,8,7,6,5,6,7,8,9,10</span>
$('.line').sparkline();</code>
表示されるSparkine
http://gyazo.com/54620ef5792f56d57bcaef3429b70b45.png
その他のSparkline表示例
http://gyazo.com/010be5fa26b5844fc774f3e4890156a6.png
SVG
かなり昔からの標準化仕様
グラフィクスを宣言的に記述
多くのブラウザで実装されている
code:xml
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
<svg width="320pt" height="223pt" viewBox="0 0 100 70"
<rect x="5" y="5" width="70" height="40" fill="red"/>
<rect x="15" y="15" width="70" height="40" fill="orange"/>
<rect x="25" y="25" width="70" height="40" fill="yellow"/>
</svg>
描画結果
http://gyazo.com/3ac4f9f16144b0fea50f9a67c322969e.png
code:xml
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
<circle id="circle" cx="214" cy="150" r="15" fill="olivedrab"/>
<rect x="0" y="0" width="428" height="300" opacity="0" onmousemove="moveGraphics(evt)"/>
<script type="text/ecmascript"><![CDATA[
var circleobj = document.getElementById("circle");
function moveGraphics(evt)
circleobj.setAttributeNS(null, "cx", evt.clientX);
circleobj.setAttributeNS(null, "cy", evt.clientY);
}
]></script>
</svg>
描画結果
http://gyazo.com/98509600dea1cdb3dbc1f0b731763c5d.png
DOMにもとづいてSVGでデータ描画
現在もっとも有望
http://gyazo.com/de8d809e2d27f77f76300a6d854fb322.png
Interactive Data Visualization for the Web
d3を使った情報視覚化解説
http://gyazo.com/e16c6e41256a2e95dff2b2eea9389554.png
code:html
div.bar
display: inline-block;
width: 20px;
height: 75px;
background-color: teal;
}
</style>
<script type="text/javascript">
d3.select("body").selectAll("div")
.data(dataset)
.enter()
.append("div")
.attr("class", "bar")
.style("height", function(d)
var barHeight = d * 5;
return barHeight + "px";
});
http://gyazo.com/150470d90eff54b4a44404a311aa4f71.png
jQueryの視覚化プラグイン
http://gyazo.com/f0c3783ab763fbd9752a589f1d81697f.png
http://gyazo.com/ae5e97e886344fe244f54d5341c372be.png
Flash
もともとはアウトライン表示の紙芝居システム
MacroMediaが買収 (1996)
Adobeが買収 (2005)
ActionScriptによる統合的プログラミング環境に進化
EcmaScript準拠
Flashによる開発
Flex
統合開発環境
学生だと無料
mxmlc
ActionScriptコンパイラ
コマンドラインで起動
無料
http://gyazo.com/415e20d629fa111bff4ae33019e5977c.png
ActionScript例
code:javascript
.....
//
trapezoid.graphics.clear();
trapezoid.graphics.beginFill(0xc0c000,0.6);
trapezoid.graphics.moveTo(SBPOSX+SBWIDTH+5,BOXPOSY+firstline);
trapezoid.graphics.lineTo(SBPOSX+SBWIDTH+5,BOXPOSY+lastline);
trapezoid.graphics.lineTo(SVPOSX-1,SVPOSY+SVHEIGHT);
trapezoid.graphics.lineTo(SVPOSX-1,SVPOSY);
trapezoid.graphics.endFill();
.....
OpenGL
3次元描画ライブラリ
Silicon Graphics社のワークステーションのIris GLライブラリをオープン化
Iris GLの例
code:c
main()
{
prefposition(0,200,0,100);
winopen("GL Example");
RGBmode();
gconfig();
RGBcolor(0,0,100);
clear();
cmov2i(40,45);
RGBcolor(255,255,255);
charstr("Hello, World!");
sleep(10);
}
OpenGLの例
code:c
void ohinit(void)
{
glClearColor(0.0,0.0,0.4,0.0);
glFrontFace(GL_CW);
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
}
void ohreshape(int w,int h)
{
glViewport(0,0,(GLsizei)w,(GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-1.2,1.2,-1.2,1.2);
glMatrixMode(GL_MODELVIEW);
}
void ohdraw(void)
{
glBegin(GL_TRIANGLE_FAN);
glColor3f(0.0,0.0,1.0); glVertex3f(0.0,0.0,1.0);
glColor3f(1.0,0.0,0.0); glVertex3f(1.0,0.0,0.0);
glColor3f(0.0,1.0,0.0); glVertex3f(0.0,1.0,0.0);
glColor3f(0.0,1.0,1.0); glVertex3f(-1.0,0.0,0.0);
glColor3f(1.0,0.0,1.0); glVertex3f(0.0,-1.0,0.0);
glColor3f(1.0,0.0,0.0); glVertex3f(1.0,0.0,0.0);
glEnd();
glBegin(GL_TRIANGLE_FAN);
glColor3f(1.0,1.0,0.0); glVertex3f(0.0,0.0,-1.0);
glColor3f(1.0,0.0,0.0); glVertex3f(1.0,0.0,0.0);
glColor3f(1.0,0.0,1.0); glVertex3f(0.0,-1.0,0.0);
glColor3f(0.0,1.0,1.0); glVertex3f(-1.0,0.0,0.0);
glColor3f(0.0,1.0,0.0); glVertex3f(0.0,1.0,0.0);
glColor3f(1.0,0.0,0.0); glVertex3f(1.0,0.0,0.0);
glEnd();
}
GLUT
OpenGLを各種プラットフォームで動かすライブラリ
Windows, Mac, Linuxなど
ウィンドウ操作、マウス入力などの処理
GLUTの例
code:c
int main(int argc, char** argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize(300,300);
glutInitWindowPosition(100,100);
ohinit();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutKeyboardFunc(keyboard);
glutIdleFunc(idle);
glutMainLoop();
return 0;
}
GL/GLUTを利用した視覚化システムの例
http://gyazo.com/77b8fad00d790d6e0fa4879d280ce176.png
Processing and P5.js
その他
Java
Cocoa
GDI
Xlib
Jitter
...
まとめ
各種のシステムをパソコンやブラウザで利用可能
手軽なものから本格的なものまで様々
場合に応じて適切なものを利用するとよい
JavaScriptベースの視覚化ライブラリを使うのがおすすめ