Matplotlibライブラリを使って、散布図を生成するサンプルコードと注意点を紹介します。
Matplotlibはグラフ描画ライブラリで、Python in Excel のコアライブラリの1つです。散布図を作成するには、pyplotモジュールのscatter関数を使用します。
出力結果例
scatter 関数の構文
plt.scatter(x, y [, 任意引数])
戻り値 | PathCollection |
引数 | 型 | 説明 |
---|---|---|
x, y (必須) | float or 配列 | 処理対象のデータ(DataFrame) |
s | float or 配列 | マーカーのサイズ デフォルト:36.0(6.0の2乗) |
c | list or 配列 | マーカーの色 デフォルト:#1f77b4 |
marker | string or MarkerStyle | マーカーの形 matplotlib.markersで指定 デフォルト:”o” |
cmap | string or Colormap | カラーマップ名 デフォルト:”viridis” ※引数c が RGB(A) の場合はこの引数は無視される |
norm | string or Normalize | 引数cmap を使用して色にマッピングする前に、スカラーデータを [0, 1] 範囲にスケールするために使用される正規化方法 ※引数c が RGB(A) の場合はこの引数は無視される |
vmin, vmax | float | カラーマップがカバーするデータ範囲を定義 ※引数c が RGB(A) の場合はこの引数は無視される |
alpha | float | マーカーの透明度 デフォルト:1(opaque) |
linewidths | float or 配列 | マーカーのエッジの幅 デフォルト:1.5 |
edgecolors | string or list | マーカーのエッジの色 選択肢:”face”, “none”, None, RGB等の色文字列 デフォルト:”face” |
plotnonfinite | bool | Trueの場合、無限の点(the infinite points)がグラフにプロットされる デフォルト:False |
data | indexable オブジェクト | DataFrame等 指定した場合、次の引数は文字列 s を指定できる(例:data[s]) x, y, s, linewidths, edgecolors, c, facecolor, facecolors, color |
kwargs | dict | その他の設定を辞書型で指定 |
サンプルコード
サンプルデータ
データが150件、名称が「IrisDataSet2」のテーブルを使用して説明します。
サンプルデータを取得する方法は、ここを展開してください。
サンプルデータを取得する手順
- 1「数式」タブ→「Pythonの挿入」ボタン→「Pythonサンプルを試す」をクリック
- 2Excelウィンドウ右側に表示されたペーンの「サンプルの挿入」をクリック
- 3サンプルデータのシートが追加されます
Pythonの入力方法や出力種類、DataFrameの定義方法については、以下の記事で詳しく紹介しています。
【超基本】Python in Excel の使い方とルール
Python in Excel の入力方法は難しくはありませんが、Excelのワークシート関数の入力の仕方とは少し勝手が違います。この記事では、Python in Excel の入力の仕方と出力の種類、計算順序やパフォーマンスを向上させるた...
[DataFrame] xl関数の指定方法いろいろ
この記事では、DataFrameの定義、xl関数の使い方や注意点について説明します。DataFrameを使うと、Excelのセル範囲や名前、テーブル、Power Queryのデータを Python in Excel で扱えるようになります。...
前提
以降のサンプルコードは、DataFrame型の x変数, y変数が定義済みであることを前提としています。
# 別のセルに定義しておく
x = xl("IrisDataSet2[sepal_length]")
y = xl("IrisDataSet2[sepal_width]")
# 同じセルに記述してもよい
x = xl("IrisDataSet2[sepal_length]")
y = xl("IrisDataSet2[sepal_width]")
plt.scatter(x, y)
また、複数のscatter関数の例を列挙して記述していますが、実際に試してみる場合はそれぞれ別のセルに記述してください。(列挙して記述するとプロットが重なって表示されます。)
# こんな風に複数記述されている場合は、1つずつ試すか別のセルに記述してください
plt.scatter(x, y, edgecolors="r") # サイズ=1.5(デフォルト)
plt.scatter(x, y, edgecolors="r", linewidths=4.0) # サイズ=4.0
plt.scatter(x, y, edgecolors="r", linewidths=0) # サイズ=0(非表示)
必須引数(x, y)のみ指定
# matplotlib.pyplotは「plt」のエイリアス名でimport文なしで使える
# import matplotlib.pyplot as plt
plt.scatter(x, y)
結果
セルに「Image」と表示された場合は、Python出力の種類を「Excelの値」に変更してください。
セル内のイメージを拡大する場合は、セルをクリックし、右上に表示される「参照の作成」アイコンをクリックしてください。
マーカーのサイズ(s)
plt.scatter(x, y, s=12.0, edgecolors=None)
結果
マーカーの形(marker)
plt.scatter(x, y, s=100, marker="*")
結果
マーカーの色(c, cmap, norm, vmin, vmax, alpha)
# cmap,normを指定
import matplotlib.colors as colors
plt.scatter(x, y, c=x, cmap="hsv", norm=colors.CenteredNorm())
# cmap,vmin,vmaxを指定
plt.scatter(x, y, c=x, cmap="hsv", vmin=0, vmax=10)
# alphaを指定
plt.scatter(x, y, alpha=0.5)
# cにRGBを指定
plt.scatter(x, y, c="#00ff00")
結果
マーカーのエッジ(linewidths, edgecolors)
# 色を赤(r)に設定
plt.scatter(x, y, edgecolors="r") # サイズ=1.5(デフォルト)
plt.scatter(x, y, edgecolors="r", linewidths=4.0) # サイズ=4.0
plt.scatter(x, y, edgecolors="r", linewidths=0) # サイズ=0(非表示)
結果
# リストを渡してプロット毎に指定することも可能
colors = np.random.choice(["r", "g", "b"], x.size)
plt.scatter(x, y, c="#ffffff", edgecolors=colors, linewidths=3.0)
結果
data引数を使った指定方法
df = xl("IrisDataSet2[#すべて]", headers=True)
plt.scatter("sepal_length", "sepal_width", c="sepal_length", data=df)
結果
凡例を表示
# species別にDataFrameを取得する
df = xl("IrisDataSet2[#すべて]", headers=True)
setosa = df.query('species == "setosa"')
x1 = setosa["sepal_length"]
y1 = setosa["sepal_width"]
versicolor = df.query('species == "versicolor"')
x2 = versicolor["sepal_length"]
y2 = versicolor["sepal_width"]
virginica = df.query('species == "virginica"')
x3 = virginica["sepal_length"]
y3 = virginica["sepal_width"]
# species毎にscatter関数を指定する
plt.scatter(x1, y1, c="#E91E63", label="setosa")
plt.scatter(x2, y2, c="#00BCD4", label="versicolor")
plt.scatter(x3, y3, c="#FFC107", label="virginica")
plt.legend(loc="lower right", title="Species")
結果
ラベルを表示
plt.scatter(x, y)
plt.xlabel("sepal_length")
plt.ylabel("sepal_width")
plt.title("Sepal length and width analysis")
結果
注意点
軸ラベルやタイトル、凡例に、日本語は表示されないようです。
plt.scatter(x, y, label="アヤメ")
plt.legend(loc="lower right", title="種類")
plt.xlabel("がく片の長さ")
plt.ylabel("がく片の幅")
plt.title("がく片の長さと幅の分析")