MatplotlibおよびPlotly Charts#


pictures.add() を使えば、簡単にMatplotlibのplotをExcelの図として貼り付けることができます。



import matplotlib.pyplot as plt
import xlwings as xw

fig = plt.figure()
plt.plot([1, 2, 3])

sheet = xw.Book().sheets[0], name='MyPlot', update=True)


update=True を設定すれば、Excelでプロットのサイズや位置の変更が続けて、同じ名前('MyPlot')で pictures.add() を実行すれば、サイズや位置を変えずに図を更新できます。


上記のコードを RunPython で呼び出し、ボタン等に登録すれば、Excelと統合できますしクロスプラットフォームで動作します。

しかしながら、Windowsでは UDF を次のように設定することでさらに統合することができます。:

def myplot(n, caller):
    fig = plt.figure()
    plt.plot(range(int(n))), name='MyPlot', update=True)
    return 'Plotted with n={}'.format(n)




サイズ、位置および他のプロパティは pictures.add() 内の引数としてか、戻り値のpictureオブジェクトを操作することで設定できます。 xlwings.Picture() をご覧ください。


>>> sht = xw.Book().sheets[0]
>>>, name='MyPlot', update=True,
                     left=sht.range('B5').left, top=sht.range('B5').top)


>>> plot =, name='MyPlot', update=True)
>>> plot.height /= 2
>>> plot.width /= 2

Matplotlib fitureの取得#

matplotlib figure オブジェクトの取得方法をいくつか示します:

  • Pyplot インターフェースで:

    import matplotlib.pyplot as plt
    fig = plt.figure()
    plt.plot([1, 2, 3, 4, 5])


    import matplotlib.pyplot as plt
    plt.plot([1, 2, 3, 4, 5])
    fig = plt.gcf()
  • オブジェクト指向インターフェースで:

    from matplotlib.figure import Figure
    fig = Figure(figsize=(8, 6))
    ax = fig.add_subplot(111)
    ax.plot([1, 2, 3, 4, 5])
  • Pandasで:

    import pandas as pd
    import numpy as np
    df = pd.DataFrame(np.random.rand(10, 4), columns=['a', 'b', 'c', 'd'])
    ax = df.plot(kind='bar')
    fig = ax.get_figure()


When working with Google Sheets, you can use a maximum of 1 million pixels per picture. Total pixels is a function of figure size and dpi: (width in inches * dpi) * (height in inches * dpi). For example, fig = plt.figure(figsize=(6, 4)) with 200 dpi (default dpi when using pictures.add()) will result in (6 * 200) * (4 * 200) = 960,000 px. To change the dpi, provide export_options: pictures.add(fig, export_options={"bbox_inches": "tight", "dpi": 300}). Existing figure size can be checked via fig.get_size_inches(). pandas also accepts figsize like so: ax = df.plot(figsize=(3, 3)). Note that "bbox_inches": "tight" crops the image and therefore will reduce the number of pixels in a non-deterministic way. export_options will be passed to figure.figsave() when using Matplotlib and to figure.write_image() when using Plotly.

Plotly static charts#


In addition to plotly, you will need kaleido, psutil, and requests. The easiest way to get it is via pip:

$ pip install kaleido psutil requests

or conda:

$ conda install -c conda-forge python-kaleido psutil requests

See also:



import xlwings as xw
import as px

# Plotly chart
df =
fig = px.scatter(df, x="sepal_width", y="sepal_length", color="species")

# Add it to Excel
wb = xw.Book()
wb.sheets[0].pictures.add(fig, name='IrisScatterPlot', update=True)