SVG グラフのスマホ対応:公開済み 94 枚を描き直した構築ログ

SVG グラフがスマホで読めない原因を、viewBox の幅と font-size から画面上の px に直して示します。公開済み 97 枚のうち 94 枚を描き直した手順と、仕様ファイルを残していなかったつまずきを記録します。

18分で読めます Data
横長で文字の小さい灰色の棒グラフが、矢印を経て、スマホの縦長の枠に収まる太い青の棒グラフへ描き直される様子
この記事は AI が下書きを補助し、運営者が内容を確認して公開しています。

レポートやブログのグラフをスクリプトや AI で自動生成している方向けに、SVG グラフがスマホで読めなくなる仕組みと、公開済みの図をまとめて描き直す手順を紹介します。筆者がこのサイトの運用で、公開済みのグラフ 97 枚のうち 94 枚を描き直した記録をもとにしています。読み終わると、図の幅と文字の大きさを数字の基準で決め、配った図を漏れなく直す段取りを組めるようになります。

この記事で分かること

  • SVG グラフの文字がスマホで何 px になるかを、viewBox の幅と font-size から計算する方法
  • 公開済みの図を、記事の本文を書き換えずに一括で描き直す手順
  • 描き直しの時に、何を保存しておかないと後で困るのか(つまずいた点)

何が起きていたか:幅 960 の図はスマホで文字が約 3.7px

このサイトのグラフは、SVG(線や文字を座標で記録する画像の形式。拡大しても荒れない)で自動生成しています。描き直す前の図は、横幅 960 の座標で作り、文字の大きさを 12〜15 にしていました。描画スクリプトが同じ設計の幅と文字で、すべてのグラフを描いていました。

ところが、スマホでは文字がほとんど読めませんでした。原因は viewBox(SVG の中の座標の範囲を、左上の位置と幅・高さの 4 つの数値で決める属性)にあります。MDN の説明では、viewBox があると、SVG は入れ物の大きさに合わせて引き伸ばされたり縮められたりします。図が レスポンシブ(画面の幅に合わせて表示の大きさが変わること)に表示されるのは、この仕組みのおかげです。

つまり、図の中の文字も、図全体と同じ割合で縮みます。このサイトの記事ルールでは、幅 360px のスマホの画面で本文の幅を 292px と見積もっています。幅 960 の図は 292px まで縮むため、文字は約 0.30 倍になります。

縮小率         = 本文の幅 292 ÷ viewBox の幅
画面上の文字   = 縮小率 × font-size

幅 960・font-size 12 の場合
  292 ÷ 960 = 0.304
  0.304 × 12 = 3.65px(約 3.7px)

筆者がこの式で計算すると、描き直す前の図の文字は画面上で約 3.7〜4.6px でした。図の中の文字は、座標の上では 12〜15 でも、スマホの画面ではその 3 割ほどの大きさまで縮んでいたことになります。

点検した時点では、公開中の記事 81 本のうち 48 本で、図の文字が画面上 12px 未満になっていました。数えた件数は 213 件です。

基準を数字で決める:viewBox の幅と font-size の組み合わせ表

直す前に、「どの大きさなら読めるとするか」を数字で決めました。このサイトでは、画面上 12px 以上を基準にしています。12px は筆者の運用の基準で、公的な決まりから取った数字ではありません。

アクセシビリティ(障害の有無や環境にかかわらず使えること)の国際的な指針である WCAG 2.2 も確かめました。WCAG 2.2 の達成基準 1.4.4 は、文字を支援技術なしで 200% まで拡大しても内容が失われないことを求めています。達成基準 1.4.10 は、縦にスクロールする内容を、幅 320 CSS ピクセル相当の画面で、横スクロールなしに読めることを求めています(2 次元の配置が要る部分は除きます)。

ただし、筆者が確かめた範囲では、図の中の文字の最小 px を直接定める基準はありませんでした。

