matplotlib でイケてるグラフを書く

matplotlib でイケてるグラフ

株式会社キカガクで長期インターンをしている桑水流です!

本記事では皆さんが一度は願ったことのある「かっこいいグラフを書きたい … !!!」という願いをかなえるための内容になっています。

この記事を読むことで matplotlib 使った基本的なグラフの書き方から、かっこいい見た目のグラフを作成するための方法まで一から実際に手を動かして学ぶことができますのでぜひ最後まで読んでみてください。

matplotlib とは?

matplotlibは、Pythonでのデータ可視化のためのライブラリで、さまざまなグラフや図を描画するために使用されます。
そのためデータ分析において「わかりやすく視覚的にデータを表現したい!」といった際にとても便利なツールです。
自由自在にグラフを編集・表現することができるため、専門的なデータ分析だけでなく、仕事や学校生活、さらには日常においても役に立つこと間違いなしです。

では早速使い方を見ていきましょう。

今回は環境構築不要な Google Colab での使用方法を見ていきましょう。
Google Colab についてや使用方法は以下の記事を参考にしてください。1分程度の設定で準備できます。

matplotlib を使うための準備

まずは matplotlib を使えるようにインポートを行います。
(ローカル環境で使う際にはインストールが必要な場合があります。)

以下のコードをセルに貼り付けて実行しましょう。

matplotlib のインポート
import matplotlib.pyplot as plt

これだけで準備完了です!

Google Colab でグラフタイトルなどを日本語にしたい場合は、以下のライブラリをインストール並びにインポートする必要があります。
そのため日本語でグラフを作成したい人は併せて以下のコードを実行しておきましょう。

グラフの日本語化
#日本語化ライブラリのインストール
!pip install japanize-matplotlib

#ライブラリのインポート
import japanize_matplotlib
japanize_matplotlib.japanize()

matplotlib の基本的な使い方

では実際にグラフを書いていきましょう!

棒グラフ

棒グラフはカテゴリ間の値を比較するのに最適なグラフです。
年間の売り上げを比較したり、製品ごとの年間販売量を表示したりする際に最適です。

.bar() で描画できます。

棒グラフ
#仮のデータセットを作成
months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun"]
revenue = [500, 400, 600, 300, 800, 700] 

plt.bar(months, revenue)
plt.title("Monthly Revenue of Shop A (2021)")  
plt.ylabel("Revenue (thousand USD)")
plt.show()

折れ線グラフ

折れ線グラフは時系列データの推移を示す際のグラフとして適しています。
例えば、SNSサービスの利用者数の月次推移を表す場合などに最適です。

.plot() で描画できます。

折れ線グラフ
months = [1, 2, 3, 4, 5, 6]
users = [100, 200, 150, 300, 250, 400]   

plt.plot(months, users)
plt.title("Monthly Active Users of SNS Service A")
plt.xlabel("Month")
plt.ylabel("MAU (million)")
plt.show()

散布図

散布図は2つのデータの相関関係を示す際のグラフとして適しています。
例えば、自動車共有サービスの利用者の年齢と平均利用距離の関係を表す場合などに使用します。

.scatter() を使用することで描画できます。

散布図
ages = [18, 19, 21, 25, 26, 30, 32, 38, 45]
distance = [50, 40, 20, 30, 15, 60, 30, 10, 5]

plt.scatter(ages, distance)
plt.xlabel("User Age")  
plt.ylabel("Average Trip Distance (km)")
plt.show()

年齢の増加とともに移動距離が落ちているように見えますね!

円グラフ

全体に対する割合を示す際のグラフとして適しています。
例えば、会社の部署ごとの社員数の割合を表す場合などに用います。

.pie() で描画することができます。

円グラフ
dept = ["Sales", "Marketing", "Engineering", "Support"]
employees = [50, 30, 40, 20]

plt.pie(employees, labels=dept)
plt.title("Employees per department")
plt.show()

ヒストグラム

ヒストグラムはデータの分布を示す際のグラフとして適しています。
例えば、利用者の年齢分布を表す場合などに使用します。

.hist() で描画することができます。

ヒストグラム
ages = [28, 32, 19, 34, 42, 31, 25, 29, 35, 45, 22, 38, 40, 37, 41, 18, 27, 33, 26, 24]

