掛け算を覚える九九（くく）を視覚化するポスターをmatplotlibで作成

「九九」（くく）ってありますよね。日本で子供たちが掛け算を覚える時のやつです。

「いんいちがいち、いんにがに、いんさんがさん、」ってやつです。

掛け算を覚えるのに九九は便利なのですが、「語呂だけ覚えてもダメだ。掛け算の意味を理解しないと。」という意見を耳にしたので、掛け算の意味もあわせて理解できるポスターを Python の matplotlib で作ってみました。コーディングに要した時間は約３０分。

# 日本語対応 matploblib のインストールとインポート


```Python
!pip install japanize-matplotlib
```

    Collecting japanize-matplotlib
    [?25l  Downloading https://files.pythonhosted.org/packages/aa/85/08a4b7fe8987582d99d9bb7ad0ff1ec75439359a7f9690a0dbf2dbf98b15/japanize-matplotlib-1.1.3.tar.gz (4.1MB)
    [K     |████████████████████████████████| 4.1MB 5.5MB/s 
    [?25hRequirement already satisfied: matplotlib in /usr/local/lib/python3.6/dist-packages (from japanize-matplotlib) (3.2.2)
    Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.6/dist-packages (from matplotlib->japanize-matplotlib) (1.3.1)
    Requirement already satisfied: python-dateutil>=2.1 in /usr/local/lib/python3.6/dist-packages (from matplotlib->japanize-matplotlib) (2.8.1)
    Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.6/dist-packages (from matplotlib->japanize-matplotlib) (0.10.0)
    Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.6/dist-packages (from matplotlib->japanize-matplotlib) (2.4.7)
    Requirement already satisfied: numpy>=1.11 in /usr/local/lib/python3.6/dist-packages (from matplotlib->japanize-matplotlib) (1.19.5)
    Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.6/dist-packages (from python-dateutil>=2.1->matplotlib->japanize-matplotlib) (1.15.0)
    Building wheels for collected packages: japanize-matplotlib
      Building wheel for japanize-matplotlib (setup.py) ... [?25l[?25hdone
      Created wheel for japanize-matplotlib: filename=japanize_matplotlib-1.1.3-cp36-none-any.whl size=4120276 sha256=642a1577ef5e695d7ef7a5fc14e07ad45d62ab853ca64da221873f69938f3e6c
      Stored in directory: /root/.cache/pip/wheels/b7/d9/a2/f907d50b32a2d2008ce5d691d30fb6569c2c93eefcfde55202
    Successfully built japanize-matplotlib
    Installing collected packages: japanize-matplotlib
    Successfully installed japanize-matplotlib-1.1.3



```Python
import matplotlib.pyplot as plt
import japanize_matplotlib 
```

# 九九のポスターの描画


```Python
fig, axes = plt.subplots(nrows=9, ncols=9, figsize=(16, 16))
for x in range(9):
    for y in range(9):
        axes[y][x].axis("off")
        axes[y][x].set_aspect("equal")
        axes[y][x].set_title("{} x {} = {}".format(x + 1, y + 1, (x + 1) * (y + 1)))
        axes[y][x].set_xlim([0, 11])
        axes[y][x].set_ylim([0, 11])
        X = []
        Y = []
        for i in range(x + 1):
            for j in range(y + 1):
                X.append(i + 2)
                Y.append(10 - j - 1)
        axes[y][x].scatter(X, Y)

plt.savefig("300_dpi_scatter.png", format="png", dpi=300)
```


![300_dpi_scatter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211162/5a0f32c8-691c-df5d-fa78-dc2df9ed078a.png)


# 掛け算の順番？

さて、掛け算の順番を気にする先生たちがTwitterなどで話題になっているようですが、これについては何か言われるんでしょうかね？

# ネズミバージョン

うちの子たちはネズミさんたちが大好きなので、ネズミバージョンも作ってみました。


```Python
fig, axes = plt.subplots(nrows=9, ncols=9, figsize=(28, 28))
for x in range(9):
    for y in range(9):
        axes[y][x].axis("off")
        axes[y][x].set_aspect("equal")
        axes[y][x].set_title("{} x {} = {}".format(x + 1, y + 1, (x + 1) * (y + 1)), fontsize=20)
        axes[y][x].set_xlim([-1, 11])
        axes[y][x].set_ylim([-1, 11])
        X = []
        Y = []
        for i in range(x + 1):
            for j in range(y + 1):
                X.append(i + 2)
                Y.append(10 - j - 1)
        if (x + 1) * (y + 1) % 2 == 1:
            c = 'k'
        else:
            c = 'r'
        axes[y][x].scatter(X, Y, c=c, s=28, marker='o')
        axes[y][x].scatter([xx + 0.25 for xx in X], [yy + 0.25 for yy in Y], c=c, s=12, marker='o')
        axes[y][x].scatter([xx - 0.25 for xx in X], [yy + 0.25 for yy in Y], c=c, s=12, marker='o')

plt.savefig("300_dpi_scatter.png", format="png", dpi=300)
```


![300_dpi_scatter (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211162/f403e9fd-6f07-62da-4427-d4fd13d4e7cf.png)


掛け算の結果が奇数なら黒、偶数なら赤にしてみたよ。ハハッ♪