そこで、viewBox の幅 4 通りと font-size 3 通りの 12 通りで、画面上の文字の大きさを計算しました。図 1 と表 1 が結果です。

viewBox の幅 480・640・800・960 ごとに、font-size 12・15・20 の文字が幅 292px の本文で何 px になるかを比べた横棒グラフ。12px を超えるのは幅 480 で font-size 20 の組み合わせだけ

表 1:本文の幅 292px での画面上の文字(px)。筆者が 292 ÷ 幅 × font-size で計算

viewBox の幅縮小率font 12font 15font 2012px に要る font
4800.617.309.1312.1719.7
6400.465.486.849.1326.3
8000.374.385.487.3032.9
9600.303.654.566.0839.5

図 1 のとおり、12 通りのうち 12px を超えるのは、幅 480・font-size 20 の 1 通りだけでした。幅 960 のまま 12px にするには、font-size を 39.5 以上にする必要があります。文字を 3 倍以上にすると、ラベルが図に収まらなくなると考えられます。

表 1 の右端の列は、12 ÷ 縮小率で求めました。式を変形すると、幅 × 12 ÷ 292、つまり幅のおよそ 24 分の 1 になります。本文の幅が 292px の画面なら、図の font-size を viewBox の幅 ÷ 24 以上にしておくと、画面上の文字が 12px 前後になります。このサイトの検査は、この「幅 ÷ 24」をそのまま基準にしています。

描き直しの手順:スクリプトを直す、仕様を集める、一括で描く、検査する

基準が決まったので、公開済みのグラフを描き直しました。手順は図 2 の 5 段階です。

公開済みのグラフを描き直した順番を、描画スクリプトの変更、仕様の回収、古い描画との突き合わせ、一括の描き直し、検査の 5 段階で上から下へ示したフロー図

  1. 描画スクリプトの設計の幅を 960 から 480 に、文字を 12〜26 から 20〜26 に変える
  2. 図の元になった 仕様ファイル(グラフの種類・値・題名を書いた JSON)を集める
  3. 古い描画で仕様を描き、公開済みの図と中身を突き合わせる
  4. 一致した図だけを、新しい描画で同じファイル名に上書きする
  5. 記事の検査と、ブラウザでの文字の実測で確かめる

手順 1:幅を半分にすると、縦棒が入らなくなる

幅を 480 にすると、縦棒のグラフが成り立たなくなりました。4 系列 × 7 カテゴリの図では、棒 1 本が約 12px になり、カテゴリ名も値も読める大きさで入りません。そこで、縦棒とグループ化した縦棒も、横向きの棒で描くように変えました。

仕様 JSON の書き方は変えていません。仕様の type が vbar のままでも、描画スクリプトが横向きに描きます。書き方を変えなかったため、古い仕様をそのまま新しい描画に渡せました。

文字の幅の見積もりも変えました。前は「全角は 1 文字分、半角は 0.32〜0.66 文字分」という大まかな分類でした。新しい描画では、Chrome で Hiragino Sans の字ごとの幅を実測した表(端数は切り上げ)を使います。幅の狭い図では、見積もりのずれが文字のはみ出しにつながりやすいと考えたためです。

手順 4:本文を書き換えずに済んだ理由

記事の本文は 1 行も変えていません。図のファイル名を変えず、本文の画像の参照に幅や高さを書いた箇所も無かったためです。画像の参照はそのままで、新しい図が表示されました。

図のファイル名を変えずに中身だけを入れ替えれば、記事の本文を書き換えずに図を差し替えられます。ただし、本文の画像に幅と高さを直接書いている場合は、縦横の比が変わって図が歪むと考えられます。差し替える前に、本文の参照に width や height が無いかを検索しておくと安全です。

図を再生成できる状態とは:入力・処理・出力の置き場所

描き直しでつまずいたのは、手順 2 と 3 でした。描画スクリプトはリポジトリ(コードの保管場所)にありましたが、図の仕様ファイルが無かったためです。

