Ответ 1
IPython Notebook отображает виджеты перед любым выходом. Единственное, что вы можете сделать, это разместить ваши сюжеты внутри HTML-виджета. Это можно поместить в любую позицию относительно других виджетов.
Если вы это сделаете, вам нужно явно разместить свой сюжет в HTML-виджетах. Это может быть немного сложно, но быстрым решением было бы сохранить байтовую строку графика в буфер, а затем поместить байтовую строку в тег изображения.
Вот пример (Gist здесь):
import base64
import io
import matplotlib.pyplot as plt
import ipywidgets as widgets
from IPython.display import display
def handle_input1(slope):
plt.figure()
plt.plot([x * slope for x in range(0, 11)])
plt.ylim((0,10))
output1HTML.value = plot_to_html()
plt.close()
def handle_input2(curvature):
plt.figure()
plt.plot([x * x * curvature for x in range(0, 11)])
plt.ylim((0,100))
output2HTML.value = plot_to_html()
plt.close()
def plot_to_html():
# write image data to a string buffer and get the PNG image bytes
buf = io.BytesIO()
plt.savefig(buf, format='png')
buf.seek(0)
return """<img src='data:image/png;base64,{}'/>""".format(base64.b64encode(buf.getvalue()).decode('ascii'))
plt.ioff()
heading1HTML = widgets.HTML("""<h1>Slope</h1>""")
input1Float = widgets.FloatSlider(value=0.5, min=0.0, max=1.0, step=0.01, description="slope: ")
widgets.interactive(handle_input1, slope=input1Float)
output1HTML = widgets.HTML()
heading2HTML = widgets.HTML("""<h1>Curvature</h1>""")
input2Float = widgets.FloatSlider(value=0.5, min=0.0, max=1.0, step=0.01, description="curvature: ")
widgets.interactive(handle_input2, curvature=input2Float)
output2HTML = widgets.HTML()
display(widgets.Box([heading1HTML, input1Float, output1HTML, heading2HTML, input2Float, output2HTML]))
handle_input1(input1Float.value)
handle_input2(input2Float.value)
EDIT 1: виджеты IPython перенесены на IPython.html
; обновил код соответственно.
EDIT 2: использование widgets.interactive в соответствии с последней документацией по виджетам IPython; обновить местоположение виджетов IPython; добавление ASCII-кодирования