在jupyterlab中使用按钮控制matplotlib绘图,并实时更新绘图
直接上代码
import matplotlib.pyplot as plt
import numpy as np
import ipywidgets as widgets
import time
from IPython.display import Javascript, display, clear_output, update_display
class PltTest:
def __init__(self):
self.output = widgets.Output()
self.tbtn1 = widgets.ToggleButton(value=False, description='Click 1', disabled=False,
button_style='', # 'success', 'info', 'warning', 'danger' or ''
tooltip='Description',
icon='check' # (FontAwesome names without the `fa-` prefix)
)
self.tbtn2 = widgets.ToggleButton(value=False, description='Click 2', disabled=False,
button_style='', tooltip='Description', icon='check')
# An HBox lays out its children horizontally
self.ui = widgets.HBox([self.tbtn1, self.tbtn2])
self.fig, self.ax = None, None
self.fig1, self.ax1 = None, None
self.line = None
self.line1 = None
self.out1 = widgets.interactive_output(self.plot1, {'tb1': self.tbtn1})
self.out2 = widgets.interactive_output(self.plot2, {'tb2': self.tbtn2})
def plot1(self, tb1):
print("tb1:", tb1)
# if tb1['new']:
if tb1:
with self.output:
self.fig, self.ax = plt.subplots(1, figsize=(5, 3.5))
self.ax.set_title('figure1')
# display(fig)
plt.show()
else:
self.output.clear_output()
# clear_output()
plt.clf()
plt.close()
def plot2(self, tb2):
print("tb2:", tb2)
if tb2:
with self.output:
self.fig1, self.ax1 = plt.subplots(1, figsize=(5, 3.5))
self.ax1.set_title('figure2')
# display(fig1)
plt.show()
else:
self.output.clear_output()
# clear_output()
plt.clf()
plt.close()
def draw1(self):
# print("draw1")
# plt.cla()
if self.line is not None:
self.line.remove()
# line1.remove()
# clear_output(wait=True)
if self.fig and self.ax:
x = np.cumsum(np.random.randn(150)) + 100.0
self.line, = self.ax.plot(x, np.sin(x))
self.line.set_ydata(np.cumsum(np.random.randn(150)) + 100.0)
self.ax.relim()
# 重设坐标轴,让图像更协调
self.ax.autoscale_view()
self.fig.canvas.draw()
time.sleep(0.3)
def draw2(self):
# print("draw2")
# plt.cla()
if self.line1 is not None:
self.line1.remove()
# line1.remove()
# clear_output(wait=True)
if self.fig1 and self.ax1:
x = np.cumsum(np.random.randn(150)) + 100.0
self.line1, = self.ax1.plot(x, np.sin(x))
self.line1.set_ydata(np.cumsum(np.random.randn(150)) + 100.0)
self.ax1.relim()
# 重设坐标轴,让图像更协调
self.ax1.autoscale_view()
self.fig1.canvas.draw()
time.sleep(0.3)
def dis(self):
out1 = widgets.interactive_output(self.plot1, {'tb1': self.tbtn1})
out2 = widgets.interactive_output(self.plot2, {'tb2': self.tbtn2})
# tbtn1.observe(plot1, names='value')
# tbtn2.observe(plot2, names='value')
display(self.ui, out1, out2)
在jupyterlab中显示按钮点击可显示或关闭matplotlib绘图
# 交互式绘图需要安装 pip install ipympl %matplotlib widget from plt_test import PltTest pt = PltTest() pt.dis()
实时更新绘图内容
for i in range(10):
pt.draw1()
pt.draw2()

浙公网安备 33010602011771号