データパイプライン(データを入力から出力まで順に加工する流れ)として見ると、図の生成は次の 4 つの部品でできています。図 3 はその置き場所と関係です。

仕様 JSON(入力)、描画スクリプト(処理)、SVG(出力)、記事本文(参照)の 4 つを縦に並べ、入力と処理がリポジトリにそろうと SVG を再生成できることを示す構造図

表 2:図の生成の部品と置き場所

部品役割描き直し前描き直し後
仕様 JSON入力手元の下書きだけリポジトリに 94 件
描画スクリプト処理リポジトリリポジトリ
SVG出力公開フォルダ同じ名前で上書き
記事本文参照リポジトリ変更なし

出力(SVG)だけを公開し、入力(仕様)を残していなかったことが、再生成を難しくしました。自動生成した図を後から描き直すには、出力の画像と一緒に、入力の仕様ファイルと描画スクリプトをリポジトリに残しておく必要があります。処理は残っていても、入力が無ければ同じ図は作れません。

つまずきやすい点:仕様が手元にしか無いと、対応づけに手間がかかる

ここからは、実際につまずいた点を 2 つ記録します。どちらも、出力だけを残していたことから起きました。

つまずいた点 1:仕様ファイルが手元の下書きにしか無かった

毎日の記事づくりでは、AI が仕様 JSON を一時的な下書きフォルダに書き、描いた SVG だけを記事と一緒に公開していました。そのため、公開済みの図の仕様は、手元の下書きフォルダにしか残っていませんでした。

描き直しでは、手元の下書きフォルダから仕様 104 件を集めました。下書きフォルダを消していたら、97 枚の図を一から作り直す必要があったと考えられます。

再発防止として、描き直しに使った仕様 94 件をリポジトリの次の場所に置きました。公開フォルダに置くと仕様がウェブに出てしまうため、公開しない素材のフォルダを選んでいます。

assets/charts/記事のスラッグ/figure-NN.chart.json

ただし、毎日の記事づくりは今も仕様を一時フォルダに書いています。そのため、新しく公開する記事の仕様はこの場所に増えません。公開する時に仕様も一緒に置く変更は、別の課題として扱っています。

つまずいた点 2:仕様と公開済みの図の対応が確かめられない図があった

仕様を集めても、「どの仕様がどの公開済みの図の元か」はすぐには分かりませんでした。下書きの中で手直しした図や、公開しなかった図が混ざっていると考えたためです。

そこで、古い描画スクリプトで仕様をもう一度描き、公開済みの SVG と中身を比べました。題名とすべての文字列が同じ図は、対応を確かめられたとしました。結果は表 3 のとおりです。

目盛りの数字だけが違う 2 枚は、仕様の値が公開済みの図と同じだったため、対応ありとして描き直しました。目盛りは値から描画スクリプトが計算して振る数字で、仕様には書かれていません。

表 3:公開済みのグラフ 97 枚の突き合わせの結果

突き合わせの結果枚数扱い
題名と文字列がすべて一致92描き直した
目盛りの数字だけが違う2描き直した
値や系列名が違う2描き直さず保留
仕様が見つからない1描き直さず保留
合計97描き直し 94

筆者が数え直すと、描き直せたのは 97 枚中 94 枚(96.9%)でした。値や系列名が違う 2 枚は、公開した後に仕様のほうが直されていたため、公開済みの図と中身が合いませんでした。仕様が見つからない 1 枚は、どの記事からも参照されていない余りの図でした。

集めた仕様 104 件のうち、描き直しに使ったのは 94 件で、使わなかった仕様は 10 件でした。10 件の内訳は、記録からは確かめられませんでした。中身を突き合わせて一致を確かめる前に描き直すと、値の違う図で公開済みの数字を上書きしてしまうおそれがあります。

検査の結果:不合格 94 件から 0 件へ

