Управление высотой фигуры при использовании интерактивных графиков в jupyter lab

Я пытаюсь использовать комбинацию 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 пикселей, независимо от того, что я делаю.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
7
0
3 036
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Нашел решение после долгих исследований. В настоящее время на 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

Другие вопросы по теме