17. Matplotlibでグラフの描画

Matplotlib - 散布図(Scatter plot)の徹底解説 (単一・複数系列/3D、CSVからの描画と装飾(タイトル、ラベル、目盛線、凡例、マーカーのサイズ/色/種類/透明度))

更新日:

PythonのMatplotlibにおける散布図(Scatter plot)の作成方法を初心者向けに解説した記事です。通常の散布図だけではなく、色分けと凡例を用いた複数の系列データの表示方法、CSVファイルからデータを取得しての散布図の描き方や、3D表示の散布図の描き方などを解説しています。
 
またグラフの装飾方法については、タイトル、ラベル、目盛線、凡例、マーカーなどの使い方を解説していきます。

 

著書紹介(清水 義孝)

好評発売中!!

Matplotlibでの散布図(Scatter plot)の描画と装飾(タイトル、ラベル、目盛線、凡例、マーカー、色、透明度)

散布図では、データの広がりやまとまり具合を確認することができます。ここでは例として、ある月の15日間のアイスクリームの売上とその時の気温のデータを元にmatplotlibで散布図を作成し、気温と売上の関係を確認します。

In [1]: 
import numpy as np
import matplotlib.pyplot as plt
 
# データ準備
temp = np.array([28,32,35,33,27,24,30,38,33,
                      21,24,22,29,35,33]) # (1)温度の格納
sales = np.array([520,570,600,630,490,520,500,730,610,
                      440,420,450,560,620,500]) # (2)売上の格納
 
# グラフの装飾
plt.xlim(15.0, 40.0) # (3)x軸の表示範囲
plt.ylim(300, 750) # (4)y軸の表示範囲
plt.title("Ice Cream Sales vs Temparature",
                      fontsize=20) # (5)タイトル
plt.xlabel("Temparature (℃)", fontsize=20) # (6)x軸ラベル
plt.ylabel("Sales ($)", fontsize=20) # (7)y軸ラベル
plt.grid(True) # (8)目盛線の表示
plt.tick_params(labelsize = 12) # (9)目盛線のラベルサイズ
 
# グラフの描画
plt.scatter(temp, sales, s=50, c="b",
                      marker="D", alpha=0.5) #(10)散布図の描画
plt.show()

 

Out:

散布図の表示結果から、やはり気温が高い日の方が売上が上がっているようです。このようなデータを用いて、当日の気温から売れ行きもある程度、想定できそうですね。
 

それではプログラムの説明に入ります。

import numpy as np
import matplotlib.pyplot as plt

まず最初に必要なライブラリをimport文で読み込んでいます。NumPyを利用する為にnumpyをインポートします。その際に別名「np」を付けることにより、以降のプログラムでは「numpy」と記述しなくても「np」と記述することでNumPyを使うことができるようになります。また同様にMatplotlibを利用する為に、matplotlib.pyplotクラスをインポートし、別名として「plt」を付けています。
 

temp = np.array([28,32,35,33,27,24,30,38,33,21,24,22,29,35,33]) # (1)温度の格納

(1)では、日毎の温度が入っているndarray型のデータを変数tempに格納しています。
 

sales = np.array([520,570,600,630,490,520,500,730,610,440,420,450,560,620,500]) # (2)売上の格納

(2)では、日毎のアイスクリームの売上が入っているndarray型のデータを変数salesに格納しています。
 

plt.xlim(15.0, 40.0) # (3)x軸の表示範囲
plt.ylim(300, 750) # (4)y軸の表示範囲

(3)では、xlimを使いx軸の表示範囲を指定しています。引数は開始位置、終了位置になります。(4)も同様に、ylimを使いy軸の表示範囲を指定しています。
 

plt.title("Ice Cream Sales vs Temparature",
                      fontsize=20) # (5)タイトル

(5)では、titleでタイトル「Ice Cream Sales vs Temparature」を表示しています。また引数fontsizeでは、タイトルのフォントサイズを指定しています。
 

plt.xlabel("Temparature (℃)", fontsize=20) # (6)x軸ラベル
plt.ylabel("Sales ($)", fontsize=20) # (7)y軸ラベル

(6)では、xlabelでx軸ラベル「Temparature (℃)」を表示しています。またtitleと同様に、引数fontsizeでは、x軸ラベルのフォントサイズを指定しています。(7)も同様に、ylabelを使いy軸ラベルを表示しています。
 

plt.grid(True) # (8)目盛線の表示

