Pythonで散布図を作成! 医学論文で使うMatplotlibコード集
医学の研究や論文では、異なる連続変数間の関連を調べることがよくあります。例えば、入院時のCRP値と患者の平均在院日数の関連性を明らかにするなど、数値データの関係性を探ることは重要です。
このような関連をわかりやすく図示するためには、散布図が有用です。
本稿では、Pythonのmatplotlibライブラリを用いて散布図を描く方法について解説します。
ライブラリのインポートとデータの読み込み
まずは、必要なライブラリをインポートし、データの読み込みを行います。エクセルデータをpandasのread_excel関数を使用してデータを読み込みます。
以下のコードは、Excelファイルの絶対パスを指定して、最初のシートを読み込んでいます(シートナンバーには「0」を入力)。
import pandas as pd
import numpy as np
import scipy as sp
import matplotlib.pyplot as plt
EXCEL_Path = r'エクセルファイルのパス名' #ファイルパスの後に.xlsxを忘れずに!
Sheet_no = 0 # 最初のシートを読み込む場合は0を入力
df = pd.read_excel(EXCEL_Path, sheet_name= Sheet_no)
続いてエクセルから、グラフ作成に必要な列のみをiloc関数を用いて抽出して、別のデータフレームを作成します。
df1 = pd.DataFrame(df, columns =['Study_No','Patient_No',
'Proportion_Normal', 'Proportion_fibrous',
'Proportion_Calcium','Proportion_lipid',
'6M_Sum_IB_Area mm2' ])
Pnorm = df1.iloc[0:,2] # C列のデータを取得
Pfib = df1.iloc[0:,3] # D列のデータを取得
Pcalc = df1.iloc[0:,4] # E列のデータを取得
Plip = df1.iloc[0:,5] # F列のデータを取得
SParea = df1.iloc[0:,6] # G列のデータを取得
グラフの基本デザインの設定
グラフの基本デザインを設定することで、色やフォントなどを統一させることができます。これにより、毎回同じ設定を行う手間を省くことができます。
以下に、グラフの基本デザインを設定するための例を示します。
Facecolor = "lightblue" # 各グラフ外の背景色
charac_size = 20 # 文字の大きさ
character_c = "black" # 文字の色
tick_c ="black" # 目盛の色
plt.rcParams['axes.facecolor'] = 'azure' # 各グラフ内の背景色
plt.rcParams['font.family'] = ['Times new roman']
散布図を描こう
では散布図を描いて行きましょう。
まずグラフの大きさをfigsize(横幅,縦の高さ)で設定します。
続いて、複数の散布図を並べて表示するために各グラフの配置を設定します。ax1 = fig.add_subplot(2, 2, 1)と指定すると、ax1は2行、2列の1番目のグラフと設定できます。
fig = plt.figure(figsize = (10,10), facecolor = Facecolor)
ax1 = fig.add_subplot(2, 2, 1)
ax2 = fig.add_subplot(2, 2, 2)
ax3 = fig.add_subplot(2, 2, 3)
ax4 = fig.add_subplot(2, 2, 4)
上記のコードで、以下の2×2のグラフが作成できます。
もちろん設定を変えると、4つのグラフを横1列に並べることもできます。
fig = plt.figure(figsize = (25,5), facecolor = Facecolor)
ax1 = fig.add_subplot(1, 4, 1)
ax2 = fig.add_subplot(1, 4, 2)
ax3 = fig.add_subplot(1, 4, 3)
ax4 = fig.add_subplot(1, 4, 4)
続いて、グラフの中身を描いて行きましょう。
まずX軸、Y軸の値を入力して、scatter()関数でグラフをプロットします。
Xaxis_1 = Pnorm # X軸のデータを入力
Yaxis = SParea # Y軸のデータを入力
ax1.scatter(Xaxis_1, Yaxis, color='blue', s=10)
ax1.set_xlabel("X軸のラベル名", size=charac_size,
style='italic', color= character_c)
ax1.set_ylabel("Y軸のラベル名", size=charac_size,
style='italic', color= character_c)
ax1.tick_params(colors = tick_c)
scatter()関数の引数のsでドットのサイズを調整できますし、markerを用いればドットの形を設定することができます(例.marker="x")。
散布図に線形回帰の検量線を追加
散布図で示されたデータの傾向をわかりやすくするために検量線を追記しましょう。ちなみに、検量線を描くためにはscipyが必要ですので、ライブラリをあらかじめインポートしておきましょう。
import scipy as sp
polyfit関数を使って、X軸データとY軸データ の間の最適な線形回帰係数を計算しましょう。
検量線をxの最小値から最大値まで描くので、それぞれを.min()関数と.max()関数を用いて計算し、np.linspace関数で最低値から最大値までの連続した数値を作成します。
この操作は、散布図を描くたびに繰り返し用いるので、defで文で定義しておきましょう。
def plot_linear_regression(X, Y, ax):
param = np.polyfit(X, Y, 1)
X_min, X_max = X.min(), X.max()
x = np.linspace(X_min, X_max)
y = param[0] * x + param[1]
ax.plot(x, y, color="blue", linewidth=1)
print('Correlation: n=', len(X),
', y=', param[0],'x +', param[1])
plot_linear_regression(Xaxis_1, Yaxis, ax1)
def文を用いて散布図と検量線の作成を一気に描くこともできます。
# 線形回帰の検量線を描く
def plot_linear_regression(X, Y, ax):
param = np.polyfit(X, Y, 1)
X_min, X_max = X.min(), X.max()
x = np.linspace(X_min, X_max)
y = param[0] * x + param[1]
ax.plot(x, y, color="blue", linewidth=1)
print('Correlation: n=', len(X),
', y=', param[0],'x +', param[1])
# 散布図と検量線を描く
def plot_graph(ax, X, Y, xlabel, ylabel, Xtick):
ax.scatter(X, Y, color='blue', s=10)
ax.set_xlabel(xlabel, size=charac_size, style='italic', color=character_c)
ax.set_ylabel(ylabel, size=charac_size, style='italic', color=character_c)
ax.tick_params(colors=tick_c)
ax.set_xticks(np.arange(np.floor(X.min()), np.ceil(X.max()) + 0.2, Xtick))
plot_linear_regression(X, Y, ax)
fig = plt.figure(figsize = (25,5), facecolor = Facecolor)
ax1 = fig.add_subplot(1, 4, 1)
ax2 = fig.add_subplot(1, 4, 2)
ax3 = fig.add_subplot(1, 4, 3)
ax4 = fig.add_subplot(1, 4, 4)
# X軸、Y軸のデータを入力
Yaxis = SParea
Xaxis_1 = Pnorm
Xaxis_2 = Pfib
Xaxis_3 = Pcalc
Xaxis_4 = Plip
Xticks = 0.2 # X軸の目盛の幅を設定
plot_graph(ax1, Xaxis_1, Yaxis, "X軸のラベル名", "Y軸のラベル名", Xticks)
上付き文字の書き方
平方メートル、立方メートルといった単位を軸ラベルに入力するときに上付き文字を使うことがあります。その時は、ドル記号を用いて以下のように記載すると上付き文字になります。
Ylabel = 'Lumen area, mm$^{2}$'
以上、matplotlibを用いた散布図と線形回帰のグラフ作成法でした。
本稿が、pythonを用いて研究をしている皆さんに役立つことを願っています。
また、私のブログでは今後もAIサービスやミュンヘンの状況などを書いていく予定です。アウトプットの励みになりますので、スキ、フォローをよろしくお願いします。
これまでに書いた記事一覧はこちらからご覧いただけます。
https://note.com/doctor_u/n/nacb6a14e1a53
この記事が気に入ったらサポートをしてみませんか?