1. 目的
2. 1つの図に3群の結果をプロット
2.1. データ準備
2.2. ソースコード
2.3. 結果確認
2.3.1. Boxplot
2.3.2. Boxplot_with_dot
2.3.3. Violinplot
3. 1つの図に3群の結果を各領域ごとにプロット
3.1. データ準備
3.2. ソースコード
3.3. 結果
4. 1つの図に3つの変数に対して4群の結果を3パターンプロット
4.1. データ準備
4.2. ソースコード
4.3. 結果
1. 目的
- Pythonを使って箱ひげ図(BoxPlot)を作成
2. 1つの図に3群の結果をプロット
2.1. データ準備
行に各被験者、列にIDと各被験者のlabel、さらに各定量値が来るようにデータをまとめる。以下のデータは、その一部である。
この例では、以下のデータを「dataset.csv」として保存。
| ID | label | AD | ADfwe | MD | MDfwe | RD | RDfwe | AK | MK | RK | ICVF | ISO | AVF | FA | fafwe | freewater | MVF | gratio | OD | T1 | T2 | R1 | R2 | PD |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Sub001 | 0 | 1.139126 | 1.084 | 0.767302 | 0.602 | 0.566298 | 0.362 | 0.415519 | 0.570861 | 0.791092 | 0.590076 | 0.082388 | 0.377932 | 0.438481 | 0.614848 | 0.156918 | 0.288708 | 0.754112 | 0.191405 | 810.747168 | 79.703771 | 1.280526 | 12.822576 | 66.656261 |
| Sub002 | 0 | 1.133603 | 1.082 | 0.77083 | 0.605 | 0.57187 | 0.366 | 0.416198 | 0.570608 | 0.787359 | 0.586764 | 0.081708 | 0.383601 | 0.433305 | 0.608671 | 0.157489 | 0.274517 | 0.767147 | 0.194536 | 857.855883 | 83.185407 | 1.244505 | 12.618935 | 67.648979 |
| Sub003 | 0 | 1.156806 | 1.015 | 0.771779 | 0.611 | 0.579677 | 0.409 | 0.419005 | 0.575068 | 0.785805 | 0.609524 | 0.086635 | 0.374028 | 0.423782 | 0.531318 | 0.17062 | 0.31571 | 0.737025 | 0.198631 | 770.392887 | 75.561827 | 1.336872 | 13.477936 | 64.960388 |
2.2. ソースコード
- 各定量値について、各被験者ごとにプロット
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import os
def set_plot_config_save(ax, dataname, plottype):
# config
# ax.set_title(dataname)
plt.gca().spines['right'].set_visible(False)
plt.gca().spines['top'].set_visible(False)
ax.set(xlabel='', ylabel=dataname)
# save figure
if not os.path.isdir('result_figure/' + plottype):
os.makedirs('result_figure/' + plottype)
plt.savefig('result_figure/' + plottype +
'/HCvsMSvsNMO_' + dataname + '.png')
plt.close()
def plot_result(all_df, dataname):
# change label int to str
all_df = all_df.replace({'label': {0: 'HC', 1: 'MS', 2: 'NMO'}})
# plot 1 (boxplot)
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
sns.boxplot(x='label', y=dataname, data=all_df,
showfliers=False, palette="Set1")
set_plot_config_save(ax, dataname, 'boxplot')
# plot 2 (boxplot with dot)
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
sns.boxplot(x='label', y=dataname, data=all_df,
showfliers=False, palette="Set1")
sns.stripplot(x='label', y=dataname, data=all_df, size=4,
dodge=True, jitter=True, color='black')
set_plot_config_save(ax, dataname, 'boxplot_dot')
# plot 3 (violinplot)
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
sns.violinplot(x='label', y=dataname, data=all_df,
showfliers=False, palette="Set1", split=True)
set_plot_config_save(ax, dataname, 'violinplot')
# import file
all_df = pd.read_csv('dataset.csv')
# plot results
datanames = ['AD', 'ADfwe', 'MD', 'MDfwe', 'RD', 'RDfwe', 'AK', 'MK', 'RK', 'ICVF', 'ISO',
'AVF', 'FA', 'fafwe', 'freewater', 'MVF', 'gratio', 'OD', 'T1', 'T2', 'R1', 'R2', 'PD']
for map in datanames:
print("Plotting {}...".format(map))
plot_result(all_df, map)
2.3. 結果確認
for plottype in 'boxplot' 'boxplot_dot' 'violinplot';do
montage result_figure/${plottype}/*png -geometry 640x480 -tile 5x5 result_figure/${plottype}/${plottype}_tile.jpg
done
2.3.1. Boxplot

2.3.2. Boxplot_with_dot

2.3.3. Violinplot

3. 1つの図に3群の結果を各領域ごとにプロット
3.1. データ準備
行に各被験者、列にIDと各被験者のlabel、さらに各領域の各定量値が来るようにデータをまとめる。以下のデータは、その一部であり、1つの定量値に対して3領域分の計測値がある。
| ID | label | ICVF_vSN | ICVF_lSN | ICVF_mSN | ISOVF_vSN | ISOVF_lSN | ISOVF_mSN | ODI_vSN | ODI_lSN | ODI_mSN | FW_1000_vSN | FW_1000_lSN | FW_1000_mSN | FW_10002000_vSN | FW_10002000_lSN | FW_10002000_mSN |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Sub001 | 0 | 0.74727 | 0.740142 | 0.719879 | 0.172856 | 0.20309 | 0.18001 | 0.248277 | 0.087609 | 0.329636 | 0.312351 | 0.273095 | 0.300793 | 0.27786 | 0.205887 | 0.274283 |
| Sub002 | 0 | 0.725333 | 0.751942 | 0.769737 | 0.157023 | 0.222715 | 0.201932 | 0.30647 | 0.172115 | 0.304513 | 0.330445 | 0.237088 | 0.293767 | 0.239366 | 0.281042 | 0.253842 |
| Sub003 | 0 | 0.794968 | 0.695998 | 0.761458 | 0.220207 | 0.235809 | 0.213143 | 0.28446 | 0.145531 | 0.294445 | 0.285126 | 0.180409 | 0.27599 | 0.274388 | 0.263941 | 0.259132 |
3.2. ソースコード
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import os
def set_plot_config_save(ax, dataname, plottype):
# config
# ax.set_title(dataname)
plt.gca().spines['right'].set_visible(False)
plt.gca().spines['top'].set_visible(False)
ax.set(xlabel='', ylabel=dataname)
# save figure
if not os.path.isdir('result_figure/' + plottype):
os.makedirs('result_figure/' + plottype)
plt.savefig('result_figure/' + plottype +
'/HCvsMSvsNMO_' + dataname + '.png')
plt.close()
def plot_result(all_df, dataname):
# change label int to str
all_df = all_df.replace({'label': {0: 'HC', 1: 'MS', 2: 'NMO'}})
# plot 1 (boxplot)
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
sns.boxplot(x='label', y=dataname, data=all_df,
showfliers=False, palette="Set1")
set_plot_config_save(ax, dataname, 'boxplot')
# plot 2 (boxplot with dot)
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
sns.boxplot(x='label', y=dataname, data=all_df,
showfliers=False, palette="Set1")
sns.stripplot(x='label', y=dataname, data=all_df, size=4,
dodge=True, jitter=True, color='black')
set_plot_config_save(ax, dataname, 'boxplot_dot')
# plot 3 (violinplot)
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
sns.violinplot(x='label', y=dataname, data=all_df,
showfliers=False, palette="Set1", split=True)
set_plot_config_save(ax, dataname, 'violinplot')
# import file
all_df = pd.read_csv('dataset.csv')
# plot results
datanames = ['AD', 'ADfwe', 'MD', 'MDfwe', 'RD', 'RDfwe', 'AK', 'MK', 'RK', 'ICVF', 'ISO',
'AVF', 'FA', 'fafwe', 'freewater', 'MVF', 'gratio', 'OD', 'T1', 'T2', 'R1', 'R2', 'PD']
for map in datanames:
print("Plotting {}...".format(map))
plot_result(all_df, map)
3.3. 結果

4. 1つの図に3つの変数に対して4群の結果を3パターンプロット
4.1. データ準備
行に各被験者、列にIDと各被験者のlabel、さらに各定量値が来るようにデータをまとめる。以下のデータは、その一部である。
この例では、以下のデータを「dataset.csv」として保存。
| ID | SD05_lSN | SD05_mSN | SD05_vSN | SD10_lSN | SD10_mSN | SD10_vSN | SD15_lSN | SD15_mSN | SD15_vSN | label |
|---|---|---|---|---|---|---|---|---|---|---|
| Sub001 | 260 | 553 | 253 | 136 | 448 | 154 | 74 | 269 | 43 | 1 |
| Sub002 | 224 | 666 | 145 | 148 | 566 | 109 | 53 | 315 | 55 | 2 |
| Sub003 | 344 | 422 | 324 | 218 | 303 | 273 | 53 | 130 | 186 | 3 |
| Sub004 | 121 | 536 | 357 | 0 | 108 | 52 | 0 | 0 | 0 | 4 |
4.2. ソースコード
各定量値について、各被験者ごとにプロット
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
def plot_result(all_df, dataname):
# define subjects
HC_df = all_df[all_df['label'] == 1]
wICD_df = all_df[all_df['label'] == 2]
wPDD_df = all_df[all_df['label'] == 3]
woICDPDD_df = all_df[all_df['label'] == 4]
# each dataframe
HC_df_tg = pd.DataFrame({
'lSNc': HC_df[dataname + '_lSN'],
'vSNc': HC_df[dataname + '_vSN'],
'mSNc': HC_df[dataname + '_mSN']
})
wICD_df_tg = pd.DataFrame({
'lSNc': wICD_df[dataname + '_lSN'],
'vSNc': wICD_df[dataname + '_vSN'],
'mSNc': wICD_df[dataname + '_mSN']
})
wPDD_df_tg = pd.DataFrame({
'lSNc': wPDD_df[dataname + '_lSN'],
'vSNc': wPDD_df[dataname + '_vSN'],
'mSNc': wPDD_df[dataname + '_mSN']
})
woICDPDD_df_tg = pd.DataFrame({
'lSNc': woICDPDD_df[dataname + '_lSN'],
'vSNc': woICDPDD_df[dataname + '_vSN'],
'mSNc': woICDPDD_df[dataname + '_mSN']
})
# melt
HC_df_tg_melt = pd.melt(HC_df_tg)
wICD_df_tg_melt = pd.melt(wICD_df_tg)
wPDD_df_tg_melt = pd.melt(wPDD_df_tg)
woICDPDD_df_tg_melt = pd.melt(woICDPDD_df_tg)
# add label
HC_df_tg_melt['map'] = 'HC'
wICD_df_tg_melt['map'] = 'wICD'
wPDD_df_tg_melt['map'] = 'wPDD'
woICDPDD_df_tg_melt['map'] = 'woICD-PDD'
cat_df = pd.concat(
[HC_df_tg_melt, wICD_df_tg_melt, wPDD_df_tg_melt, woICDPDD_df_tg_melt], axis=0)
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
# plot 1 (errorbar ?)
# sns.barplot(x='variable', y='value', data=cat_df,
# hue='map', ci='sd', capsize=0.1, errwidth=1.5)
# plot 2 (stripplot ?)
# sns.barplot(x='variable', y='value', data=cat_df, hue='map', ci=None)
# sns.stripplot(x='variable', y='value', data=cat_df, size=5, hue='map', dodge=True, jitter=True, linewidth=1, edgecolor='black')
# plot 3 (boxplot)
sns.boxplot(x='variable', y='value', data=cat_df,
showfliers=False, hue='map', palette="Set1")
# sns.stripplot(x='variable', y='value', data=cat_df, size=2, hue='map', dodge=True, jitter=True, color='black')
# plot 4 (violinplt)
# sns.violinplot(x='variable', y='value', data=cat_df, showfliers=False, hue='map', palette="Set1", split=True)
# ylim=(0, 1)
# ax.set(xlabel='', ylabel='', ylim=(0, 1))
plt.gca().spines['right'].set_visible(False)
plt.gca().spines['top'].set_visible(False)
ax.set(xlabel='', ylabel=dataname)
handles, labels = ax.get_legend_handles_labels()
ax.legend(handles[0:4], labels[0:4])
# ax.get_legend().remove()
# ax.set_title(dataname)
plt.savefig('ICD_' + dataname + '.png')
# plt.show()
# import file
all_df = pd.read_csv('dataset.csv')
# plot results
datanames = ['SD05', 'SD10', 'SD15']
for map in datanames:
plot_result(all_df, map)
4.3. 結果

