Pythonプログラミング：Qiita記事のタグからTreemapを描画してみた

# はじめに

前回の記事([Qiita記事のタグからWordCloudを描画してみた](https://qiita.com/Blaster36/items/5ab0f5a4e6a96d5960bc))では、Qiita記事に付与されたタグを取得し、WordCloudを作りました。

今回は見せ方を変えて、[Treemap](https://en.wikipedia.org/wiki/Treemapping)を描画します。

最終的に、以下のようなモノを作ります。
![trends_of_qiita_treemap_shortver2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685193/5a7522c8-9d91-f36e-7d43-251e0e204eb6.png)


## 本稿で紹介すること

- Qiita APIからの記事情報の取得
- Treemapの描画

[Qiita API v2ドキュメント](https://qiita.com/api/v2/docs)
[TREEMAP - The Python Graph Gallery](https://python-graph-gallery.com/treemap/)

## 本稿で紹介しないこと

- Pythonライブラリの使い方
  - requests
  - json
  - collections
  - pathlib
  - matplotlib
  - squarify ※Treemap描画用のPythonライブラリ

# サンプルコード

Code量も多くないので、全体のCodeを紹介。
ポイントは3つ。

##### 1. GETリクエストを実行する際、アクセストークンを指定
[Qiita API v2ドキュメント](https://qiita.com/api/v2/docs)に以下の記載があるように、アクセストークンを取得し、Codeに埋め込むのがベター。
>利用制限
認証している状態ではユーザごとに1時間に1000回まで、認証していない状態ではIPアドレスごとに1時間に60回までリクエストを受け付けます。

##### 2. イメージを描画する際、日本語対応フォントを指定
[Text properties and layout - Matplotlib 3.3.0 documentation](https://matplotlib.org/tutorials/text/text_props.html#default-font)に以下の項があるように、日本語対応フォントを（適宜インストールして）指定するのがベター。
>Default Font
The base default font is controlled by a set of rcParams. To set the font for mathematical expressions, use the rcParams beginning with mathtext (see mathtext).

##### 3. 出現頻度の低い（話題性とか重要性とかの小さい）タグを前処理で除外
前回の記事([Qiita記事のタグからWordCloudを描画してみた](https://qiita.com/Blaster36/items/5ab0f5a4e6a96d5960bc))では、Qiita記事に付与されたタグの出現頻度を鑑みず描画しました。
そのため、極端な話、出現頻度が1回のタグも描画することになり、描画結果がごちゃごちゃした感じになっていました。
（全体を俯瞰するという観点では、出現頻度の低いタグも把握できて良いのですが。）

そこで、今回は出現頻度の低いタグを切り捨てて、スッキリした描画を目指します。

まずは、[#200 Basic Treemap with python](https://python-graph-gallery.com/200-basic-treemap-with-python/)のサンプルコードを参考にシンプルに描画。

```python:analyzeQiita_TreeMap1
import requests
import json

url = 'https://qiita.com/api/v2/items?per_page=100&page='
headers = {'Authorization': 'Bearer ${YOUR ACCESS-TOKEN}'}

tags = []
for i in range(5):
    print('=====')
    print('Downloading ... ' + url + str(i+1))
    print('-----')
    #response = requests.get(url + str(i+1))
    response = requests.get(url + str(i+1), headers=headers)

    for article in json.loads(response.text):
        print(article['title'])
        tags.extend([tag['name'].lower() for tag in article['tags']])
    print('=====')

from collections import Counter

c = Counter(tags)
#print(c)

# 出現回数が多いものから順にTop10を列挙（重複なし）
tagSurface, tagCount = zip(*c.most_common(10))
print(tagSurface)
print(tagCount)

from pathlib import Path
import matplotlib.pyplot as plt
import squarify

result_dir_path = Path('..').joinpath('result')
plt.rcParams["font.family"] = 'Yu Gothic'
squarify.plot(sizes=list(tagCount), label=list(tagSurface), alpha=0.7)
plt.axis('off')
plt.savefig(result_dir_path.joinpath('trends_of_qiita_treemap1.png'), format="png", dpi=300)
plt.show()
```
![trends_of_qiita_treemap_shortver1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685193/cd71f7bd-0681-ff43-c56e-8186c201e4b3.png)

次に、[#202 Treemap with colors mapped on values](https://python-graph-gallery.com/202-treemap-with-colors-mapped-on-values/)のサンプルコードを参考に青系のグラデーションで描画。

```python:analyzeQiita_TreeMap2
from pathlib import Path
import matplotlib
import matplotlib.pyplot as plt
import squarify

cmap = matplotlib.cm.Blues
mini = min(tagCount)
maxi = max(tagCount)
norm = matplotlib.colors.Normalize(vmin=mini, vmax=maxi)
colors = [cmap(norm(value)) for value in tagCount]

result_dir_path = Path('..').joinpath('result')
plt.rcParams["font.family"] = 'Yu Gothic'
squarify.plot(sizes=list(tagCount), label=list(tagSurface), alpha=0.7, color=colors)
plt.axis('off')
plt.savefig(result_dir_path.joinpath('trends_of_qiita_treemap2.png'), format="png", dpi=300)
plt.show()
```
![trends_of_qiita_treemap_shortver2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685193/5a7522c8-9d91-f36e-7d43-251e0e204eb6.png)

やはりPythonとJavaScriptが大きく描画されるのは前回([Qiita記事のタグからWordCloudを描画してみた](https://qiita.com/Blaster36/items/5ab0f5a4e6a96d5960bc))と変わらず。

# まとめ
Qiita記事のタグを使って、Treemapを描画する方法を紹介。