(8)では、gridの引数でTrueを指定することにより、目盛線を表示しています。Falseを指定したり、gridを記述しなければ、目盛線は表示されません。
 

plt.tick_params(labelsize = 12) # (9)目盛線のラベルサイズ

(9)では、目盛線のラベルのフォントサイズを指定しています。
 

plt.scatter(temp, sales, s=50, c="b",marker="D", alpha=0.5) #(3)散布図の描画

(10)では、scatterに変数temp、salesを渡して散布図を描画しています。引数markerでは、データを元にプロットされている各点(マーカー)の形を指定します。ここでは、D(ダイヤモンド)を指定しています。

 
 

マーカーのサイズの変更

plt.scatter(temp, sales, s=50, c="b", marker="D", alpha=0.5) #(10)散布図の描画

(10)のplt.scatter(temp, sales, s=50, c="b", marker="D", alpha=0.5)でscatterに渡している引数sの数値を変えることで、マーカーのサイズを変更することができます。
 
 
例)マーカーのサイズ拡大: s=150を指定

 
例)マーカーのサイズ縮小: s=25を指定

 
 

マーカーの色の変更

plt.scatter(temp, sales, s=50, c="b", marker="D", alpha=0.5) #(10)散布図の描画

Markerの色の変更は、(10)のplt.scatter(temp, sales, s=50, c="b", marker="D", alpha=0.5)の引数cを変えることで実現できます。
 
引数cで指定できる主な色は以下です。

記号
b
k
r
g
y
w
cシアン
mマゼンダ

色はcolor = (0.0, 0.0, 1.0)のように、RGB それぞれのを色の要素を 0.0 ~ 1.0 のタプルで指定することも可能です。
 
例)マーカーの色を赤に指定: c="r"

 
例)マーカーの色を緑に指定: c="g"

 
例)マーカーの色をマゼンダに指定: c="m"

 
例)マーカーの色をシアンに指定: c="c"

 
例)マーカーの色をRGBで指定: c=(0.3, 0.2, 0.8)

 
 

マーカーの種類

plt.scatter(temp, sales, s=50, c="b", marker="D", alpha=0.5) #(10)散布図の描画

scatterへの引数markerを変更することで、マーカーの種類を変更することができます。Matplotlibの散布図で指定できる主なマーカーは以下になります。

Marker(マーカー)説明
.
o
*
h六角形
xx
Dダイヤモンド
s四角形

 
例)marker="."(点)を指定

 
例)marker="o"(円)を指定

 
例)marker="*"(星)を指定

 
例)marker="h"(六角形)を指定

 
例)marker="x"(x)を指定

 
例)marker="D"(ダイヤモンド)を指定

 
例)marker="s"(四角形)を指定

 
 

マーカーの透明度の指定

plt.scatter(temp, sales, s=50, c="b",marker="D", alpha=0.5) #(10)散布図の描画

またscatterの引数alphaでは、各点の透明度を指定します。0(透明)~1(不透明)までの値を指定します。
 
例)alpha=0.2(透明度大)を指定
色が薄くなりますが、マーカーの重なり具合が分かり易くなります。

 
例)alpha=0.9(ほぼ不透明)を指定

 
 

著書紹介(清水 義孝)

好評発売中!!

Matplotlibの散布図(Scatter plot)での色分け、凡例を用いた複数の系列データの表示

複数の系列のデータを元に散布図を描く場合、それぞれの点がどの系列のデータを示しているか色分けし、凡例を表示する必要があります。
 
次の例として、2017年と2018年の2年分の、ある月の15日間のアイスクリームの売上とその時の気温のデータを元にmatplotlibで散布図を作成してみましょう。その際に、2017年のデータと、2018年の複数の系列データを色分けして表示し、凡例を追加していきます。

In [2]:
import numpy as np
import matplotlib.pyplot as plt
 
temp1 = np.array([28,32,35,33,27,24,30,38,33,
                      21,24,22,29,35,33]) # (1)温度の格納
sales1 = np.array([520,570,600,630,490,520,500,730,610,
                      440,420,450,560,620,500]) # (2)売上の格納

temp2 = np.array([29,35,33,31,26,22,32,39,33,
                      23,20,20,27,32,34]) # (3)温度の格納
sales2 = np.array([540,590,630,640,490,550,540,740,650,
                      460,450,480,580,670,550]) # (4)売上の格納

# グラフの装飾
plt.xlim(15.0, 40.0) # x軸の表示範囲
plt.ylim(300, 750) # y軸の表示範囲
plt.title('Ice Cream Sales vs Temparature',
                      fontsize=20) # タイトル