plt.hist(ages, bins=10)
plt.title("Employees Age Distribution")
plt.xlabel("Age")
plt.ylabel("Frequency")
plt.show()

binsパラメータは、ヒストグラムのビン(箱)の数を指定するものです。
binsで指定した数だけ、値の範囲を等間隔に分割したビンが作成されます。
bins を大きくするとビンの幅が細かくなり、分布の形状を詳細に表すことができます。 逆に小さくするとゆがみが大きくなります。

bins = 10 の場合

bins = 8 の場合

データの特徴や知りたい情報に合わせて bins を調整するといいでしょう。

複数のグラフの組み合わせ

複数のグラフをまとめたい場合は .add_subplot() を使うと1つの図に複数のグラフをまとめることができます。

例えば、会社の部署別年齢構成(ヒストグラム)と男女比率(円グラフ)を一つの図にまとめて表示する場合についてみていきましょう。

.add_subplot() の引数は、(行数、列数、番号)となっており、この例では1行2列のレイアウトを使い、2列目の左(1)と右(2)にそれぞれグラフを配置しています。

複数のグラフの組合せ
# 図の作成 
fig = plt.figure()

# 部署A年齢構成
ages1 = np.random.normal(40, 5, 100) 
ax1 = fig.add_subplot(1, 2, 1) #(行数, 列数, 番号 : 左=1, 右 = 2)
ax1.hist(ages1, bins=20)
ax1.set_title("Department A")

# 部署A男女比  
labels2 = ["Men", "Women"]
data2 = [70, 30] 
ax2 = fig.add_subplot(1, 2, 2) #(行数, 列数, 番号 : 左=1, 右 = 2)
ax2.pie(data2, labels=labels2)
ax2.set_title("Department A")

plt.show()

Google Drive から File を読み込んでグラフを書く

Google Colab では Google Drive へアップロードしたファイルを読み込むことで自身のデータを使ったグラフを描画することができます。

Google Driveからファイルを読み込むには、まず Google Colab 環境に Google Drive をマウントする必要があります。

以下のコードを使用してマウントを行います。

Google Drive をマウント
from google.colab import drive
drive.mount('/content/drive')

次に、pandasライブラリを使用してデータファイルを読み込み、matplotlibを使用してデータを可視化します。

データの読み込みと描画
import pandas as pd
import matplotlib.pyplot as plt

# データの読み込み
file_path = '/content/drive/MyDrive/data.csv' # 読み込みたいデータのパスに置き換える
data = pd.read_csv(file_path) 

# グラフの描画
data.plot()
plt.show()

一歩先へ:かっこいいグラフの作り方

ここまで学んできた知識でグラフを書くことができるようになりましたが、まだ普通のグラフしか書くことができません。

そこでここからはさらにイケてるかっこいいグラフを書くための方法を学んでいきましょう。

以下の手順に沿ってグラフを編集することで自信を持って人に見せることができるグラフが作れるようになりますので是非マスターしましょう!

今回は sin 波 と cos 波、並びに合成波のデータを元にかっこいいグラフを作成していきます。

以下の一連の流れを通してグラフ編集の手順を学んでいきましょう。

  • 色を変更
  • 線の太さの変更
  • 軸ラベルの作成・編集
  • タイトルの作成
  • 凡例の編集

ベースとなるグラフの描画

まずは今回のベースとなるグラフを描画していきます。

ベースとなるグラフ
import matplotlib.pyplot as plt
import numpy as np

# サンプルデータの生成
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
y3 = np.sin(x) + np.cos(x)

# 基本的なグラフの描画
plt.plot(x, y1)
plt.plot(x, y2)
plt.plot(x, y3)
plt.show()

このままでも十分綺麗なグラフですが、ここで満足してはいけません。一歩先を目指していきます。

色を変更

まずはグラフの色を変更していきましょう。

グラフは比較をする際に用いられることが多いです。

そのため色分けが見やすさを分ける重要な因子となります。誰にでも見やすく、わかりやすいグラフを作ることであなたの伝えたいことをうまく伝えられるようにしましょう。

