スポンサーリンク

Python初心者でも簡単!matplotlibを使ったカラーバーつき散布図の描き方を徹底解説

2023年3月17日

 Pythonでデータ処理を行った結果を簡単にグラフに出力したいと思ったことはありませんか?

 この記事では、初心者の方向けに、Pythonのmatplotlibパッケージを使ってカラーバー付きの散布図を簡単に描く方法を最新の情報をもとに丁寧に解説していきます。カラーバーについては、対数目盛カラーバーについても解説しています。

 ワンステップずつコードを解説しているのでどなたでもPythonで散布図が描けるようになります!

 是非、この機会にmatplotlibパッケージを使った散布図にトライしてみましょう。



対数目盛カラーバーつきの散布図を描く方法をすぐにご覧になりたい方はこちらこちらをクリック。



準備

 Pythonの実行環境の構築やmatplotlibパッケージのインストールがまだの方は以下の記事を参考にしてPythonの実行環境の構築とmatplotlibパッケージのインストールを済ませてください。

カラーバー付き散布図

 カラーバー付き散布図の描き方を解説していきます。

全体のコード

 上記グラフを作成するためのコードは以下になります。

 ここでは、2つのデータ系列を持つ散布図をカラーバー付きで描画しています。次節以降で、以下のコードをワンステップずつ解説していきます。

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt

# データを用意する。
x1 = np.random.normal(loc=0, scale=1.8, size=300)
y1 = np.random.normal(loc=0, scale=1.8, size=300)
z1 = np.random.random(300) * 1
x2 = np.random.normal(loc=0, scale=1.1, size=300)
y2 = np.random.normal(loc=0, scale=1.1, size=300)
z2 = np.random.random(300) * 10

# Figureを作成する。
fig = plt.figure(constrained_layout=True)
# Axesを作成する。
ax = fig.add_subplot(111)

# Figureの解像度と色を設定する。
fig.set_dpi(130)
fig.set_facecolor("whitesmoke")

# Axesのタイトルと色を設定する。
ax.set_title("Sample")
ax.set_facecolor("whitesmoke")

# x軸とy軸のラベルを設定する。
ax.set_xlabel("x")
ax.set_ylabel("y")

# x軸の範囲を設定する。
ax.set_xlim(-5, 5)
# x軸の目盛の位置とラベルを設定する。
ax.xaxis.set_major_locator(mpl.ticker.MultipleLocator(1))
ax.xaxis.set_major_formatter(mpl.ticker.StrMethodFormatter("{x:.0f}"))

# y軸の範囲を設定する。
ax.set_ylim(-5, 5)
# y軸の目盛の位置とラベルを設定する。
ax.yaxis.set_major_locator(mpl.ticker.MultipleLocator(1))
ax.yaxis.set_major_formatter(mpl.ticker.StrMethodFormatter("{x:.0f}"))

# グリッドを表示する。
ax.set_axisbelow(True)
ax.grid()

# データを描画する。
mp1 = ax.scatter(x1, y1, s=10+z1*70, c=z1, marker="o", cmap="Blues", alpha=0.8, vmin=0, vmax=1, label="data series 1")
mp2 = ax.scatter(x2, y2, s=10+z2*7, c=z2, marker="s", cmap="Reds", alpha=0.8, vmin=0, vmax=10, label="data series 2")

# 第1系列のカラーバーを設定する。
cbar1 = plt.colorbar(mp1, aspect=30)
cbar1.ax.set_ylim(0, 1)
cbar1.ax.yaxis.set_major_locator(mpl.ticker.MultipleLocator(.1))
cbar1.ax.yaxis.set_major_formatter(mpl.ticker.StrMethodFormatter("{x:.1f}"))
cbar1.set_label("z", loc="center")

# 第2系列のカラーバーを設定する。
cbar2 = plt.colorbar(mp2, aspect=30)
cbar2.ax.set_ylim(0, 10)
cbar2.ax.yaxis.set_major_locator(mpl.ticker.MultipleLocator(1))
cbar2.ax.yaxis.set_major_formatter(mpl.ticker.StrMethodFormatter("{x:.0f}"))
cbar2.set_label("z", loc="center")

# 凡例を表示する。
ax.legend(loc="upper left")

# グラフを表示する。
plt.show()

