Я пытаюсь использовать комбинацию JupyterLab и последних версий ipywidgets, чтобы иметь базовый графический интерфейс для изучения некоторых данных. Однако я не могу найти способ настроить высоту фигуры для интерактивного сюжета.
Блокнот загружает какой-то файл, затем пользователь может передать некоторые данные с помощью виджетов (в коде под текстовым полем). Наконец, нажатием кнопки создается график, который передается виджету вывода.
Это пример кода:
import pandas as pd
import matplotlib.pyplot as plt
from IPython.display import clear_output, display
import ipywidgets as widgets
data = pd.read_csv('data.csv')
def show_results(input):
if 'fig' in locals():
del fig
with out:
clear_output(True)
fig, ax = plt.subplots(1, 1)
ax.axis('equal')
data.loc[input.value].plot(cmap='inferno_r', column='probability', ax=ax, legend=True)
plt.show()
input = widgets.Text(placeholder='input field', description='Input:')
showMe = widgets.Button(
description='Show me the results',
tooltip='Show me',
)
out = widgets.Output(layout = {
'width': '100%',
'height': '900px',
'border': '1px solid black'
})
showMe.on_click(show_results)
display(input)
display(showMe)
display(out)
Проблема в том, что размер графика автоматически изменяется независимо от размера виджета «Вывод» и от переданного параметра figsize. Я ожидаю, что один из двух будет контролировать размер вывода, особенно потому, что больше нет возможности изменять размер графика вручную.
В качестве дополнительной информации HTML-раздел, связанный с графиком внутри виджета «Вывод», всегда имеет высоту 500 пикселей, независимо от того, что я делаю.
Нашел решение после долгих исследований. В настоящее время на github есть открытый вопрос, в котором обсуждается, как %matplotlib widget
ведет себя иначе по сравнению с остальной частью matplotlib. Вот ссылка на обсуждение
По сути, этот бэкэнд использует преимущества виджетов jupyter и передает фигуру виджету вывода. В моем случае я вкладывал это в другой виджет вывода, чтобы захватить сюжет. В этом случае ни атрибут figsize для графика, ни атрибуты компоновки CSS для внешнего виджета вывода не влияют, поскольку проблема связана с этим промежуточным виджетом вывода.
Хорошей новостью является то, что атрибуты макета CSS, которые нам нужно изменить, доступны. Чтобы изменить их, мы можем использовать:
fig.canvas.layout.width = '100%'
fig.canvas.layout.height = '900px'
Приведенное выше решение не сработало для меня. Ни установка размера графика глобально с помощью rcParams
, тем не менее, мне удалось заставить его работать, устанавливая размер фигуры внутри функции с помощью fig = plt.figure(figsize=(12,12))
:
from ipywidgets import interactive
import matplotlib.pyplot as plt
import numpy as np
np.random.rand(33,20)
def f():
fig = plt.figure(figsize=(15,15)) # <-- Here the figure dimension is controlled
ax = fig.add_subplot()
ax.imshow(np.random.rand(33,20)/65536)
plt.show()
interactive_plot = interactive(f, r = (0,15),g = (0,15),b = (0,15))
interactive_plot