オタフ☆クラブ

Pythonでお洒落なグラフを描画!3Dやアニメーションによる可視化の基本

Pythonでお洒落なグラフを描画!3Dやアニメーションによる可視化の基本

こんにちは、オタフクラブのクロちゃんです。

突然ですが、何かの資料を読んだときに「この資料わかりにくぅ、文字ばっかりで意味わからへん、センスなさスギィ」と思った経験はないでしょうか(きっとありますよね^^)。

私が所属しているオタフクラブのモットーはイマジネーション&クリエイティビティ。文字だらけのダッサい資料を用意しようもんなら、「ニューロンが磨き足りてない」と一蹴されてしまいます。

そう、そんなときに必要なのが図(イラスト・グラフ)です。

「百聞は一見に如かず」という言葉があるように、つらつら時間をかけて文章を聞く、もしくは読むなんかより、ナイスな図(イラスト・グラフ)を一目見るほうが伝わったりするもんです。

かの有名なスティーブ・ジョブズのプレゼンも、スライド1枚のなかに大きな図(イラスト・グラフ)と必要最低限のテキストで構成されていますよね。できるビジネスパーソンは多くを語らず。図(イラスト・グラフ)で魅せましょう。

ということで今回はpythonでかっこいいグラフを作る方法を紹介します。

クロちゃん
クロちゃん

いかにもエクセルで作った感まるだしグラフを卒業しましょう。

pythonでかっこいいグラフを作るならplotly

データの可視化といっても多種多様な方法があり、有名なところではエクセルのグラフ機能がみなさまにも馴染みが深いかもしれません。

ですが、今回ご紹介するツールはplotlyhttps://plot.ly/python/)というものです。

このplotlyを使うことでおしゃれでインタラクティブな(画面上でグリグリ動かせる)グラフを作ることができます。

他にも、かっこいい3D(3次元)グラフやアニメーション付きのグラフまでも作ることができ、とっても素晴らしいツールです。

クロちゃん
クロちゃん

plotlyはいくつかのプログラミング言語をサポートしていますが、今回はpythonを使います。

それではさっそく作成していきましょう。

折れ線グラフ

