在 jupyter lab 中使用交互式绘图时控制图形高度
Controlling figure height when using interactive plots in 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 div 处理输出小部件内的图表始终是 500 像素高度
经过大量研究找到了解决方案。目前在 github 上有一个未解决的问题,讨论 %matplotlib widget
与 matplotlib 的其余部分相比有何不同。 Here is the link to the discussion
基本上这个后端利用了 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
我正在尝试结合使用 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 div 处理输出小部件内的图表始终是 500 像素高度
经过大量研究找到了解决方案。目前在 github 上有一个未解决的问题,讨论 %matplotlib widget
与 matplotlib 的其余部分相比有何不同。 Here is the link to the discussion
基本上这个后端利用了 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