在Jupyter实验室中使用交互式绘图时控制图形高度

时间:2019-07-16 07:52:21

标签: matplotlib jupyter-lab ipywidgets

我正在尝试结合使用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参数如何,图形都会自动调整大小。 我希望这两者之一可以控制输出大小,特别是因为没有更多的选项可以手动调整图形大小。

作为附加信息,无论我做什么,处理Output小部件内图形的HTML div始终为500px高

2 个答案:

答案 0 :(得分:0)

经过大量研究后找到了解决方案。当前在github上有一个未解决的问题,讨论%matplotlib widget与其他matplotlib相比的行为方式不同。 Here is the link to the discussion

基本上,此后端利用jupyter小部件,并将图形传递给Output小部件。就我而言,我将其嵌套到另一个“输出”小部件中以捕获绘图。 在这种情况下,由于问题出在中间的Output小部件上,因此图的figsize属性和外部Output小部件的CSS布局属性都没有影响。

好消息是,我们需要更改的CSS布局属性已公开。要修改它们,我们可以使用:

fig.canvas.layout.width = '100%'
fig.canvas.layout.height = '900px'

答案 1 :(得分:0)

上述解决方案对我不起作用。既没有使用 rcParams 全局设置绘图尺寸,我仍然设法使用 fig = plt.figure(figsize=(12,12)) 在函数内部设置图形尺寸:

from ipywidgets import interactive
import matplotlib.pyplot as plt

import numpy as np

def f(r,g,b):
    fig = plt.figure(figsize=(15,15)) # <-- Here the figure dimension is controlled
    ax = fig.add_subplot()
    ax.imshow(np.array(np.dstack([compvis[r],compvis[g],compvis[b]]))/65536)
    plt.show()

interactive_plot = interactive(f, r = (0,15),g = (0,15),b = (0,15))

interactive_plot