見出し画像

Code Interpreterで入院後経過表グラフを簡単に作成する


0. はじめに

AIは文章の要約や翻訳は非常に優秀ですが, グラフ作成は苦手です。

グラフ作成のPluginsが開発されていますが基本的には簡単なグラフしか作成できない印象です。入院後経過表などの複雑なグラフはこちらが詳細なプロンプトを提示しないと作成できませんでした。

今回のバージョンアップ (2023/7) Code Interpreterで Python+matplotlib によるグラフ作成の性能が実装されています。これによりPythonの知識が一切不要で複雑なグラフ作成が可能となりました。

1. 導入

ChatGPT plusに加入している必要があります。ChatGPT 左下のSettingsから

Beta features の Code Interpreterを有効にします。

GPT4→Code Interpreter Betaにチェックを入れます。

チャット欄の Send a message の左にある⊕ボタンを押せば ファイルのアップロードができます。例えばグラフのjpeg画像を渡して「どのように作成したら良いでしょうか?アドバイスください。」など質問することもできます。

2. 作成

2.1 入院後経過表

症例報告で用いる入院後経過表は, 2軸 折れ線グラフを独立して重ね合わせて表示したり, 使用薬剤を上に配置したりと複雑であり基本的に骨が折れる作業です。ChatGPTに作成を依頼する場合これまで, 解釈の余地がないような詳細かつtightなプロンプトが必要となってきました。

Code Interpreterを用いることで簡単かつ直感的なプロンプト, また, 対話することで確実に作成することが可能となりました。

2.2 1軸グラフ (テキストファイルから)

折れ線をグラフを描画してください

データセット:
day CRP [mg/dL]
1 10.2
2 8.0
3  
4 2.3
5  
6 1.2
7  
8 0.2
9 0.03
10 0.5

まずは本当に最小限のプロンプトです。使うデータはテキストファイル (手打ち)で準備しました。

さすがに思っているのとは違うグラフができます。
条件を追加します。

要件:
・CRPのデータを折れ線グラフで表示する マーカーはピンクの丸
・CRPのデータに欠損値がある場合はそれらを前後の値で補間する
・x軸 dayの 区切りを1にして
・グラフの背景にはグリッドを描かない

色の設定
・CRPグラフの色ホットピンクに
・CRPの文字とy軸目盛を同じピンクに 

作りたいグラフが簡単に出来ました。 修正が必要なら追加のプロンプトでで調整を行います。

2.3 1軸グラフ (CSVファイルから)

もちろんCSV形式のデータセットにも対応しています。

Chat 欄左の⊕ボタンから手持ちのエクセルファイルをアップロードします。

先ほどと同じプロンプトで同様にグラフが作成できます。

2.4 2軸グラフ

先ほどの続きで以下のプロンプトを追加するだけです。

2軸目の折れ線をグラフを追加して描画してください。

データセット:

Y軸2 WBC [/uL]

day WBC
1 10200
2 8900
3
4 7700
5
6 5500
7
8 4230
9
10 5000

ほぼ目的のグラフが出来ました。

styleを整えるプロンプトを追加します。

Clinical Course ピンクでなく黒
背景グリッド不要
WBC 青丸でなく青四角に変更

なぜか背景のグリッドが表示されていたのでもう一度「作り直して」もらったらうまくいきました。コツとしては1度で完璧なものが出来ないですがだいたい2-3回で思い通りのものが作れます。

2.4 2軸+薬剤

次は入院後経過表でよく表現する, 折れ線グラフの上にある「使用薬剤」の図の追加です。ここでは適当に入院時からステロイドを漸減使用するという図を作ってみたいと思います。

グラフを描画してください。
day PSL CRP
1 40 10.2
2 40 8.0
3 40 
4 40 2.3
5 30 
6 30 1.2
7 0 
8 0 0.2
9 0 0.03
10 0 0.5

要件:
PSL 棒グラフ
CRP 折れ線グラフ 下にCRP 上にPSL 

雑なプロンプトでは当然↓のようなグラフができます。

整えていきます。二つのグラフが重なってしまい, さらに棒グラフが縦に長いことが問題です。

PSLとCRPのグラフはそれぞれ別に作成して下さい。
PSLのグラフの高さはCRPのグラフの高さの1/4にしてください。

整えていきます。

棒グラフは隣り合う棒が接触するように描画して下さい。
グラフ背景のグリッドは非表示にしてください。
欠損値を補間してください。

大分様になりました。これで完成でも良さそうですがさらに整えていきます。

CRPのグラフ, y軸目盛, labelをホットピンク マーカーはホットピンクの丸
PSLのグラフ, y軸目盛, labelを濃い紫 にしてください。

少し手順をふみましたが「日本語のプロンプト」のみで目標のグラフが作成できました。

これまでは以下のように 「curve type, interpolateNulls: true, ticks」 などのcodeを使用しないとこのようなグラフを作成することは不可能でした。