色の変更は color パラメータを指定することできます。今回はカラーコードで指定していきますが、他にも色の名前や色の頭文字で指定する方法もありますので詳しくはこちらのサイトなどを参考にしてください。

今回は落ち着いた色合いのグラフに変更しましょう。

こちらのサイトを参考にグラフの色を選びました。様々なサンプルが用意されており、完成したグラフのイメージがつきやすいのでぜひ参考にしてみてください!

色の変更
plt.plot(x, y1, color='#b7b7b7') 
plt.plot(x, y2, color='#4e83b0') 
plt.plot(x, y3, color='#1a5780') 
plt.show()

どうでしょうか?私が好きな青を基準にして色を変更してみました!笑

実際に発表の場で使う際には視認性など配慮すべき点が多数ありますので、調査のうえで適した色を使用しましょう

プロットの線の太さを変更

続いては線の太さを変更していきましょう。
線の太さは linewidth もしくは lw パラメータを指定することで変更できます。

まずは段階的に太くして見た目を確認していきます。

線の太さを変更
plt.plot(x, y1, color='#b7b7b7', lw=2)  
plt.plot(x, y2, color='#4e83b0', lw=4)  
plt.plot(x, y3, color='#1a5780', lw=8)  
plt.show()

それぞれ上のような見た目になります。
今回はlw=4 を採用しグラフを描画します。

lw=4 へ変更
plt.plot(x, y1, color='#b7b7b7', lw=4)  
plt.plot(x, y2, color='#4e83b0', lw=4)  
plt.plot(x, y3, color='#1a5780', lw=4)  
plt.show()

線がはっきりしたことで見やすいグラフになりました。

軸の見出しを変更

x 軸 y 軸それぞれが何を表しているのかをしっかり明記します。
軸の見出しを変更するには.xlabel() , .ylabel() を使用します。
フォントサイズを指定することでさらに見やすくすることができます。

軸の見出しを変更
plt.plot(x, y1, color='#b7b7b7', lw=4)
plt.plot(x, y2, color='#4e83b0', lw=4)
plt.plot(x, y3, color='#1a5780', lw=4)
plt.xlabel('Radians', fontsize=14)
plt.ylabel('Value', fontsize=14)
plt.show()

タイトルをつける

タイトルは一目で何を表しているかわかるようにつけます。

私は英語が苦手なので今回は ChatGPT にタイトルを考えてもらいました。

タイトルをつける
plt.plot(x, y1, color='#b7b7b7', lw=4)
plt.plot(x, y2, color='#4e83b0', lw=4)
plt.plot(x, y3, color='#1a5780', lw=4)
plt.xlabel('Radians', fontsize=14)
plt.ylabel('Value', fontsize=14)
plt.title('Sin, Cos and Composite Wave', fontsize=15)
plt.show()

ChatGPT さまさまですね!

凡例を表示する

最後にそれぞれのプロットが何を表すのか、凡例をつけて示します。

凡例の表示は.plot() メソッドの label パラメータで何を表しているかを指定し、.legend() で描画します。

凡例を表示
plt.plot(x, y1, color='#b7b7b7', lw=4, label='sin(x)') # label で表示を指定
plt.plot(x, y2, color='#4e83b0', lw=4, label='cos(x)')
plt.plot(x, y3, color='#1a5780', lw=4, label='sin(x) + cos(x)')
plt.xlabel('Radians', fontsize=14)
plt.ylabel('Value', fontsize=14)
plt.title('Sin, Cos and Composite Wave', fontsize=15)
plt.legend(fontsize=12) # 凡例を描画、フォントサイズを指定
plt.show()

凡例を表示することができました。

プロットと被らないようにするにはbbox_to_anchorlocパラメータを使用することで枠外に表示することができます。
詳しくはこちらのサイトが参考になりますので興味がある方は勉強してみてください。

凡例を枠外に表示
plt.plot(x, y1, color='#b7b7b7', lw=4, label='sin(x)') # label で表示を指定
plt.plot(x, y2, color='#4e83b0', lw=4, label='cos(x)')
plt.plot(x, y3, color='#1a5780', lw=4, label='sin(x) + cos(x)')
plt.xlabel('Radians', fontsize=14)
plt.ylabel('Value', fontsize=14)
plt.title('Sin, Cos and Composite Wave', fontsize=15)
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left', fontsize=12) # 枠外右上を指定して表示
plt.show()