描き直した 94 枚は、記事の検査でスマホ向けの判定(図の font-size が viewBox の幅 ÷ 24 以上か)にかけ、不合格が 94 件から 0 件になりました。さらに Chrome で全部の文字の箱の位置を実測し、はみ出し 0 件・文字どうしの重なり 0 件・最小の font-size 20 を確かめました。ほかの検査も合わせて、テスト 405 件と、サイト全体 314 ページの組み立てが通っています。

表 4 は、描き直しの前と後の比較です。

表 4:描き直しの前と後

項目描き直し前描き直し後
viewBox の幅960480
font-size12〜1520 以上
画面上の文字3.65〜4.56px12.17px 以上
描き直した図の不合格94 件0 件

公開中の記事 81 本全体で見ると、図の文字の不合格は 213 件から 119 件に減りました。内訳は図 4 のとおりです。

公開中の記事 81 本で図の文字の検査に不合格だった件数を描き直しの前と後で比べた図。グラフは 96 件から 2 件に減り、手書きの図は 117 件のまま、合計は 213 件から 119 件

表 5:図の文字の検査の不合格(公開中の記事 81 本)

図の種類描き直し前描き直し後
グラフ96 件2 件
手書きの図117 件117 件
合計213 件119 件

残った 119 件のうち 117 件(98.3%)は、手書きの図です。手書きの図は描画スクリプトで描いた図ではないため、今回の描き直しの対象に入っていません。グラフの残り 2 件は、値が違うため保留した 2 枚と考えられます。

検査の決まりにも 1 つ判断がありました。最初はグラフを警告だけにし、手書きの図だけを不合格にする案がありました。

しかしそれでは、数値のグラフを手書きの図に置き換えて検査を通す道が残ります。そこで、グラフも手書きの図と同じ基準で不合格にしました。

自分のレポートに当てはめる時のチェック表

自動生成のグラフを配っている方が、同じ描き直しをする前に確かめたい点を表 6 にまとめました。手書きの SVG の図も、仕様ファイルの行以外は同じ考え方で点検できます。

表 6:描き直しの前のチェック表

確かめること見る場所理由
本文の幅スマホでの表示縮小率の分母になる
viewBox の幅SVG の先頭縮小率の分子になる
最小の font-sizeSVG の text12px に要る値と比べる
仕様ファイルの置き場所リポジトリ無いと再生成できない
本文の画像の参照記事の本文幅や高さの指定を探す
公開済みの図との一致古い描画の結果値の上書きを防ぐ

Google の画像検索は、img の src で参照された SVG も対象にし、画像の内容を伝える代替テキスト(alt)を手がかりに使います。ファイル名を変えずに描き直せば、alt と画像の参照はそのまま残ります。描き直しの時に図の内容が変わる場合だけ、alt も合わせて直すとよいでしょう。

同じように、AI の成果物を機械の検査で止める仕組みは、AI の成果物を人の確認なしで本番へ出すための 4 つの検査をまとめた記事でも扱っています。検査を手元で動かすか CI で動かすかは、CI と手元の検査の選び方を記録した記事で比べています。

まとめ

  • SVG グラフの画面上の文字は「本文の幅 ÷ viewBox の幅 × font-size」で決まります。本文の幅 292px なら、幅 480・font-size 20 で約 12px になり、幅 960 のままでは約 3.7〜4.6px でした
  • 公開済みの図は、ファイル名を変えずに中身だけを入れ替えれば、本文を書き換えずに描き直せます。ただし、仕様と公開済みの図の一致を確かめてから描き直します
  • 図を後から直せるように、出力の SVG だけでなく、入力の仕様ファイルと描画スクリプトをリポジトリに残します

自動生成のグラフやレポートの作り方、描き直しの段取りを相談したい方は、お問い合わせからご連絡ください。グラフの元になる集計を BigQuery の SQL で作っていて、読むデータ量や集計の単位が意図どおりかを第三者の目で確かめたい方は、BigQuery SQL レビューパックもご利用いただけます。

参考にした一次情報