home changes contents help options
**日経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>'