Tableauを使ってドット絵を書いてみた

# はじめに
　この記事は、フリュー Advent Calendar 2022 の11日目の記事となります。

　こんにちは。フリューでデータ分析業務に携わっている m_kazu_m です。
普段はTableauなどを使って日々データの可視化・分析業務をしています。

　今回は、本来数値をグラフや表などで表現するTableauで「ドット絵を書いてみる」ということをやってみようと思い（遊び心です）、絵が完成するまでの過程について紹介したいと思います。

## Tableauとは？
　記事のタイトルにもある「Tableau（タブロー）」は一般的にBIツールと呼ばれるものです。
BI（Business Interigense：ビジネス インテリジェンス）ツールとは、様々なデータを人が見て分かるようにグラフや表の形に可視化するためのツールです（ざっくり言うと）。
この記事を機に、BIツールについて興味を持ってもらえたりすると嬉しくなりますね。

## 絵を書く準備
　Tableauでドット絵を書くにあたって準備したものです。
* データ
    * Tableauに読み込ませるデータがいります。データの形式は何でもよいのですが、今回はお手軽にExcelを使うことにしました。
    * Excelに入れるデータ自体は自作します。詳しくは後述します。
* ドット絵の元にする画像
    * 画像がいります。常識の範囲で使えそうな画像を検索してGETしました（画像を作るところからはハードルが高いため・・）。

準備したものを使って以下の手順に沿って作業していきます。
1. 元の画像をドット絵に変換する
2. 変換したドット絵を「X, Y, VALE」の3列データに変換する
3. 変換した3列データをTableauに取り込む
4. イメージ通りに調整する

## 1. 元の画像をドット絵に変換する
　元の画像を手に入れました。12月っぽくクリスマスツリーを使うことにしました。
<img width="300" alt="クリスマスツリー" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959566/1bbbf571-7660-f136-a70c-45f0ddfb8f38.png">
これをドット絵に変換します。
どう〇つの森などでも自作アイコンをドットで作成することができたりと、最近では通常の画像をドット絵に変換してくれるサイトが豊富に存在するため、今回はそういったサイトを使わせてもらい画像をドット絵に変換しました。
（↓）元の画像をドット絵に変換したもの
<img width="300" alt="クリスマスツリー_ドット絵" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959566/6afc3d23-57c2-575f-aa2e-d4591388e135.jpeg">
このドット絵はExcel形式に変換されていて、拡大すると（↓）のようになっています。
（セルに数値が入っていて、数値ごとに配色されている）
<img width="700" alt="クリスマスツリー_ドット絵_拡大" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959566/a37a1489-38c3-849d-30ab-3eec452bb3ed.png">

## 2. 「X, Y, VALUE」の3列データに変換する
　次はTableauに読み込ませるための加工データを作ります。
先ほどのデータの状態だと、Tableauで読み込んでドット絵にするのは難しそうであるため、シンプルな形式のデータに変換したいと思います。
理想の形は
| 　X　 | 　Y　 | VALUE |
|:-:|:-:|:-:|
| 1  | 1  | 0  |
| 2  | 1  | 1  |
|  3 |  1 | 3  |
|  ： |  ： | ：  |

といった形です。それぞれは
* X
    * 横軸用の位置
* Y
    * 縦軸用の位置
* VALUE
    * XとYの位置にプロットする数値

といった意味を持つデータです。
Excelであれば、X・Y・VALUEの3列が簡単にできそうなため、加工データもExcelで作ってしまいます。

### 位置データ「X」「Y」の作成
　「X」と「Y」は、セルの位置を示す数値データです。

__例）__ `X -> 1, Y -> 1`の場合
X（横≒列）が1、Y（縦≒行）が1、つまりExcelのセル位置 `A1` 指すというイメージです。

まずはこの行列データを揃えます。
ドット絵に変換されたExcelを見ると、`117行とCR列`まで数値が入っていたため、XとYの値は
* X
    * CR列 -> 96列目 -> Xは96まで必要
* Y
    * 117行 -> Yは117まで必要

となります。作りたいデータのイメージは
| 　X　 | 　Y　 | VALUE |
|:-:|:-:|:-:|
| 1  | 1  | 0  |
| 2  | 1  | 1  |
|  3 |  1 | 3  |
|  ： |  ： | ：  |
|  94 |  117 | ：  |
|  95 |  117 | ：  |
|  96 |  117 | ：  |

となります。完成したら`11,232行（96 × 117）`になります。
地道に手作りしてもいいのですが（いやよくない・・）、今回はShell芸を使って作りました。
手っ取り早くできれば方法は何でも構いません。
```
#!/bin/sh

X_MAX=96
Y_MAX=117
X_CNT=1
Y_CNT=1

while [ ${Y_CNT} -le ${Y_MAX} ]
do
        while [ ${X_CNT} -le ${X_MAX} ]
        do
                echo "${X_CNT},${Y_CNT}"
                X_CNT=`expr ${X_CNT} + 1`
        done
        X_CNT=1
        Y_CNT=`expr ${Y_CNT} + 1`
done
```
こんな感じでXとYを指定回数分出力するShellスクリプトを作り、実行結果を保存します。
保存したファイルをExcelに挿入なりコピペします。
カンマ区切りで作成したので、Excelにコピペする際はテキストファイルウィザードで区切り文字をカンマにして貼り付けします。
結果は（↓）のようになります。
<img width="300" alt="データX-Y_上" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959566/0e162544-47e4-0447-d2c9-6e5972bcac74.png">
<img width="300" alt="データX-Y_下" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959566/c5c9fcc6-80d7-eedb-4a6b-1528f5ce3f7a.png">
これでXとYのデータが作成できました。

