Как изменить размер рисунка matplotlib в соответствии с размером ipywidgets.Output () автоматически? - PullRequest
0 голосов
/ 17 апреля 2020

Я создаю веб-приложение с интерактивными сюжетами на основе Jupyter и Voila . Внутри ноутбука я использую ipywidgets для обработки интерактивности и %matplotlib widget бэкэнда, чтобы я мог обновлять свои графики, не перерисовывая всю фигуру (не работает в %matplotlib inline, а %matplotlib notebook не отображается в Voila) .

Моя проблема в том, что я не могу установить размер фигуры так, чтобы он соответствовал размеру его холста или контейнера, который автоматически изменяет размер при изменении размера окна.

Это небольшой рабочий пример моей ситуации:

%matplotlib widget
from IPython.display import display
import matplotlib.pyplot as plt
import ipywidgets as widgets
import numpy as np

# Output widget that will contain the figure
out = widgets.Output(layout = {
    'border': '1px solid black',
    # 'width': '100%' # Not needed and does not help
})

# Initializing the figure within out
with out:
    fig, ax = plt.subplots(1, constrained_layout=True)
    fig.set_size_inches(7,5) # Is not automatic and stays the same on window resize
    fig.canvas.layout.border = '1px solid red'
    # fig.canvas.layout.width = '100%' # Not needed and does not help


# Func for updating the data in ax within out
def update_ax(slider):
    with out:
        plt.cla() # Clearing the ax
        ax.plot(np.arange(10), np.random.random(10)* slider)

slider = widgets.FloatSlider(10)      
display(slider)
iplot = widgets.interactive(update_ax, slider=slider)
iplot.update()
display(out)

Это вывод: Output of the code above

Я хочу, чтобы фигура (синий прямоугольник) охватывала 100% ширины холста ( красный прямоугольник), и я хочу, чтобы он изменял размеры автоматически, так как ширина холста изменяется с изменением выходного контейнера (черный прямоугольник), который изменяется с изменением ширины окна. Например, когда я вручную изменяю размер окна.

Я думаю, что это должно быть возможно, так как угол (в зеленом круге) изменяет размеры, но только на основе ручного пользовательского ввода, а не изменения ширины окна. Хорошим решением было бы что-то вроде 'fig.set_size_relative (' 100% ',' auto ')', но это, очевидно, не реализовано.

Любая помощь очень ценится, я уже убил гораздо больше времени с это чем это здорово :) 1026 *

...