各部のコード

パッケージのインポート

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt

 必要なパッケージとモジュールをインポートしています。ここでは、数値計算のためのnumpyパッケージ、グラフ描画のためのmatplotlibパッケージとpyplotモジュールをインポートしています。

データの用意

# データを用意する。
x1 = np.random.normal(loc=0, scale=1.8, size=300)
y1 = np.random.normal(loc=0, scale=1.8, size=300)
z1 = np.random.random(300) * 1
x2 = np.random.normal(loc=0, scale=1.1, size=300)
y2 = np.random.normal(loc=0, scale=1.1, size=300)
z2 = np.random.random(300) * 10

 データを用意しています。ここでは、\(x\)値と\(y\)値双方の平均値が0で標準偏差が1.8のデータを300個、\(x\)値と\(y\)値双方の平均値が0で標準偏差が1.1のデータを300個の2つのデータ系列を用意しています。また、2つのデータ系列の\(z\)値として0以上1未満のデータを300個、0以上10未満のデータを300個を用意しています。

FigureとAxesの作成

# Figureを作成する。
fig = plt.figure(constrained_layout=True)
# Axesを作成する。
ax = fig.add_subplot(111)

 グラフを描画するためには、最初にFigureとAxesを作成する必要があります。14行目でFigureを作成し、16行目でAxesを作成しています。Figureはグラフを貼るための台紙で、Axesはグラフ本体といったイメージです。

Figureの解像度と色

# Figureの解像度と色を設定する。
fig.set_dpi(130)
fig.set_facecolor("whitesmoke")

 Figure(台紙です)の解像度(DPI)と色を設定してます。ここでは、Figure(台紙です)の解像度(DPI)に「130」を設定し、色に「whitesmoke」(Whitesmoke)を指定しています。

 グラフを構成する各部位の色の選択肢は以下のページに掲載されています。

Axesのタイトルと色

# Axesのタイトルと色を設定する。
ax.set_title("Sample")
ax.set_facecolor("whitesmoke")

 Axes(グラフ本体です)のタイトルと色を設定しています。ここでは、Axes(グラフ本体です)のタイトルに「Sample」を設定し、色に「whitesmoke」(Whitesmoke)を指定しています。Axes(グラフ本体です)の色は、Figureの色を設定したときと同じようにいろいろな色を選択することができます。

x軸とy軸のラベル

# x軸とy軸のラベルを設定する。
ax.set_xlabel("x")
ax.set_ylabel("y")

 \(x\)軸と\(y\)軸のラベルを設定しています。ここでは、\(x\)軸のラベルに「x」を、\(y\)軸のラベルに「y」を設定しています。

x軸の目盛

# x軸の範囲を設定する。
ax.set_xlim(-5, 5)
# x軸の目盛の位置とラベルを設定する。
ax.xaxis.set_major_locator(mpl.ticker.MultipleLocator(1))
ax.xaxis.set_major_formatter(mpl.ticker.StrMethodFormatter("{x:.0f}"))

 \(x\)軸の目盛の範囲と位置とラベルを設定しています。ここでは、目盛の範囲を「-5から5」に、位置をMultipleLocatorというロケータを使って「1」ごとに、ラベルをStrMethodFormatterというフォーマッタを使って「少数点以下0桁」で表示するように設定しています。

y軸の目盛

# y軸の範囲を設定する。
ax.set_ylim(-5, 5)
# y軸の目盛の位置とラベルを設定する。
ax.yaxis.set_major_locator(mpl.ticker.MultipleLocator(1))
ax.yaxis.set_major_formatter(mpl.ticker.StrMethodFormatter("{x:.0f}"))

 \(y\)軸の目盛の範囲と位置とラベルを設定しています。ここでは、目盛の範囲を「-5から5」に、位置をMultipleLocatorというロケータを使って「1」ごとに、ラベルをStrMethodFormatterというフォーマッタを使って「少数点以下0桁」で表示するように設定しています。

グリッド

# グリッドを表示する。
ax.set_axisbelow(True)
ax.grid()

 \(x\)軸と\(y\)軸の目盛に対応したグリッド線を設定しています。43行目ではグリッド線をデータ系列の手前ではなく後ろに引くよう設定しています。

データの描画

