【matplotlib】plt.scatterを使ってバブルチャートを作成する方法[Python]

  • URLをコピーしました!
目次

matplotlib

前回、Pythonのmatplotlibでカラーバーのラベルの表示、フォントサイズ、色、角度を変える方法を紹介しました。

今回はついでにmatplotlibのplt.scatterを使ってバブルチャートを作成する方法を紹介します。

基本となるプログラムをこんな感じで作成してみました。

import matplotlib.pyplot as plt
import matplotlib.cm as cm
import random

no_points = 20

x_list = [random.randrange(10) for _ in range(no_points)]
y_list = [random.randrange(10) for _ in range(no_points)]

fig = plt.figure()
plt.clf()

plt.scatter(x_list, y_list)

plt.show()

実行結果

「no_points」で指定した値の分だけ点をプロットしますが、そのXの値、Yの値は0から9の中からランダムに選択されるというものです。

それでは始めていきましょう。

点の大きさを変える方法

バブルチャートにするにはまずは点の大きさを変える必要があります。

点の大きさを変えるには「plt.scatter()」のオプションに「s=点のサイズ」を追加します。

import matplotlib.pyplot as plt
import matplotlib.cm as cm
import random

no_points = 20

x_list = [random.randrange(10) for _ in range(no_points)]
y_list = [random.randrange(10) for _ in range(no_points)]

fig = plt.figure()
plt.clf()

plt.scatter(x_list, y_list, s=100)

plt.show()

実行結果

このままでは単に点が大きくなった散布図です。

バブルチャートの場合はそれぞれの点のサイズが異なります。

実は先ほどの「s」のオプション引数は値だけでなく、リストも受け取ることができ、それぞれの点のサイズを変えることができます。

import matplotlib.pyplot as plt
import matplotlib.cm as cm
import random

no_points = 20

x_list = [random.randrange(10) for _ in range(no_points)]
y_list = [random.randrange(10) for _ in range(no_points)]
size_list = [i*10 for i in range(no_points)]

print(size_list)

fig = plt.figure()
plt.clf()

plt.scatter(x_list, y_list, s=size_list)

plt.show()

実行結果
[0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 
140, 150, 160, 170, 180, 190]

点のサイズのリストを表示していますが、数十から200程度にしても点のサイズは結構小さいです。

さらに数値を大きくしてみましょう。

import matplotlib.pyplot as plt
import matplotlib.cm as cm
import random

no_points = 20

x_list = [random.randrange(10) for _ in range(no_points)]
y_list = [random.randrange(10) for _ in range(no_points)]
size_list = [i*100 for i in range(no_points)]

print(size_list)

fig = plt.figure()
plt.clf()

plt.scatter(x_list, y_list, s=size_list)

plt.show()

実行結果
[0, 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000, 1100, 
1200, 1300, 1400, 1500, 1600, 1700, 1800, 1900]

数百から2000程度で大体このくらいのサイズになります。

点の色を変える方法+透明化する方法

各点の色をそれぞれ異なる色にする方法は前々回紹介しました。

「c」で色を決める数値のリストと「cmap」でカラーマップを指定します。

import matplotlib.pyplot as plt
import matplotlib.cm as cm
import random

no_points = 20

x_list = [random.randrange(10) for _ in range(no_points)]
y_list = [random.randrange(10) for _ in range(no_points)]
size_list = [i*100 for i in range(no_points)]

fig = plt.figure()
plt.clf()

plt.scatter(x_list, y_list, s=size_list, c=size_list, cmap=cm.rainbow)

plt.show()

実行結果

透明化するには「a=透明度」として0から1の値で透明度を指定します。

import matplotlib.pyplot as plt
import matplotlib.cm as cm
import random

no_points = 20

x_list = [random.randrange(10) for _ in range(no_points)]
y_list = [random.randrange(10) for _ in range(no_points)]
size_list = [i*100 for i in range(no_points)]

fig = plt.figure()
plt.clf()

plt.scatter(x_list, y_list, s=size_list, c=size_list, cmap=cm.rainbow, alpha=0.3)

plt.show()

この「a」のオプション引数に関してもリストを渡すことで、それぞれの点の透明度を変えることができます。

import matplotlib.pyplot as plt
import matplotlib.cm as cm
import random

no_points = 20

x_list = [random.randrange(10) for _ in range(no_points)]
y_list = [random.randrange(10) for _ in range(no_points)]
size_list = [i*100 for i in range(no_points)]
alpha_list = [random.random() for _ in range(no_points)]

fig = plt.figure()
plt.clf()

plt.scatter(x_list, y_list, s=size_list, c=size_list, cmap=cm.rainbow, alpha=alpha_list)

plt.show()

実行結果

円の枠の太さや色を変える方法

円の枠の太さを変えるには「linewidths」のオプションを、また枠の色を変えるには「edgecolor」のオプションを追加します。

import matplotlib.pyplot as plt
import matplotlib.cm as cm
import random

no_points = 20

x_list = [random.randrange(10) for _ in range(no_points)]
y_list = [random.randrange(10) for _ in range(no_points)]
size_list = [i*100 for i in range(no_points)]
width_list = range(no_points)

fig = plt.figure()
plt.clf()

plt.scatter(x_list, y_list, s=size_list, linewidths=5, edgecolor="black")

plt.show()

実行結果

どちらも引数としてリストを渡すことができ、リストを渡した場合はそれぞれの円の太さ、色を異なるものにすることができます。

import matplotlib.pyplot as plt
import matplotlib.cm as cm
import random

no_points = 20

x_list = [random.randrange(10) for _ in range(no_points)]
y_list = [random.randrange(10) for _ in range(no_points)]
size_list = [i*100 for i in range(no_points)]
width_list = range(no_points)

fig = plt.figure()
plt.clf()

plt.scatter(x_list, y_list, s=size_list, linewidths=width_list, edgecolor="black")

plt.show()

実行結果
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import random

no_points = 20

x_list = [random.randrange(10) for _ in range(no_points)]
y_list = [random.randrange(10) for _ in range(no_points)]
size_list = [i*100 for i in range(no_points)]
edgecolor_list = [cm.rainbow(i/no_points) for i in range(no_points)]

print(size_list)

fig = plt.figure()
plt.clf()

plt.scatter(x_list, y_list, s=size_list, linewidths=5, edgecolor=edgecolor_list)

plt.show()

実行結果

次回はPythonのリストで特定のインデックスの場所に要素を追加する方法を紹介します。

ではでは今回はこんな感じで。

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

目次