我正在尝试结合使用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高
答案 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