# データを描画する。
mp1 = ax.scatter(x1, y1, s=10+z1*70, c=z1, marker="o", cmap="Blues", alpha=0.8, vmin=0, vmax=1, label="data series 1")
mp2 = ax.scatter(x2, y2, s=10+z2*7, c=z2, marker="s", cmap="Reds", alpha=0.8, vmin=0, vmax=10, label="data series 2")

 \(x\)値と\(y\)値を使った2次元座標への描画に加え\(z\)値をマーカーの大きさと色の濃さに対応させたいわゆるバブルチャートを描画しています。ここでは、キーワード引数sでマーカーの大きさを、キーワード引数cでマーカーの色の濃さを、キーワード引数markerでマーカーの種類を、キーワード引数cmapでマーカのカラーマップを、キーワード引数alphaでマーカの透明度を、キーワード引数vminとvmaxでカラーマップの色の最薄色と最濃色に割り当てる\(z\)値を、キーワード引数labelでデータ系列のラベルを設定しています。ここで設定したデータ系列のラベルがこの後で説明する凡例で表示されることになります。

 マーカーの選択肢は、以下のページに掲載されています。

 カラーマップの選択肢は、以下のページに掲載されています。

第1データ系列のカラーバー

# 第1系列のカラーバーを設定する。
cbar1 = plt.colorbar(mp1, aspect=30)
cbar1.ax.set_ylim(0, 1)
cbar1.ax.yaxis.set_major_locator(mpl.ticker.MultipleLocator(.1))
cbar1.ax.yaxis.set_major_formatter(mpl.ticker.StrMethodFormatter("{x:.1f}"))
cbar1.set_label("z", loc="center")

 51行目でカラーバーを作成しています。キーワード引数aspectでカラーバーの太さを設定しています。52行目では、カラーバーの目盛の範囲を「0から1」に設定しています。53行目と54行目では、MultipleLocatorというロケータとStrMethodFormatterというフォーマッタを使って「0.1」おきに目盛のラベルが「少数点以下1桁」で表示されるように設定しています。55行目では、カラーバーのラベルを「z」に、位置を「center」に設定しています。

 ラベルの位置の他の選択肢は、以下のページに掲載されています。

第2データ系列のカラーバー

# 第2系列のカラーバーを設定する。
cbar2 = plt.colorbar(mp2, aspect=30)
cbar2.ax.set_ylim(0, 10)
cbar2.ax.yaxis.set_major_locator(mpl.ticker.MultipleLocator(1))
cbar2.ax.yaxis.set_major_formatter(mpl.ticker.StrMethodFormatter("{x:.0f}"))
cbar2.set_label("z", loc="center")

 58行目でカラーバーを作成しています。キーワード引数aspectでカラーバーの太さを設定しています。59行目では、カラーバーの目盛の範囲を「0から10」に設定しています。60行目と61行目では、MultipleLocatorというロケータとStrMethodFormatterというフォーマッタを使って「1」おきに目盛のラベルが「少数点以下0桁」で表示されるように設定しています。62行目では、カラーバーのラベルを「z」に、位置を「center」に設定しています。

 ラベルの位置の選択肢については、前の項と同様です。

凡例

# 凡例を表示する。
ax.legend(loc="upper left")

 凡例を設定しています。ここでは、凡例の位置として「upper left」(左上)を指定しています。凡例の位置は、「upper left」(左上)以外にもいろいろ選択できます。

 凡例の位置の他の選択肢は、以下のnkay様の記事が参考になります。

グラフの表示

# グラフを表示する。
plt.show()

 最後に、グラフを表示しています。

対数目盛カラーバー付き散布図

対数目盛りカラーバー付き散布図

 対数目盛カラーバー付き散布図の描き方を解説していきます。

全体のコード

 上記グラフを作成するためのコードは以下になります。

 ここでは、1つのデータ系列を持つ散布図を対数目盛カラーバー付きで描画しています。次節以降で、以下のコードをワンステップずつ解説していきます。

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt

# データを用意する。
x = np.random.normal(loc=0, scale=1.5, size=300)
y = np.random.normal(loc=0, scale=1.5, size=300)
z = np.random.random(300) * 100

# Figureを作成する。
fig = plt.figure(constrained_layout=True)
# Axesを作成する。
ax = fig.add_subplot(111)