plt.xlabel("Temparature (℃)", fontsize=20) # x軸ラベル
plt.ylabel("Sales ($)", fontsize=20) # y軸ラベル
plt.grid(True) # 目盛線の表示
plt.tick_params(labelsize = 12) # 目盛線のラベルサイズ

# グラフの描画
plt.scatter(temp1, sales1, s=50, c="b",
                      marker="D", alpha=0.3, label="2018") #(5)散布図の描画
plt.scatter(temp2, sales2, s=50, c="r",
                      marker="D", alpha=0.3, label="2017") #(6)散布図の描画
plt.legend(loc="upper left", fontsize=14) # (7)凡例表示
plt.show()

 

Out[2]:

表示された散布図から、全体の傾向として、同じ温度でも2017年の方が売上が上がっている日が多いことがわかります。2018年は何が悪かったのでしょうか。アイスクリームの味でしょうか、それとも、販売方法が悪かったのでしょうか。さらに別のデータを用いて分析を続けていく必要がありそうです。

 
プログラムを説明していきますと、

temp1 = np.array([28,32,35,33,27,24,30,38,33,21,24,22,29,35,33]) # (1)温度の格納
sales1 = np.array([520,570,600,630,490,520,500,730,610,440,420,450,560,620,500]) # (2)売上の格納

(1)(2)では、2018年の日毎の温度、売上を、それぞれ変数temp1、sales1に格納しています。
 

temp2 = np.array([29,35,33,31,26,22,32,39,33,23,20,20,27,32,34]) # (3)温度の格納
sales2 = np.array([540,590,630,640,490,550,540,740,650,460,450,480,580,670,550]) # (4)売上の格納

(3)(4)では、2017年の日毎の温度、売上を、それぞれ変数temp2、sales2に格納しています。
 

plt.scatter(temp1, sales1, s=50, c="b", marker="D", alpha=0.3, label="2018") #(5)散布図の描画

(5)では、scatterに変数temp1、sales1を渡して2018年分の散布図を描画しています。引数cで青色を指定しています。また (7)の凡例の表示に使えるよう、引数labelに"2018”を渡しています。
 

plt.scatter(temp2, sales2, s=50, c="r", marker="D", alpha=0.3, label="2017") #(6)散布図の描画

(6)では、scatterに変数temp2、sales2を渡して2017年分の散布図を引数c=”r”(赤色)で描画しています。引数labelに"2017”を渡しています。
 

plt.legend(loc="upper left", fontsize=14) # (7)凡例表示

(7)では、legendで凡例を表示しています。その時に表示されるラベルは(5)、(6)でlabelとして指定したものになります。引数fontsizeでラベルの文字サイズを指定します。また引数locでは凡例の表示位置を指定しており、次の位置を指定できます。

表示位置locの指定内容
右上upper right
右下lower right
左上upper left
左下lower left

 
 

著書紹介(清水 義孝)

好評発売中!!

CSVファイルを読み込み、Matplotlibで散布図(Scatter plot)の描画

前の例では、必要な売上や温度のデータは、NumPyのarrayに直接入力していましたが、実務では、これらのデータはCSVファイルなどのテキストファイルから読み込むことが多いです。今度の例では、CSVファイルから読み込んだデータを元に散布図を描いてみましょう。
 
ここでは日別のアイスクリームの売上を格納したCSVファイル「daily_ice_cream_sales.csv」(※csvファイルは上のリンクより取得下さい。)をPandasというライブラリを用いて読み込みます。
 
Pandasについては、この記事「Pandasでデータ分析(インストールから使い方まで)」をご参照ください。

またPandasを利用してのCSVファイルの読み込みの詳細については、この記事「Pandas Excel、CSVファイルの読み込み、書き込み(出力)」をご参照ください。
 
それではプログラムを見ていきます。まず初めにmatplotlib.pyplotに加えて、pandasをインポートします。

In [3]:
import matplotlib.pyplot as plt
import pandas as pd

 
 
次にread_csvでファイル「daily_ice_cream_sales.csv」を読み込み、df_salesにデータを格納します。

In [4]: df_sales=pd.read_csv("daily_ice_cream_sales.csv")

 
 
df_salesの内容を表示すると、次のように日別の温度(temp列)と売上(sales列)が表示されます。

In [5]: df_sales
Out[5]:

 
 
またdf_salesの内、temp列の内容を表示すると、次のように温度(temp列)の値が順に表示されます。