まずは都道府県毎の月別平均気温を例にして、シンプルな折れ線グラフ(ラインチャート)を作成してみましょう。データは総務省統計局のサイト(https://www.stat.go.jp/data/nihon/01.html)から主要都市だけ抜粋し、下表のような構成のCSVファイル(temperature.csv)を用意しました。

札幌 東京 名古屋 ・・・
1月 -3.6 5.2 4.2 ・・・
2月 -3.1 5.7 5.2 ・・・

12月 -0.9 7.6 7.0 ・・・

ソースコードはこちら。

import pandas as pd
import plotly
import plotly.graph_objs as go

temp_df = pd.read_csv('temperature.csv', index_col=0)

data = [
    go.Scatter(x=df.index, y=df['札幌'], name='Sapporo'),
    go.Scatter(x=df.index, y=df['東京'], name='Tokyo'),
    go.Scatter(x=df.index, y=df['名古屋'], name='Nagoya'),
    go.Scatter(x=df.index, y=df['大阪'], name='Osaka'),
    go.Scatter(x=df.index, y=df['福岡'], name='Fukuoka'),
    go.Scatter(x=df.index, y=df['那覇'], name='Naha'),
]

layout = go.Layout(
    title='plotly example',
    xaxis={'title': 'Month'},
    yaxis={'title': 'Temperature'},
    font={'size': 18},
    width=800,
    height=400
)

fig = go.Figure(data=data, layout=layout)
plotly.offline.plot(fig)

実行するとブラウザが立ち上がり、グラフが表示されます。下図のように作成した後に拡大したり、一部のデータを非表示にすることもできます。

グラフ

このグラフ、おしゃれでかっこいいですよね!

※グラフがうまく表示されない方はこちらからご覧ください

複合グラフ

さきほど作成した折れ線グラフに降水量のデータを追加して、2軸の複合グラフを作成してみましょう。データは同じく総務省統計局のサイト(https://www.stat.go.jp/data/nihon/01.html)から大阪の降水量データを抜粋し、下表のような構成のCSVファイル(rain.csv)を用意しました。

 

大阪
1月 45
2月 62




12月 44

月別降水量は気温と異なるデータなので棒グラフ(バーチャート)で追加します。

ソースコードはこちら。

temp_df = pd.read_csv('temperature.csv', index_col=0)
rain_df = pd.read_csv('rain.csv', index_col=0)

data = [
    go.Bar(x=rain_df.index, y=rain_df['大阪'], name='Rainfall', yaxis='y1', marker={'color': 'pink'}),
    go.Scatter(x=temp_df.index, y=temp_df['大阪'], name='Temperature', yaxis='y2', line_color='indigo'),
]

layout = go.Layout(
    title='plotly example',
    xaxis={'title': 'Month'},
    yaxis1={'title': 'Rainfall', 'showgrid': False},
    yaxis2={'title': 'Temperature', 'side': 'right', 'overlaying': 'y', 'showgrid': False},
    font={'size': 14},
    width=800,
    height=400,
    showlegend=False
)

fig = go.Figure(data=data, layout=layout)
plotly.offline.plot(fig)

うまく実行できると、下図のようなグラフが表示されます。

複合グラフ

サンプルのため、いくつかオプションを変更しましたが他にも変更できる項目がたくさんあります。他のオプションを変更したい場合は公式ページのドキュメントを参照してみてください。(https://plot.ly/python/

発展編 3D(3次元)グラフ

plotlyでは3D(3次元)グラフも作成することができます。今回のデータはCSVファイルから読み込むのではなく、pythonの数値計算用モジュールであるnumpyを使って生成してみましょう。

ソースコードはこちら

import math
import numpy as np

x = np.linspace(-2*math.pi, 2*math.pi, 100)
y = np.linspace(-2*math.pi, 2*math.pi, 100)

xx, yy = np.meshgrid(x, y)
z = (np.sin(xx)) + (np.cos(yy))

data = [
    go.Surface(
        x=x,
        y=y,
        z=z,
    )
]

layout = go.Layout(
    title='plotly example’,
    scene={
        'xaxis': {'title': 'X'},
        'yaxis': {'title': 'Y'},
        'zaxis': {'title': 'Z'}
    },
    font={'size': 14}
)

fig = go.Figure(data=data, layout=layout)
plotly.offline.plot(fig)

実行すると3次元空間にz = sin(x) + cos(y)が表す曲面が作成されます。

3次元グラフ

その他の3D(3次元)グラフのサンプルはこちら(https://plot.ly/python/3d-surface-plots/)を参照してみてください。

発展編 アニメーションを追加

plotlyではグラフにアニメーションを追加することも可能です。日本の年齢別人口の推移(男性)をアニメーションで表示してみます。

データはこちらの国立社会保障・人口問題研究所から(http://www.ipss.go.jp/site-ad/TopPageData/PopPyramid2017_J.html)男性の人口情報を抜粋し、下表のような構成のCSVファイル(male.csv)を用意しました。

1965 1970 ・・・
0歳 890 964 ・・・
1歳 846 955 ・・・








100歳 0 0 ・・・

ソースコードはこちら。

male_df = pd.read_csv('male.csv', index_col=0)

data = [
    go.Bar(x=male_df.index, y=male_df['1965'])
]

layout = go.Layout(
    title='plotly example',
    xaxis={'title': 'Age'},
    yaxis={'title': 'Population', 'showgrid': False},
    font={'size': 10},
    width=800,
    height=400,
    showlegend=False
)

frames = [go.Frame(data=[go.Bar(x=male_df.index, y=male_df[year])]) for year in male_df.columns]

fig = go.Figure(data=data, layout=layout, frames=frames)
plotly.offline.plot(fig)

実行すると、下図のようなアニメーション付きのグラフが表示されます。

アニメーションつきグラフ

人口減少、少子高齢化が進行していく様子がみてとれます。

その他のアニメーション付きグラフのサンプルはこちら(https://plot.ly/python/animations/)を参照してみてください。

まとめ

さて、今回はpythonでのグラフ作成ツールとしてplotlyを紹介してきました。

plotlyを使うことでおしゃれにデータを視覚化できることがわかりましたよね。慣れてくると本記事でご紹介したような3D(3次元)グラフやアニメーション付きグラフも自由自在にさくっと作成できますよ。

図(イラスト・グラフ)がスタイリッシュだと、資料の見栄えも変わり印象が良くなりやすいので、あなたに対する周りからの見方が変わったり⁉︎するなど何かハッピーなことが起きるかもしれません。

ぜひplotlyを使って、pythonでのグラフ作成を試してみてくださいね。

燃やせ探究心!突き詰めろ美しきソースコード!オタフ☆クラブ

コメントをどうぞ

  1. 通りがかり より:

    △ python
    ○ Python

    △ plotly
    ○ Plotly

    △ numpy
    ○ NumPy

    です。

トップへ戻る
タイトルとURLをコピーしました