# Figureの解像度と色を設定する。
fig.set_dpi(130)
fig.set_facecolor("whitesmoke")

# Axesのタイトルと色を設定する。
ax.set_title("Sample")
ax.set_facecolor("whitesmoke")

# x軸とy軸のラベルを設定する。
ax.set_xlabel("x")
ax.set_ylabel("y")

# x軸の範囲を設定する。
ax.set_xlim(-5, 5)
# x軸の目盛の位置とラベルを設定する。
ax.xaxis.set_major_locator(mpl.ticker.MultipleLocator(1))
ax.xaxis.set_major_formatter(mpl.ticker.StrMethodFormatter("{x:.0f}"))

# y軸の範囲を設定する。
ax.set_ylim(-5, 5)
# y軸の目盛の位置とラベルを設定する。
ax.yaxis.set_major_locator(mpl.ticker.MultipleLocator(1))
ax.yaxis.set_major_formatter(mpl.ticker.StrMethodFormatter("{x:.0f}"))

# グリッドを表示する。
ax.set_axisbelow(True)
ax.grid()

# データを描画する。
# mp = ax.scatter(x, y, s=z, c=z, marker="^", cmap='Greens', alpha=0.8, vmin=1, vmax=100)
# mp = ax.scatter(x, y, s=z, c=z, marker="^", cmap='Greens', alpha=0.8, vmin=1, vmax=100, norm=mpl.colors.LogNorm())
mp = ax.scatter(x, y, s=z, c=z, marker="^", cmap='Greens', alpha=0.8, norm=mpl.colors.LogNorm(vmin=1, vmax=100))

# 系列のカラーバーを設定する。
cbar = plt.colorbar(mp, aspect=20)
cbar.ax.set_yscale('log')
cbar.ax.yaxis.set_major_locator(mpl.ticker.LogLocator())
cbar.ax.yaxis.set_major_formatter(mpl.ticker.LogFormatter())
cbar.set_label("z", loc='center')

# グラフを表示する。
plt.show()

各部のコード

パッケージのインポート

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt

 前の章の「パッケージのインポート」の項と同様です。

データの用意

# データを用意する。
x = np.random.normal(loc=0, scale=1.5, size=300)
y = np.random.normal(loc=0, scale=1.5, size=300)
z = np.random.random(300) * 100

 データを用意しています。ここでは、\(x\)値と\(y\)値双方の平均値が0で標準偏差が1.5のデータを300個用意しています。また、\(z\)値として0以上100未満のデータを300個用意しています。

FigureとAxesの作成

# Figureを作成する。
fig = plt.figure(constrained_layout=True)
# Axesを作成する。
ax = fig.add_subplot(111)

 前の章の「FigureとAxesの作成」の項と同様です。

Figureの解像度と色

# Figureの解像度と色を設定する。
fig.set_dpi(130)
fig.set_facecolor("whitesmoke")

 前の章の「Figureの解像度と色」の項と同様です。

Axesのタイトルと色

# Axesのタイトルと色を設定する。
ax.set_title("Sample")
ax.set_facecolor("whitesmoke")

 前の章の「Axesのタイトルと色」の項と同様です。

x軸とy軸のラベル

# x軸とy軸のラベルを設定する。
ax.set_xlabel("x")
ax.set_ylabel("y")

前の章の「x軸とy軸のラベル」の項と同様です。

x軸の目盛

# x軸の範囲を設定する。
ax.set_xlim(-5, 5)
# x軸の目盛の位置とラベルを設定する。
ax.xaxis.set_major_locator(mpl.ticker.MultipleLocator(1))
ax.xaxis.set_major_formatter(mpl.ticker.StrMethodFormatter("{x:.0f}"))

 前の章の「x軸の目盛」の項と同様です。

y軸の目盛

# y軸の範囲を設定する。
ax.set_ylim(-5, 5)
# y軸の目盛の位置とラベルを設定する。
ax.yaxis.set_major_locator(mpl.ticker.MultipleLocator(1))
ax.yaxis.set_major_formatter(mpl.ticker.StrMethodFormatter("{x:.0f}"))

 前の章の「y軸の目盛」の項と同様です。

グリッド

