Mercurial > hg > rlgallery-misc
comparison py/stats2.py @ 43:3ecbd4fa2a08
stats2.py: make graphs of maxdepth.
| author | John "Elwin" Edwards |
|---|---|
| date | Thu, 16 Jan 2014 10:07:49 -0800 |
| parents | 1ddd2d950e31 |
| children | 0f4163dbbafc |
comparison
equal
deleted
inserted
replaced
| 42:e1de8aeb5ed4 | 43:3ecbd4fa2a08 |
|---|---|
| 69 divs = 2 | 69 divs = 2 |
| 70 else: | 70 else: |
| 71 divs = 5 | 71 divs = 5 |
| 72 return divs, lim | 72 return divs, lim |
| 73 | 73 |
| 74 def mkxlgraph(game, xls, xlcounts): | |
| 75 xlgraph = open("{0}/xl-{1}.svg".format(svgpath, game.uname), "w") | |
| 76 xlgraph.write(dochead) | |
| 77 xlgraph.write(stylesheet.format("0000ff")) | |
| 78 xlgraph.write(framerect) | |
| 79 xldivs, xlmax = ylimits(max(xlcounts)) | |
| 80 scale = 500 / xlmax | |
| 81 for xl, count in zip(xls, xlcounts): | |
| 82 barx = xl * 50 + 60 | |
| 83 barh = round(scale * count) | |
| 84 bary = 550 - barh | |
| 85 xlgraph.write(barstr.format(30, barh, barx, bary)) | |
| 86 xlgraph.write(xllabel.format(barx + 15, xl)) | |
| 87 for yl in range(xldivs + 1): | |
| 88 labeln = int(xlmax * yl / xldivs) | |
| 89 labelh = 550 + 8 - 500 * yl / xldivs | |
| 90 xlgraph.write(ylabel.format(labelh, labeln)) | |
| 91 xlgraph.write(xlabelf.format("Experience level")) | |
| 92 xlgraph.write(ylabelf.format("# of games")) | |
| 93 xlgraph.write(ltitle.format(sitename)) | |
| 94 xlgraph.write(ctitle.format(game.name)) | |
| 95 xlgraph.write(rtitle.format(timestr)) | |
| 96 xlgraph.write('</svg>\n') | |
| 97 xlgraph.close() | |
| 98 return | |
| 99 | |
| 100 def mkscoregraph(game, scoreblocks, scorecounts): | |
| 101 if isinstance(game, rlgall.ARogueGame): | |
| 102 scorewidth = 1500 | |
| 103 else: | |
| 104 scorewidth = 1000 | |
| 105 scoregraph = open("{0}/score-{1}.svg".format(svgpath, game.uname), "w") | |
| 106 scoregraph.write(dochead) | |
| 107 scoregraph.write(stylesheet.format("ffff00")) | |
| 108 scoregraph.write(framerect) | |
| 109 scoredivs, scoremax = ylimits(max(scorecounts)) | |
| 110 scale = 500 / scoremax | |
| 111 for block, count in zip(scoreblocks, scorecounts): | |
| 112 barx = block * 75 + 100 | |
| 113 barh = round(scale * count) | |
| 114 bary = 550 - barh | |
| 115 scoregraph.write(barstr.format(75, barh, barx, bary)) | |
| 116 scoregraph.write(xllabel.format(barx, block * scorewidth)) | |
| 117 for yl in range(scoredivs + 1): | |
| 118 labeln = int(scoremax * yl / scoredivs) | |
| 119 labelh = 550 + 8 - 500 * yl / scoredivs | |
| 120 scoregraph.write(ylabel.format(labelh, labeln)) | |
| 121 scoregraph.write(xlabelf.format("Score")) | |
| 122 scoregraph.write(ylabelf.format("# of games")) | |
| 123 scoregraph.write(ltitle.format(sitename)) | |
| 124 scoregraph.write(ctitle.format(game.name)) | |
| 125 scoregraph.write(rtitle.format(timestr)) | |
| 126 scoregraph.write('</svg>\n') | |
| 127 scoregraph.close() | |
| 128 return | |
| 129 | |
| 130 def mkdeepgraph(game, deeps, deepcounts): | |
| 131 deepgraph = open("{0}/deep-{1}.svg".format(svgpath, game.uname), "w") | |
| 132 deepgraph.write(dochead) | |
| 133 deepgraph.write(stylesheet.format("808000")) | |
| 134 deepgraph.write(framerect) | |
| 135 deepdivs, deepmax = ylimits(max(deepcounts)) | |
| 136 scale = 500 / deepmax | |
| 137 for lev, count in zip(deeps, deepcounts): | |
| 138 barx = lev * 25 + 75 | |
| 139 barh = round(scale * count) | |
| 140 bary = 550 - barh | |
| 141 deepgraph.write(barstr.format(25, barh, barx, bary)) | |
| 142 if lev % 3 == 0: | |
| 143 deepgraph.write(xllabel.format(barx + 12.5, lev)) | |
| 144 for yl in range(deepdivs + 1): | |
| 145 labeln = int(deepmax * yl / deepdivs) | |
| 146 labelh = 550 + 8 - 500 * yl / deepdivs | |
| 147 deepgraph.write(ylabel.format(labelh, labeln)) | |
| 148 deepgraph.write(xlabelf.format("Deepest dungeon level")) | |
| 149 deepgraph.write(ylabelf.format("# of games")) | |
| 150 deepgraph.write(ltitle.format(sitename)) | |
| 151 deepgraph.write(ctitle.format(game.name)) | |
| 152 deepgraph.write(rtitle.format(timestr)) | |
| 153 deepgraph.write('</svg>\n') | |
| 154 deepgraph.close() | |
| 155 return | |
| 156 | |
| 74 con = psycopg2.connect("dbname=rlg") | 157 con = psycopg2.connect("dbname=rlg") |
| 75 cur = con.cursor() | 158 cur = con.cursor() |
| 76 | 159 |
| 77 for game in rlgall.gamelist: | 160 for game in rlgall.gamelist: |
| 78 xlq = "SELECT count(*) FROM {0} WHERE xl = %s;".format(game.uname) | 161 xlq = "SELECT count(*) FROM {0} WHERE xl = %s;".format(game.uname) |
| 79 scrq = "SELECT count(*) FROM {0} WHERE score >= %s AND score < %s;".format(game.uname) | 162 scrq = "SELECT count(*) FROM {0} WHERE score >= %s AND score < %s;".format(game.uname) |
| 163 deepq = "SELECT count(*) FROM {0} WHERE maxdepth = %s;".format(game.uname) | |
| 80 xls = range(1, 16) | 164 xls = range(1, 16) |
| 81 scoreblocks = range(10) | 165 scoreblocks = range(10) |
| 166 deeps = range(1, 31) | |
| 82 xlcounts = [] | 167 xlcounts = [] |
| 83 scorecounts = [] | 168 scorecounts = [] |
| 169 deepcounts = [] | |
| 84 if isinstance(game, rlgall.ARogueGame): | 170 if isinstance(game, rlgall.ARogueGame): |
| 85 scorewidth = 1500 | 171 scorewidth = 1500 |
| 86 else: | 172 else: |
| 87 scorewidth = 1000 | 173 scorewidth = 1000 |
| 88 for xl in xls: | 174 for xl in xls: |
| 94 hscore = scorewidth * 32 | 180 hscore = scorewidth * 32 |
| 95 else: | 181 else: |
| 96 hscore = (sn + 1) * scorewidth | 182 hscore = (sn + 1) * scorewidth |
| 97 cur.execute(scrq, (lscore, hscore)) | 183 cur.execute(scrq, (lscore, hscore)) |
| 98 scorecounts.append(cur.fetchone()[0]) | 184 scorecounts.append(cur.fetchone()[0]) |
| 99 xlgraph = open("{0}/xl-{1}.svg".format(svgpath, game.uname), "w") | 185 for lev in deeps: |
| 100 scoregraph = open("{0}/score-{1}.svg".format(svgpath, game.uname), "w") | 186 cur.execute(deepq, [lev]) |
| 101 xlgraph.write(dochead) | 187 deepcounts.append(cur.fetchone()[0]) |
| 102 scoregraph.write(dochead) | 188 mkxlgraph(game, xls, xlcounts) |
| 103 xlgraph.write(stylesheet.format("0000ff")) | 189 mkscoregraph(game, scoreblocks, scorecounts) |
| 104 scoregraph.write(stylesheet.format("ffff00")) | 190 mkdeepgraph(game, deeps, deepcounts) |
| 105 xlgraph.write(framerect) | |
| 106 scoregraph.write(framerect) | |
| 107 | |
| 108 xldivs, xlmax = ylimits(max(xlcounts)) | |
| 109 scale = 500 / xlmax | |
| 110 for xl, count in zip(xls, xlcounts): | |
| 111 barx = xl * 50 + 60 | |
| 112 barh = round(scale * count) | |
| 113 bary = 550 - barh | |
| 114 xlgraph.write(barstr.format(30, barh, barx, bary)) | |
| 115 xlgraph.write(xllabel.format(barx + 15, xl)) | |
| 116 for yl in range(xldivs + 1): | |
| 117 labeln = int(xlmax * yl / xldivs) | |
| 118 labelh = 550 + 8 - 500 * yl / xldivs | |
| 119 xlgraph.write(ylabel.format(labelh, labeln)) | |
| 120 | |
| 121 scoredivs, scoremax = ylimits(max(scorecounts)) | |
| 122 scale = 500 / scoremax | |
| 123 for block, count in zip(scoreblocks, scorecounts): | |
| 124 barx = block * 75 + 100 | |
| 125 barh = round(scale * count) | |
| 126 bary = 550 - barh | |
| 127 scoregraph.write(barstr.format(75, barh, barx, bary)) | |
| 128 scoregraph.write(xllabel.format(barx, block * scorewidth)) | |
| 129 for yl in range(scoredivs + 1): | |
| 130 labeln = int(scoremax * yl / scoredivs) | |
| 131 labelh = 550 + 8 - 500 * yl / scoredivs | |
| 132 scoregraph.write(ylabel.format(labelh, labeln)) | |
| 133 | |
| 134 xlgraph.write(xlabelf.format("Experience level")) | |
| 135 xlgraph.write(ylabelf.format("# of games")) | |
| 136 scoregraph.write(xlabelf.format("Score")) | |
| 137 scoregraph.write(ylabelf.format("# of games")) | |
| 138 xlgraph.write(ltitle.format(sitename)) | |
| 139 xlgraph.write(ctitle.format(game.name)) | |
| 140 xlgraph.write(rtitle.format(timestr)) | |
| 141 scoregraph.write(ltitle.format(sitename)) | |
| 142 scoregraph.write(ctitle.format(game.name)) | |
| 143 scoregraph.write(rtitle.format(timestr)) | |
| 144 xlgraph.write('</svg>\n') | |
| 145 xlgraph.close() | |
| 146 scoregraph.write('</svg>\n') | |
| 147 scoregraph.close() | |
| 148 | 191 |
| 149 cur.close() | 192 cur.close() |
| 150 con.close() | 193 con.close() |
| 151 exit() | 194 exit() |
