LoginSignup
9
8

More than 5 years have passed since last update.

JupyterにpandasのDataFrameとMatplotlibのグラフを並べて表示する

Last updated at Posted at 2018-06-18

プレゼン資料などを作る際に、グラフとテーブルデータを並べて表示したくなるときがあります。

Jupyterではこのパターンが多いのではないでしょうか。

  • テーブルデータ -> pandasのDataFrame
  • グラフ -> Matplotlib

下記のライブラリを使って実装してみます。

  • IPython.display.HTML
    HTMLをそのままJupyterに表示
  • jinja2
    テンプレートエンジン
  • io.BytesIO, base64
    Matplotlibのグラフをバイナリデータに出力

サンプルコードはこんな感じです。

from io import BytesIO
import base64
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from IPython.display import HTML
from jinja2 import Template


# 表示するテーブルを作成
np.random.seed(1)
df = pd.DataFrame(np.random.rand(4, 4), columns=list("ABCD"))

# 表示するグラフを作成
bytes_data = BytesIO()
plt.ioff()  # 対話的操作をオフ
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
ax.plot(df)
fig.savefig(bytes_data, format="png")
plt.close(fig)
png_data = base64.b64encode(bytes_data.getvalue()).decode()

# HTML出力
html_tpl = """
<table>
  <tr>
    <td><img src="data:image/png;base64,{{ png_data }}" /></td>
    <td>{{ table }}</td>
  </tr>
</table>
"""
tpl = Template(html_tpl)
html_text = tpl.render({"png_data": png_data, "table": df.to_html()})

HTML(html_text)

このように表示されます。

image.png

いかがでしょうか?HTML形式なので、位置やフォントなど見栄えの調整もし易くなると思います。
RISEと組み合わせることでプレゼンが捗りそうです。

【2018/06/18 21:20追記】 余計なグラフがshowで表示されることを抑制する処理を追加

9
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
8