In [6]: df_sales["temp"]
Out[6]:

 
 
df_salesの内、sales列の内容を表示すると、次のように売上(sales列)の値が順に表示されます。

In [7]: df_sales["sales"]
Out[7]:

 
 
このようにして取得した温度のデータ df_sales["temp"] と、売上のデータ df_sales["sales"] を元に、次のようにして散布図を描きます。前回の例からは、赤マーカーの箇所しか違いはありません。ここでscatterの引数として、温度のデータ df_sales["temp"]と、売上のデータ df_sales["sales"]を設定しています。

In [8]:
 
# グラフの装飾
plt.xlim(15.0, 40.0) # x軸の表示範囲
plt.ylim(300, 750) # y軸の表示範囲
plt.title("Ice Cream Sales vs Temparature",
                  fontsize=20) # タイトル
plt.xlabel("Temparature (℃)", fontsize=20) # x軸ラベル
plt.ylabel("Sales ($)", fontsize=20) # y軸ラベル
plt.grid(True) # 目盛線の表示
plt.tick_params(labelsize = 12) # 目盛線のラベルサイズ
 
# グラフの描画
plt.scatter(df_sales["temp"], df_sales["sales"], s=50, c="b",
                  marker="D", alpha=0.5) #(3)散布図の描画
plt.show()
Out[8]:
散布図, CSVファイル

 
 

Matplotlibによる3Dでの散布図(Scatter plot)の描画

次の例として、アイスクリームの温度に加えて湿度も含めて売上との関係を可視化して行きたいケースを考えてみます。この場合、温度、湿度、売上の3つの軸で表現していく必要がありますので、今までの2次元のグラフでは表現しきれず、3Dで可視化していく必要があります。ここでは、3Dの散布図の描画方法について確認していきましょう。
 
まずは3Dグラフの描画に必要なAxes3Dをインポートします。

In [9]:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
In [10]:
temp = np.array([28,32,35,33,27,24,30,38,33,
                      21,24,22,29,35,33]) # (1)温度の格納
humidity = np.array([76,79,85,80,45,38,70,89,88,
                      41,44,52,95,86,40]) # (2)湿度の格納
sales = np.array([520,570,600,630,490,520,500,730,610,
                      440,420,450,560,620,500]) # (3)売上の格納

# グラフの描画 (4)
fig = plt.figure()
ax = Axes3D(fig)
ax.scatter(temp, humidity, sales,s=50, c="r",marker="o", alpha=0.5)

# グラフの装飾
ax.set_xlim(15.0, 40.0) # x軸の表示範囲
ax.set_ylim(100.0, 30.0) # y軸の表示範囲
ax.set_zlim(300, 750) # z軸の表示範囲
ax.set_title('Ice Cream Sales vs Temparature and Humidity',
                      fontsize=15) # タイトル
ax.set_xlabel("Temparature (℃)", fontsize=10) # x軸ラベル
ax.set_ylabel("Humidity (%)", fontsize=10) # y軸ラベル
ax.set_zlabel("Sales ($)", fontsize=10) # z軸ラベル
ax.view_init(30, 140) # 3Dの表示角度

Out[10]:
散布図, 3D

表示された3Dの散布図から、奥に行けば行くほど売上が高い傾向にあるようです。つまり、温度、湿度ともに高い方がアイスクリームの売上は伸びている傾向にあることがわかります。
 
 

著書紹介(清水 義孝)

好評発売中!!

Matplotlibの日本語対応

Matplotlibでは、標準では日本語対応がされておらず、散布図などのグラフのタイトルやラベルは英語でしか表記できません。日本語を無理に表示しようとすると、文字化けが発生し、「□□□」のような文字が表示されるだけで、正しく表示できません。
 
以下の記事では、Python初心者でも簡単にできる日本語対応の仕方を解説していきます。

 
 
 

Matplotlibで複数のグラフを並べて描画(散布図、折れ線グラフ、棒グラフ、円グラフなど)

複数の散布図を比較できるよう並べて表示したり、また散布図と折れ線グラフや棒グラフなど他のグラフと並べて表示する方法は、以下のリンクをご参照ください。

 
 
 
関連記事です。
折れ線グラフについても確認しましょう。
 
棒グラフ、積み上げ棒グラフの描き方については、こちらが参考になります。
 
円グラフの描き方については、こちらをご覧ください。

 

-17. Matplotlibでグラフの描画

Copyright© AI-interのPython3入門 , 2019 All Rights Reserved.