計算機科学のブログ

ほしい物リスト

Python - Formatted String Literals: Make Charts from Data - svg, scaling numeric values

Head First Python: A Learner’s Guide to the Fundamentals of Python Programming, A Brain-Friendly GuidePaul Barry(著)、 O’Reilly Mediaの Chapter 5.(Formatted String Literals: Make Charts from Data)、EXERCISE(54/102)の解答を求めてみる。

Jupyter(コード、入出力結果)

Charts.ipynb

import swimclub
fn = 'Darius-13-100m-Fly.txt'
*_, times, average, converts = swimclub.read_swim_data(fn)
times, average, converts
(['1:27.95', '1:21.07', '1:30.96', '1:23.22', '1:27.95', '1:28.30'],
 '1:26.58',
 [8795, 8107, 9096, 8322, 8795, 8830])
from_max = max(converts)
from_max
9096
import hfpy_utils
svg = ''
for n, t in enumerate(times):
    bar_with = hfpy_utils.convert2range(converts[n], 0, from_max, 0, 400)
    svg += f'''
<svg height="30" width="400">
    <rect height="30" width="{bar_with}" style="fill:rgb(0,0,255);">
<svg>{t}<br>
'''
svg
'\n<svg height="30" width="400">\n    <rect height="30" width="386.76" style="fill:rgb(0,0,255);">\n<svg>1:27.95<br>\n\n<svg height="30" width="400">\n    <rect height="30" width="356.51" style="fill:rgb(0,0,255);">\n<svg>1:21.07<br>\n\n<svg height="30" width="400">\n    <rect height="30" width="400.0" style="fill:rgb(0,0,255);">\n<svg>1:30.96<br>\n\n<svg height="30" width="400">\n    <rect height="30" width="365.96" style="fill:rgb(0,0,255);">\n<svg>1:23.22<br>\n\n<svg height="30" width="400">\n    <rect height="30" width="386.76" style="fill:rgb(0,0,255);">\n<svg>1:27.95<br>\n\n<svg height="30" width="400">\n    <rect height="30" width="388.3" style="fill:rgb(0,0,255);">\n<svg>1:28.30<br>\n'
print(svg)
<svg height="30" width="400">
    <rect height="30" width="386.76" style="fill:rgb(0,0,255);">
<svg>1:27.95<br>

<svg height="30" width="400">
    <rect height="30" width="356.51" style="fill:rgb(0,0,255);">
<svg>1:21.07<br>

<svg height="30" width="400">
    <rect height="30" width="400.0" style="fill:rgb(0,0,255);">
<svg>1:30.96<br>

<svg height="30" width="400">
    <rect height="30" width="365.96" style="fill:rgb(0,0,255);">
<svg>1:23.22<br>

<svg height="30" width="400">
    <rect height="30" width="386.76" style="fill:rgb(0,0,255);">
<svg>1:27.95<br>

<svg height="30" width="400">
    <rect height="30" width="388.3" style="fill:rgb(0,0,255);">
<svg>1:28.30<br>