#!/usr/local/bin/gawk -f function usage() { print "PSHinton: draw Hinton's diagram" > "/dev/stderr"; print "Usage: PSn [-n ###] [-FRAME] [data]" > "/dev/stderr"; print "Options:" > "/dev/stderr"; print " -n ###: unit length" > "/dev/stderr"; print " -FRAME: squared frame enveloped in each cell" > "/dev/stderr"; print " -h: show this help" > "/dev/stderr"; escape=YES; exit; } BEGIN{ N=0; YES=1; NO=0; FRAME=NO; MAX=- 1e+9; MIN=1e+9; TAG=YES; cells=0; mm = 72 / 2.54 / 10; # dpi / cm / mm margin = 12 * mm; A4x = 210; A4y = 297; A4x *= mm; A4y *= mm; for (i=1; i 0 ) $0 = substr($0,1, pt - 1); for (j=1; j<=NF; j++) { data[N,j] = $j; if (MAX < $j+0.0) MAX = $j; if (MIN > $j+0.0) MIN = $j; } } END { if (N==0 || espcae) {usage(); exit;} if ( MAX > 1.0 ) { denominator = MAX; } else { denominator = 1.0; } if ( denominator < (-1.0 * MIN) ) { denominator = -1.0 * MIN; } if (N < NF) range = NF; else range = N; unit = (A4x - 2 * margin) / range; # llx = (A4x - (range+2) * unit) /2 llx = (A4x - (range) * unit) /2 lly = (A4y - (range+2) * unit) /2 urx = llx + (range) * unit; ury = lly + (range) * unit; print "%!PS-Adobe-2.0 EPSF-2.0"; print "%%Title: PSgraymat"; print "%%Creator: Shinichi ASAKAWA "; print "%%CreationDate: "strftime(); print "%%BoundingBox: " llx-12, lly-12, urx+12, ury+12; # print "%%BoundingBox: " llx, lly, urx, ury; print "%%Pages: (atend)"; print "%%EndComments"; print "% a4size 210mm 297mm"; print "% range="range, " unit="unit, " llx="llx; print "% A4x="A4x, " A4y="A4y; print "/inch { 72 mul } def"; print "/cm { inch 2.54 div } def"; print "/mm { cm 10 div } def"; print "/Width { 210 mm } def"; print "/Height { 297 mm } def % this is A4 paper size"; print "/Center { Width 2 div Height 2 div } def"; print ""; print "/Row " N " def"; print "/Col " NF " def"; print "/gunit "unit " def"; print ""; print "/PosiConn {"; print " gsave"; print " /len 1 def"; print " 2 div /Val exch def"; print " 1 sub /Xpos exch def"; print " Row exch sub /Ypos exch def"; if (FRAME) { print " newpath"; print " Xpos Ypos moveto"; print " len 0 rlineto"; print " 0 len neg rlineto"; print " len neg 0 rlineto"; print " closepath stroke"; } print " Xpos len 2 div add "; print " Ypos len 2 div sub"; print " Val 0 360 arc stroke"; print " grestore"; print "} def"; print ""; print "/NegaConn {"; print " gsave"; print " /len 1 def"; print " 2 div /Val exch def"; print " 1 sub /Xpos exch def"; print " Row exch sub /Ypos exch def"; if (FRAME) { print " newpath"; print " Xpos Ypos moveto"; print " len 0 rlineto"; print " 0 len neg rlineto"; print " len neg 0 rlineto"; print " closepath stroke"; } print " Xpos len 2 div add "; print " Ypos len 2 div sub"; print " Val 0 360 arc fill"; print " grestore"; print "} def"; print ""; print "/Matrix {"; print " gsave"; print " /toy exch def"; print " /tox exch def"; print " /from 0 def /incr 1 def"; print " from incr tox {"; print " dup newpath 0 exch moveto toy exch lineto closepath stroke "; print " } for"; print " from incr toy {"; print " dup newpath 0 moveto tox lineto closepath stroke "; print " } for"; print " grestore"; print "} def"; print "%%EndProlog"; print ""; print "%%Page: 1 1"; print "gsave"; print "Width Col gunit mul sub 2 div"; print "Height Row gunit mul sub 2 div translate"; print "gunit dup scale"; print ""; print "0.01 setlinewidth"; print "0 setgray"; for (i=1;i<=N;i++) for (j=1;j<=NF; j++) if (data[i,j]<=0) print i,j,data[i,j]/denominator, "NegaConn"; else print i,j,data[i,j]/denominator, "PosiConn"; print "grestore showpage"; print "%%Trailer"; print "%%Pages: 1"; }