Pythonの可視化で成績変化比較グラフを作成する:スコアの上昇/下降を色分けする
学生の中間試験と期末試験の成績の変化を数字だけで比較するのは難しいかもしれません。しかし 可視化を活用すれば、次の図のように成績の上昇と下降を直感的に把握することができます。

今回の記事では パイソンの matplotlibを使用して 中間試験と期末試験の成績変化比較グラフを次のような特徴があるように作ってみます。
- スコアが 上昇すると緑色, 下がると赤で線とテキストを表示します。
- 縦の点線を追加して 時点ごとの成績変化をきちんと区別します。
成績変化グラフとは?
成績変化グラフは、特定の時点間のスコアの変化を視覚化したものです。 各生徒の 中間試験と期末試験の点数を線でつなぎ、スコアの変化に応じて色を変えて表示することで、データをより明確に表現します。
グラフの特徴
- 赤色スコアが下がった場合
- 緑色スコアが上昇した場合
- 左右に 名前とスコアを表示し、直感的に理解することができます。
Pythonのコード例
以下は matplotlibを利用して成績変化グラフを実装するコードです。
全コード
matplotlib.pyplot as plt をインポートします。
# 学生名と成績データの設定
students = ['Tom', 'Richard', 'Anna', 'Emily', 'Grace']].
midterm_scores = [75, 70, 65, 60, 45] #の中間テスト結果
final_scores = [55, 40, 75, 70, 65] # 期末テストの成績
# グラフ生成及びサイズ設定
fig, ax = plt.subplots(figsize=(10, 6)) # グラフサイズ設定
ax.set_title("Student Exam Scores", fontsize=15) # グラフのタイトルを設定する。
# 中間試験の点数と名前を表示(左 - 垂直点線の左側に間隔を設定)
ax.scatter([1] * len(midterm_scores), midterm_scores, color='red', s=50, zorder=3)
for i, txt in enumerate(midterm_scores):
color = 'green' if final_scores[i] > midterm_scores[i] else 'red' # 成績が上がると緑、下がると赤になります。
ax.text(0.75, midterm_scores[i], f"{students[i]} ({txt})", fontsize=10, color=color, va='center', ha='right') # 左側に名前とスコアを表示する
# 期末試験の点数と名前を表示(右側 - 垂直点線の右側に間隔を設定)
ax.scatter([2] * len(final_scores), final_scores, color='green', s=50, zorder=3)
for i, txt in enumerate(final_scores):
color = 'green' if final_scores[i] > midterm_scores[i] else 'red' # 成績が上がると緑、下がると赤になります。
ax.text(2.25, final_scores[i], f"{students[i]} ({txt})", fontsize=10, color=color, va='center', ha='left') # 右側に名前とスコアを表示する
# 中間テストと期末テストの点数をつなぐ線を引く
for i in range(len(students)):
color = 'green' if final_scores[i] > midterm_scores[i] else 'red' # 成績が上がると緑、下がると赤になります。
ax.plot([1, 2], [midterm_scores[i], final_scores[i]], color=color, linewidth=2, zorder=2) # 2つの点を線でつなぐ
# 垂直点線を追加 (中間試験と期末試験の位置を強調)
ax.axvline(x=1, color='gray', linestyle='--', linewidth=1) # Midtermの垂直点線
ax.axvline(x=2, color='gray', linestyle='--', linewidth=1) # Final 垂直点線追加
# X軸の設定
ax.set_xticks([1, 2])
ax.set_xticklabels(["Midterm", "Final"], fontsize=12, fontweight='bold') # x軸ラベル設定
# Y軸と目盛りを削除します。
ax.yaxis.set_visible(False) # Y軸を削除します。
ax.set_yticks([]) # Y軸の目盛りを削除します。
# 成績変化比較グラフの境界線を削除します。
ax.spines['left'].set_visible(False) # 左側の境界線を削除する
ax.spines['right'].set_visible(False) # 右枠を削除する
ax.spines['top'].set_visible(False) # 上部の境界線を削除します。
ax.spines['bottom'].set_visible(False) # 下部の境界線を削除します。
# 成績変化比較グラフを出力
plt.show()コードの簡単な説明

