ipywidjetsによるインタラクティブな各凡例の更新
解決したいこと
グラフの描画の際にプログラム中ではなく、ipywidjetsを用いてインタラクティブに各凡例の文字列を更新できるようにしたいです。
データフレームのlabel列の要素の種類や数が変わる前提でプログラムを作りたく困っている次第です。
以下のプログラムを利用すると、Jupyterのログには凡例が更新されたグラフが表示されているのですが、Notebook上では更新されない状況です。
よろしくお願いいたします。
import pandas as pd
import matplotlib.pyplot as plt
import ipywidgets as widgets
from IPython.display import display, clear_output
# 仮のデータフレームを作成
df = pd.DataFrame({
'label': ['A', 'B', 'C', 'A', 'B', 'C'],
'value': [1, 2, 3, 4, 5, 6]
})
# ラベルごとに値を合計
grouped_df = df.groupby('label')['value'].sum()
# 初期の凡例名を設定
initial_legend_names = grouped_df.index.tolist()
# テキストボックスを作成し、初期の凡例名を設定
text_boxes = [widgets.Text(value=name) for name in initial_legend_names]
# 描画用の関数を定義
def plot_bars(legend_names):
fig, ax = plt.subplots()
bars = ax.bar(grouped_df.index, grouped_df.values)
for bar, legend_name in zip(bars, legend_names):
bar.set_label(legend_name)
ax.legend()
plt.show()
# テキストボックスの値が変更されたときにグラフを再描画する関数
def on_text_change(change):
new_legend_names = [tb.value for tb in text_boxes]
clear_output(wait=True)
display(widgets.VBox(text_boxes))
plot_bars(new_legend_names)
for tb in text_boxes:
tb.observe(on_text_change, names='value')
# 初期のグラフを描画
display(widgets.VBox(text_boxes))
plot_bars(initial_legend_names)