これまでのプロンプト (参考):
2軸の折れ線(curve type :none)グラフに描画するためのhtmlコードを作成してください。
欠損値は補間してください(interpolateNulls: true。)
軸1左がCRPと軸2右がWBC(vAxesオプションで左側と右側の軸を定義。seriesオプションで
データ系列にどちらの軸を使用するかを定義。
データ系列が 0 の場合は左側の軸を、データ系列が 1 の場合は右側の軸を使用)
vaxesオプションを用いてそれぞれ軸のタイトル, 色, マーカーを設定。
CRPは円 (pointshape:circle, size7)、WBCは四角(pointshape:square, size7)のマーカー。
グラフエリア内のグリッドは縦横(hAxis, vAxis)とも非表示(Y1軸, Y2軸それぞれのgridlines
プロパティにcolor: 'transparentを設定)。 ただしy=0(baseline color)は透明ではなく黒。
横軸の目盛りは1区切り(ticksオプション[1, 2, 3]などで設定)。

色の設定:
軸1 CRP:グラフ, グラフマーカー, 軸label, 軸タイトル全て 鮮やかなマゼンタピンク(#FF0064)
軸2 WBC:グラフ, グラフマーカー, 軸label, 軸タイトル全て青(#0000FF)

幅900px  高さ500px
title: Clinical Course
横軸label:day
Y軸1 label左: CRP [mg/dL] 
Y軸2 label右:WBC [/uL]

day CRP WBC
1	10.2 10200
2	8.0   8900
3
4	2.3  7700
5
6	1.2 5500
7
8	0.2 4230
9
10	0.0 5000

現時点では完成したグラフを直接, excel やpowerpointで使用できません
一旦, 画像ファイルとして保存する必要があります。

PNGでダウンロード出来るようにしてください。


リンク先をクリックしpng形式でダウンロードします。


初めて作成するときは大変ですが, 一旦作成しておけば再利用が便利です。

2.5 2軸3変数グラフ

別の患者data, 日にちが異なっている, 血液検査項目 種類, 数が異なっていてもそのまま流用できます。
例えば, 引き続き以下のようにプロンプトします。

AST/ALT は左 (共通のy軸), CRPは右で作成して下さい。
day CRP [mg/dL] AST [IU/L] ALT [IU/L]
1 10.2 350 480
2 8.0 280 580
3  
4
5 1.2 85 652
6
7
8 0.2 55 332

2軸3変数のグラフができました。

3. 便利なプロンプト

作成時, グラフを再利用, 応用する上でで便利なプロンプトを羅列します。

描画して下さい。

python+matplotlibでグラフを作成します。自分で① data setを直接入力する ② CSVファイルをアップロードする ③ python codeを入力する (※後述します) で主に作成します。
特に③は非常に便利です。

欠損値を補間してください。

前後の値でデータどうしをつなげます。

グラフの背景を〇〇に

グラフ背景のグリッドを非表示にしています。

区切りを〇〇に
左は区切り2 右は区切り1

右はx軸の「区切り」を1にしています。 1日ごとの区切り。

マーカーを〇〇に
左はマーカーなし 右はマーカーを丸にしてます。
png形式でダウンロードできるようにしてください。
pythonコードください

そして最も便利なのは「python code」に出力と思います。
一度作成したグラフはコードに変換する事で再利用できます。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# Given data
data = {
    'day': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
    'PSL': [40, 40, 40, 40, 30, 30, 0, 0, 0, 0],
    'CRP': [10.2, 8.0, np.nan, 2.3, np.nan, 1.2, np.nan, 0.2, 0.03, 0.5]
}

# Create a dataframe
df = pd.DataFrame(data)

# Interpolate missing values in CRP
df['CRP'] = df['CRP'].interpolate()

# Define color settings
psl_color = '#800080'  # Dark purple
crp_color = '#FF69B4'  # Deep pink

# Create a figure with two subplots with different heights
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 6), gridspec_kw={'height_ratios': [1, 3]})

# PSL Bar graph
ax1.bar(df['day'], df['PSL'], color=psl_color, edgecolor=psl_color, align='edge', width=1.0)
ax1.set_ylabel('PSL', color=psl_color)
ax1.tick_params(axis='y', colors=psl_color)
ax1.tick_params(axis='x', bottom=False, labelbottom=False)  # Remove x-axis labels
ax1.spines['bottom'].set_visible(False)  # Remove x-axis line at y=0
ax1.grid(False)  # Remove grid

# CRP Line graph
ax2.plot(df['day'], df['CRP'], color=crp_color, marker='o', markersize=8, markerfacecolor=crp_color)
ax2.set_ylabel('CRP', color=crp_color)
ax2.set_xlabel('Day')
ax2.tick_params(axis='y', colors=crp_color)
ax2.xaxis.set_ticks(np.arange(min(df['day']), max(df['day'])+1, 1))  # Set x-axis ticks
ax2.grid(False)  # Remove grid

plt.tight_layout()

# Save the figure as a PNG file
fig.savefig("/path/to/save/graph.png")

plt.show()

例えば「このコードをもとに〇〇のデータでグラフを作ってください」など雑なプロンプトで次回から作成可能になります。

4. デザイン性に優れたグラフ

python+matplotlibを使用する大きなメリットとしてデザイン性に優れたグラフの作成ではないでしょうか。SVG (Scalable Vector Graphics) 形式にすることで背景を透明, かつ高解像度のグラフ出力が可能です。

SVG形式で出力してください

保存したファイルをパワーポイントに張り付けました。
背景が紺のスライドをバックに透明のグラフを張り付けることでデザイン性に優れたスライドを作成することができます。

枠を白に
WBCをシアン (青)
タイトルをClinical Course (黄色) 上で表示してください

枠線 (spines) を白, 他の色を整えて背景色に合うような色に調整しています。

5 まとめ

今回のバージョン (Code Interpreter) で飛躍的にAIによるグラフ作成は進歩したのではないでしょうか。

症例報告用パワーポイントのスライドに張り付けにて活用してください。