# グリッドを表示する。
ax.set_axisbelow(True)
ax.grid()

 前の章の「グリッド」の項と同様です。

データの描画

# データを描画する。
# mp = ax.scatter(x, y, s=z, c=z, marker="^", cmap='Greens', alpha=0.8, vmin=1, vmax=100)
# mp = ax.scatter(x, y, s=z, c=z, marker="^", cmap='Greens', alpha=0.8, vmin=1, vmax=100, norm=mpl.colors.LogNorm())
mp = ax.scatter(x, y, s=z, c=z, marker="^", cmap='Greens', alpha=0.8, norm=mpl.colors.LogNorm(vmin=1, vmax=100))

 \(x\)値と\(y\)値を使った2次元座標への描画に加え\(z\)値をマーカーの大きさと色の濃さに対応させたいわゆるバブルチャートを描画しています。ここでは、キーワード引数sでマーカーの大きさを、キーワード引数cでマーカーの色の濃さを、キーワード引数markerでマーカーの種類を、キーワード引数cmapでマーカのカラーマップを、キーワード引数alphaでマーカの透明度を、キーワード引数normにLogNorm(vmin=1, vmax=100)を渡して対数目盛によるカラーマップの正規化を設定しています。カラーマップの正規化においては、カラーマップの色の最薄色と最濃色に割り当てるz値をキーワード引数vminとvmaxで与えています。

 マーカーの選択肢とカラーマップの選択肢は、前の章の「データの描画」の項と同様です。

 なお、LogNormを使用したカラーマップの正規化を行わずにグラフを作成すると(44行目参照)、以下のようにグラデーションが偏ったカラーバーが描画されてしまいます。

グラデーションが偏ったカラーバー

 これについては、プログラマ向けQ&Aサイトとして有名なStack Overflowの以下のページを参考にしました。

 また、LogNormのコンストラクタにvminとvmaxを与えずにグラフを作成すると(45行目参照)、以下のように実行時に警告が発生します。Axesクラスのscatterメソッドにキーワード引数normとキーワード引数vmin/vmaxを同時に渡すことはmatplotlib3.3以降では非推奨でありmatplotlib3.5以降ではエラーになるとのことです。

MatplotlibDeprecationWarning: Passing parameters norm and vmin/vmax simultaneously is deprecated since 3.3 and will become an error two minor releases later. Please pass vmin/vmax directly to the norm when creating it.

系列のカラーバー

# 系列のカラーバーを設定する。
cbar = plt.colorbar(mp, aspect=20)
cbar.ax.set_yscale('log')
cbar.ax.yaxis.set_major_locator(mpl.ticker.LogLocator())
cbar.ax.yaxis.set_major_formatter(mpl.ticker.LogFormatter())
cbar.set_label("z", loc='center')

 49行目でカラーバーを作成しています。キーワード引数aspectでカラーバーの太さを設定しています。50行目では、カラーバーを対数目盛に設定しています。51行目と52行目では、LogLocatorというロケータとLogFormatterというフォーマッタを使ってカラーバーを対数目盛に設定しています(細かな目盛設定を行わない限り50行目があればこちらは不要かもしれません)。53行目では、カラーバーのラベルを「z」に、位置を「center」に設定しています。

 ラベルの位置の選択肢は、前の章の「第1データ系列のカラーバー」の項と同様です。

グラフの表示

# グラフを表示する。
plt.show()

 最後に、グラフを表示しています。

作成したグラフの保存

 作成したグラフは、表示された画面の左下に並んでいるボタンのうち保存ボタンをクリックすることで画像ファイルとして保存することができます。

作成したグラフの保存


以上、「Python初心者でも簡単!matplotlibを使ったカラーバーつき散布図の描き方を徹底解説」でした。


この記事を書いた人

プロフィール

 その日暮らし

 こんにちは、その日暮らしです/地方国立大理系院卒→大手大企業就職→ソフト開発二十年超→メンタル壊して退職→ちょっと回復→資格取得頑張る(簿記3級と応用情報は合格でデスペはギブアップ)→コロナ禍で再就職無理→離婚orz→実家へ出戻ってこどおじ化(笑)→WordPressの勉強のためブログに挑戦/そんな訳でブログは始めたばかりですが日々いろんなことを試して得た知識を投稿していこうと思ってます/以上