### プロットデータ「VALUE」の作成
　「VALUE」は、XとYが示すセル位置の数値を表すデータです。

__例）__ `X -> 1, Y -> 1`の場合
X（横≒列）が1、Y（縦≒行）が1、つまりExcelでいうセルの位置 `A1の値` 指すというイメージです。

地道に「1の1は0、2の1は1、3の1は0・・・」みたいに1万行以上あるVALUEを手入力するのは現実的ではないため、Excelの数式を使ってサクッとVALUEを入れます。

1で作成したドット絵に変換したデータのあるシートは【ドット絵イメージ】という名前にしてあります。
VALUEの値を入れたいC2セルに以下の数式を入力します
```
=INDIRECT(ADDRESS(B2,A2,4,1,"ドット絵イメージ"),1)
```
入力した数式は
**【ドット絵イメージ】シートのA1セルの値をとってきてくれる** というものです（ざっくり言うと）。
今回は関数などの詳しい説明は割愛させて頂きますm(_ _)m
これを11,232行分にコピペします。これで簡単にデータができます。
<img width="600" alt="データVALUE_上" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959566/f1c4991e-1355-48da-5821-f0805ac047f7.png">
<img width="600" alt="データVALUE_下" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959566/de47be02-145e-a6c4-dfb9-37644b742a71.png">

## 3. 作成したデータをTableauに取り込む
　2で作成したデータをTableauに取り込みます。ここからはTableauDesktopを使った解説になります。
データソースにExcelを指定して、X,Y,VALUEを準備したシートを選択してデータを取り込みます。
（↓）取り込み後の状態。
<img width="300" alt="Tableau_データ取り込み後" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959566/a9b1ff23-7a8a-67ad-f607-c827a36297a9.png">
次に「X」と「Y」は軸で使用したいため、メジャーにある「X」と「Y」をディメンションに変換します。
　※X・Yをドラッグ＆ドロップでディメンションに移動
<img width="300" alt="Tableau_XYをディメンションに変換" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959566/c5847441-ab46-83b1-e0fa-f08e21e90a5c.png">
「X」を列「Y」を行に入れてぞれぞれ **連続** にします。
「VALUE」を値に入れて **不連続** にして **表示タイプを色** にします。
すると（↓）こんな感じになりました。
<img width="700" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959566/f20227b9-815f-38c0-7c5d-ba6ce4bca054.png">
それっぽい感じになりました。
けど、ひっくり返って反対向きになっていますね、これは予想と違います。
よくよく考えると、
* Excelでは `X:1,Y:1` が **左上**
* Tableauでは `X:1,Y:1` が **左下**

という違いがあることを忘れていました。けれど「Y」の軸を逆にしたら解決しそうなので、やってみます。

「Y」の軸を右クリックして、スケールの反転のチェックボックスを入れます。
<img width="500" alt="Tableau_軸の反転" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959566/dde3e41b-6279-3d37-14f6-4904cf9f4865.png">
できました。だいたいイメージ通りです。あとは細かい調整をしたらよくなりそうに思います。
<img width="700" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959566/628274f5-8a98-bc6a-747b-ad670472c140.png">

## 4. イメージ通りに調整する
　3で作成したTableauのグラフを完成イメージに合わせて調整していきます。
調整作業としては
* 形状の選択
    * グラフのタイプを形状にして、形状のタイプを選ぶ。
        * 形状：丸タイプの塗りつぶしを選択
* 配色
    * VALUEのデフォルト配色を完成イメージの配色にする（個人的主観による色の割り当てです）。
        * 0：白
        * 1：黄色
        * 2：肌色
        * 3：茶色
        * 4：緑（5とほぼ同じ）
        * 5：緑（4とほぼ同じ）
        * 6：赤
        * 7：白
        * 8：緑（やや明るめ）
        * 9：緑（8より明るめ）
        * 10：水色
        * 11：茶色（3よりやや薄い）
        * 12：青
        * 13：水色（10より濃いめ）
        * 14：ピンク
* サイズ調整
    * ダッシュボードに配置して縦横のサイズを調整する。
        * 幅：600
        * 高さ：700

（↓）各調整後の完成物です。ちょいちょい配色が違うところもありますが、できました。
<img width="600" alt="Tableau_完成" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959566/8a4a1ddd-37e9-7764-e51c-c7480709ae0f.png">

さて、最後に完成したものを実際の画像と見比べてみます。
| もとの画像 | Tableauで作ったドット絵 |
|:-:|:-:|
| <img width="300" alt="クリスマスツリー" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959566/1bbbf571-7660-f136-a70c-45f0ddfb8f38.png">  | <img width="300" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959566/82d646f3-78c3-abad-2fab-377384f7c47c.png">  |

色の違い以外はいい感じにできてそうに思います。
配色をもう少し正確にすればかなり本物に近づけそうですね。


## 最後に
　今回は、普段はグラフなどを作る目的で使っているTableauで絵を書いてみるということにチャレンジしてみました。
　データさえあればこういうことも出来るんだな思いました。応用していくとアニメーション的なこともできるのではないか？と思ったりしています。
これからもTableauに関連する記事を書いていこうと思いますので、今後ともよろしくお願いいたします。

## 使用したもの
* TableauDesktop（Windows版）バージョン：2022.1.5
* Microsoft Excel
* Shellスクリプト