#40 Pythonで始める箱ひげ図 ver2、チャレンジ AI×100業務(製造業)
箱ひげ図は、「#11 Pythonで始める箱ひげ図」にてコードを生成し描画しました。ただ、因子が単一の場合でしたので、複数の箱ひげ図を描画するようにしました。また、データはcsvより読み取ります。
*それでは、スタートです。
*執筆者は以下を参照してください。
使ったツール・準備したこと
Visual Studio Code環境下でのPython
ChatGPT
やってみたこと|コード・ステップ紹介
実行した内容の簡単な流れ
ChatGPTに次の会話をしました。
コードを生成してください。
内容は、csvファイルをよみとり、選択した列の箱ひげ図を描画します。このとき、描画する因子はGUIで選択させてください。csvファイルの先頭行が因子の名前となっています。
■ 下のグラフが描画されました。

やはり、箱ひげ図は、並べると他の結果と比較しやすいですね。
今後の展開・アイデア
次回取り組みたいこと;
・次は、バイオリンプロットです。
■ 今回のコード
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib
import tkinter as tk
from tkinter import filedialog, messagebox
# 日本語フォント設定(Windows環境を想定)
matplotlib.rcParams['font.family'] = 'MS Gothic'
# ファイル選択ダイアログ
def select_file():
filepath = filedialog.askopenfilename(
filetypes=[("CSV files", "*.csv"), ("All files", "*.*")]
)
if not filepath:
return
try:
try:
df = pd.read_csv(filepath, encoding="utf-8-sig")
except UnicodeDecodeError:
df = pd.read_csv(filepath, encoding="shift_jis")
select_columns(df)
except Exception as e:
messagebox.showerror("読み込みエラー", str(e))
# カラム選択ウィンドウ
def select_columns(df):
window = tk.Toplevel()
window.title("因子を選択してください")
tk.Label(window, text="Ctrl + クリックで複数選択").pack()
listbox = tk.Listbox(window, selectmode=tk.MULTIPLE, exportselection=False, width=50)
for col in df.columns:
listbox.insert(tk.END, col)
listbox.pack()
def on_plot():
selected_indices = listbox.curselection()
selected_columns = [df.columns[i] for i in selected_indices]
if len(selected_columns) < 1:
messagebox.showwarning("選択不足", "1つ以上の因子を選択してください。")
return
plot_boxplot(df[selected_columns])
window.destroy()
tk.Button(window, text="描画", command=on_plot).pack(pady=10)
def plot_boxplot(df):
plt.figure(figsize=(10, 6))
sns.boxplot(data=df, width=0.3, color="lightgray") # 箱を細くして色を灰色に
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()
# メインウィンドウ
root = tk.Tk()
root.title("CSV箱ひげ図ツール")
root.geometry("300x150")
tk.Label(root, text="CSVファイルを選択して因子を指定").pack(pady=10)
tk.Button(root, text="ファイルを開く", command=select_file).pack(pady=10)
root.mainloop()