1.データ設定
- 学生名と中間、期末試験の成績をリストに保存します。
2.中間試験/期末試験の点数表示
- 中間テスト: 点
x=1にスタンプを押して、名前とスコアを垂直の点線の左側に表示します。 - 期末試験: 点
x=2にスタンプを押して、名前とスコアを垂直の点線の右側に表示します。
3.スコア変化線接続
plot()を使ってスコアを線でつなぎます、 上昇は緑色, 低下は赤いで区分します。
4.垂直の点線を追加
ax.axvline()を使用して中間試験と期末試験の位置を強調します。
5.Y軸と不要な要素を削除
- Y軸と目盛りを削除して、すっきりとしたグラフを作成します。
結果グラフの特徴
- 左側には、中間テストの点数と名前が垂直の点線から少し離れたところに表示されます。
- 右側には期末試験の点数と名前が表示されます。
- スコア上昇は 緑色の線とテキスト低下は 赤い線とテキストに分けられます。
- 不要なY軸と枠線を取り除くことで、グラフがよりスッキリと洗練された形で表示されます。
活用と拡張
この視覚化は、性的変化だけでなく 売上データ、プロジェクト進捗状況 など 2つの視点間の変化を可視化するために活用することができます。色とラベルの配置を適切に調整することで、より直感的な結果を得ることができます。
仕上げ
今度はPythonを活用して 中間試験と期末試験の成績の変化を一目でわかるグラフを作ることができます。コードを直接実行して、自分のデータに合わせて応用してみてください!
今回の成績変化比較グラフのようなユニークな形のPythonの可視化事例があります、 睡眠パターン分析とPythonの可視化:健康的な睡眠のためのデータ活用法 ポストをチェックしてみてください。興味深いと思います!
# コード詳細解説
1.ライブラリの読み込み
matplotlib.pyplot as plt をインポートします。
- matplotlib.pyplot.Pythonライブラリです:データ可視化のために使うPythonライブラリです。
- グラフを描画するすべての関数が含まれているモジュールです。
2.学生名と成績データの設定
students = ['Tom', 'Richard', 'Anna', 'Emily', 'Grace']]. midterm_scores = [75, 70, 65, 60, 45] # 中間テストの成績 final_scores = [55, 40, 75, 70, 65] # 期末試験の成績
- 学生各生徒の名前リストです。
- midterm_scores: 学生の中間考査の成績です。
- final_scores: 学生の期末試験の成績です。
3.グラフ作成とサイズ設定
fig, ax = plt.subplots(figsize=(10, 6)) ax.set_title("Student Exam Scores", fontsize=15)
- plt.subplots(figsize=(10, 6)): 横10、縦6のグラフ領域を生成します。
- ax.set_title(): グラフ上部にタイトルを設定します。
fontsize=15文字サイズを15に設定します。4.中間テストの点数と名前を表示
ax.scatter([1] * len(midterm_scores), midterm_scores, color='red', s=50, zorder=3)
- ax.scatter()点数をつけて中間テストの得点を視覚化します。
[1] * len(midterm_scores): すべての点を x=1 の位置に表示します。midterm_scores: y軸の位置を各生徒の中間テストの点数で設定します。color='red':ドットの色を赤に設定します。s=50:ドットのサイズを50に設定します。zorder=3: 点が線の上に描画されるように設定します。for i, txt in enumerate(midterm_scores): color = 'green' if final_scores[i] > midterm_scores[i] else 'red' ax.text(0.75, midterm_scores[i], f"{students[i]} ({txt})", fontsize=10, color=color, va='center', ha='right')
- for i, txt in enumerate(midterm_scores)各生徒の中間テストの点数と名前を繰り返し表示します。
- color条件:
- 期末試験の点数が中間試験より高い場合は 緑色そうでなければ 赤色で表示します。
- ax.text(): 点の左側にテキスト(生徒名とスコア)を表示します。
0.75: 垂直点線(x=1)から左に離れた位置です。midterm_scores[i]: テキストのy位置を各生徒の得点に合わせます。f"{students[i]} ({txt})": 学生名とスコアを文字列で表示します。ha='right':テキストを右揃えします。va='center'テキストをドットの垂直中央に配置します。5.期末試験の点数と名前表示
ax.scatter([2] * len(final_scores), final_scores, color='green', s=50, zorder=3)
- ax.scatter()点数をつけて期末試験の得点を視覚化します。
[2] * len(final_scores): すべての点を x=2 の位置に表示します。final_scores: y軸の位置を各生徒の期末試験の点数で設定します。color='green':ドットの色を緑色に設定します。for i, txt in enumerate(final_scores): color = 'green' if final_scores[i] > midterm_scores[i] else 'red' ax.text(2.25, final_scores[i], f"{students[i]} ({txt})", fontsize=10, color=color, va='center', ha='left')
- for i, txt in enumerate(final_scores)各生徒の期末試験の点数と名前を繰り返し表示します。
- color条件:
- 期末試験の点数が中間試験より高い場合は 緑色そうでなければ 赤色で表示します。
- ax.text(): 点の右側にテキスト(生徒名とスコア)を表示します。
2.25: 垂直点線(x=2)から右側に離れた位置です。final_scores[i]: テキストのy位置を各生徒の得点に合わせます。ha='left': テキストを左揃えします。va='center'テキストをドットの垂直中央に配置します。6.スコア変化線接続
for i in range(len(students)): color = 'green' if final_scores[i] > midterm_scores[i] else 'red' ax.plot([1, 2], [midterm_scores[i], final_scores[i]], color=color, linewidth=2, zorder=2)
- for i in range(len(students))各生徒の成績の変化を線でつなぎます。
- color条件スコア上昇時 緑色点数低下時 赤色に設定します。
- ax.plot()2つの点を線でつなぎます。
[1, 2]x 軸の位置 (中間試験 → 期末試験)[midterm_scores[i], final_scores[i]]: y軸の位置を中間試験と期末試験の点数で設定します。線幅=2:線の太さを2に設定します。7.垂直点線の追加
ax.axvline(x=1, color='gray', linestyle='--', linewidth=1) ax.axvline(x=2, color='gray', linestyle='--', linewidth=1)
- ax.axvline(): x 軸の特定の位置に垂直の点線を引きます。
x=1中間テストの位置に点線を追加x=2期末試験の位置に点線を追加color='gray'点線の色をグレーに設定します。linestyle='--'点線を設定します。linewidth=1点線の太さを1に設定します。8.X軸設定
ax.set_xticks([1, 2]) ax.set_xticklabels(["Midterm", "Final"], fontsize=12, fontweight='bold')
- set_xticks([1, 2]): x 軸に目盛りを追加します。
- set_xticklabels(): 目盛りラベルを "中間テスト"そして "ファイナル"に設定します。
9.Y軸と縁取り
ax.yaxis.set_visible(False) ax.set_yticks([]) ax.spines['left'].set_visible(False) ax.spines['right'].set_visible(False) ax.spines['top'].set_visible(False) ax.spines['bottom'].set_visible(False)
- Y軸除去:
ax.yaxis.set_visible(False): Y軸を非表示に設定します。ax.set_yticks([]): Y軸の目盛りを削除します。- ボーダーを取り除く:
spines['left'].set_visible(False): 左枠を削除棘['right']: 右枠を削除spines['top']上辺の縁取り取り去りspines['bottom']下辺の縁取り取り去り10.グラフ出力
plt.show()
- plt.show(): グラフを画面に出力します。