ここまでがグラフ編集の一連のながれでした。
基本のグラフと比較すると、私の感性では「かっこいいイケてるグラフ」がつくれました!笑
ぜひ皆さんも色々と数値をいじって自分が思うイケてるかっこいいグラフを書いてみてください!

補足 : seaborn って何者?matplotlibとの違いは?

ここまでグラフの編集を行ってきましたが、中には「もっと簡単にできないの?」そう思っている方もいるのではないでしょうか?そんな方には seaborn がおすすめです。
seaborn とは matplotlib のグラフをより簡潔に美しく書くために作られたライブラリです。

今回はここまで書いてきたグラフに seaborn のスタイルを適用しておしゃれな見た目に変更してみます。

seaborn でグラフをプロット
import seaborn as sns # seaborn をインポート
import numpy as np
import matplotlib.pyplot as plt

# seabornでのプロットスタイルとカラーパレットの設定
sns.set(style='darkgrid') # デフォルト
sns.set_palette('winter_r') 

# サンプルデータの生成
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
y3 = np.sin(x) + np.cos(x)

# matplotlibでのプロット
plt.plot(x, y1, label='sin(x)')  # sin(x)のプロット
plt.plot(x, y2, label='cos(x)')  # cos(x)のプロット
plt.plot(x, y3, label='sin(x) + cos(x)')  # sin(x) + cos(x)のプロット

# タイトルとラベルの設定
plt.title('Sin, Cos and Composite Wave', fontsize=16)
plt.xlabel('x (radians)', fontsize=14)
plt.ylabel('Value', fontsize=14)

# 凡例の位置を右上の外側に設定
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left')

plt.show()

このように seaborn を使うと簡単に見た目を変更することができるので非常におすすめです。
さらに詳細な設定やスタイルの変更の仕方についてはこちらのサイトを参考に勉強してみてください。

matplotlib で書きたいグラフを書くために

ここまでの解説を見てもまだ「書きたいグラフが書けない」という方は、ぜひ ChatGPT を活用してください。
グラフの変更したい箇所を指定して質問すると、コード付きで答えてくれるので問題が解決して勉強にもなるので一石二鳥です。

エラーが出た際にはエラーをコピペして ChatGPT に投げると解決策を提案してくれます。それでもうまくいかない場合には公式ドキュメントを確認してみましょう。

まとめ

最後まで読んでいただきありがとうございました。
ここまで matplotlib でのグラフの書き方から見た目の変更、便利なツールについて学んできました。

たくさん紹介しましたが、書きたいグラフを書くには実際のデータを使って書いてみるのがいちばんの近道ですので、ぜひ自分のデータでチャレンジしてみてください。

データがない方は公開されているデータセットを使ってデータ解析をしてみるのも面白いと思います。
さらにデータ分析を学びたいという方はぜひキカガクの無料講座をお試しください!
わかりやすくためになると評判のコースを用意しています!

こちらの記事もオススメ

まずは無料で学びたい方・最速で学びたい方へ

まずは無料で学びたい方: Python&機械学習入門コースがおすすめ

Python&機械学習入門コース

AI・機械学習を学び始めるならまずはここから!経産省の Web サイトでも紹介されているわかりやすいと評判の Python&機械学習入門コースが無料で受けられます!
さらにステップアップした脱ブラックボックスコースや、IT パスポートをはじめとした資格取得を目指すコースもなんと無料です!

無料で学ぶ

最速で学びたい方:キカガクの長期コースがおすすめ

一生学び放題

続々と転職・キャリアアップに成功中!受講生ファーストのサポートが人気のポイントです!

AI・機械学習・データサイエンスといえばキカガク!
非常に需要が高まっている最先端スキルを「今のうちに」習得しませんか?

無料説明会を週 2 開催しています。毎月受講生の定員がございますので確認はお早めに!

説明会ではこんなことをお話します!
  • 国も企業も育成に力を入れている先端 IT 人材とは
  • キカガクの研修実績
  • 長期コースでの学び方、できるようになること
  • 料金・給付金について
  • 質疑応答