**日経255 marketmap をpythonで作る
"日経255 マーケットマップ":http://n225.jp/ は日経225銘柄の株価の様子を表したもので セルの大きさで時価総額を、色で株価の変化を表している。
すばらしいの一言だ。
生成されたページを見るとFlashで作られているようだが、似たようなことをpythonとスタイルシートでやってみた。
何かの数字と会社名、色、リンクのリストを用意して、そこから各社の値に応じた面積のタイルを生成するものだ。
以下にpythonのプログラムを示すが、タグをエスケープする技術がないので、Wiki1を編集モードにして見てほしい。
次のような手順でhtmlファイルを生成する。
このロジックは同じ会社のMさんがEXCELでかかれた物をPythonで書き直したもの。
Mさんに感謝。
1.要素をおおよそ半分にわけ、二つのグループ(TopとBottom)にする。(比率は0.5を変えると変更できる)
2.二つに分けたグループのそれぞれの合計を出し、全体に対するTopの比を求め、分割位置を決める。
3. TopとBottomの要素に対して1,2を繰り返し、要素が一個になったところで四角を描く。
ここまでできれば、後はJavaScriptなどを使えば、いろいろな情報を見せることができるのではないかと思う。
本当は、Zope上で値を動的に変更するところを見せたいのだが、Zope上でのpythonの動かし方がまったく思い出せないので、とりあえずメモ。
このプログラムをローカルで動かして画面に出たテキストをHTMLファイルをとして保存すると見られます。
値を変えるとタイルが面積が変わります。またnの値を計算する部分の0.5を0から1の範囲で増減すると形が変わります。
ソースコード::
def splitTile(x0,y0,x1,y1,d):
if len(d) ==1:
print '.'+d[0][1]+' {'
print ' left:',int(x0),'px;'
print ' top:',int(y0),'px;'
print ' width:',int(x1),'px;'
print ' height:',int(y1),'px;'
print ' background-color:',d[0][2]
print '}'
else:
#print d
top=[];bottom=[];ttotal=0;btotal=0;xs=0;ys=0;n=0
n=0.5 *(len(d)-2) + 1
n=int(n)
#print n
top=d[:n]
for i in top:
ttotal=ttotal+i[0]
#print ttotal
bottom=d[n:]
for j in bottom:
btotal=btotal+j[0]
#print btotal
ratio=1.0*ttotal/(ttotal+btotal)
#print ratio
if x1 > y1 :
xs=x1 * ratio;ys=y1
splitTile(x0,y0,xs,y1,top)
splitTile(x0+xs,y0,x1-xs,y1,bottom)
else:
xs=x1;ys=y1*ratio
splitTile(x0,y0,x1,ys,top)
splitTile(x0,y0+ys,x1,y1-ys,bottom)
value=[[50,'sony','#ff99ff','http://www.sony.co.jp/'],[27,'panasonic','#00ffff','http://panasonic.jp/'],
[36,'dell','#008000','http://www1.jp.dell.com/content/default.aspx?c=jp&l=jp&s=gen'],
[18,'toshiba','#0000ff','http://www.toshiba.co.jp/index_j3.htm'],[39,'NEC','#ffff00','http://www.nec.co.jp/'],
[5,'Fijitsu','#ff00ff','http://jp.fujitsu.com/'],[63,'IBM','#c0c0c0','http://www.ibm.com/jp/']]
print '<html>'
print '<head>'
print '<title>position</title>'
print '<style type="text/css">'
print '<!--'
print 'body { margin: 0}'
print 'div {'
print ' position: absolute;'
print ' font-weight: bold'
print '}'
splitTile(0,0,600,300,value)
print '-->'
print '</style>'
print '</head>'
print '<body>'
for i in value:
print '<a href="'+i[3]+'">'+'<div class='+'"'+i[1]+'">',i[1],'</div></a>'
print '</body>'
print '</html>'