Jupyter Notebook(RISE)中Matplotlib绘图与Markdown并排展示报错求助
解决Jupyter Notebook(RISE)中Matplotlib绘图与Markdown文本并排展示的错误
问题原因
你碰到的TraitError是因为ipywidgets.Box的子元素必须是标准的ipywidgets组件,而直接传入matplotlib的Figure对象不符合要求——它不是widget类型,所以触发了类型校验错误。
解决方案
需要把matplotlib绘图包装成ipywidgets支持的组件,同时修正原代码里的语法错误(Markdown字符串未闭合),具体步骤:
- 用
ipywidgets.Output组件承载matplotlib图表 - 在Output的上下文管理器中绘制并显示图表
- 使用
widgets.Markdown直接渲染Markdown文本(比转HTML更简洁) - 把包装好的图表组件和Markdown组件放入Box实现并排布局
修改后的完整代码
from ipywidgets import widgets, Layout from IPython.display import display import numpy as np import matplotlib.pyplot as plt def func(x, a, b, c, d): return a + b*np.exp(c*x + d) the_x = np.arange(0, 10, 0.5) the_y = func(the_x, 1, 1, -1, 2) # 创建Output组件承载matplotlib绘图 plot_output = widgets.Output() with plot_output: fig, ax = plt.subplots() ax.plot(the_x, the_y) plt.show() # 在Output中显示图表 len_x = len(the_x) # 直接用widgets.Markdown渲染文本 mdout = widgets.Markdown(f"""There are {len_x} **elements** of both `the_x`, and `the_y`; Those values are plotted on the diagram on the left""") box_layout = Layout(display='flex', flex_flow='row', justify_content='space-around', width='auto' ) # 将两个widget组件放入Box hbox1 = widgets.Box(children=[plot_output, mdout], layout=box_layout) display(hbox1)
额外说明
- 用
Output包装matplotlib图表后,就能和其他ipywidgets组件兼容,实现Flex布局的并排效果 widgets.Markdown可以直接解析Markdown语法,无需手动转HTML,更简洁可靠- 原代码中Markdown字符串末尾缺少闭合的双引号和括号,已经在修改后的代码中修复
内容的提问来源于stack exchange,提问作者Spring
相关产品推荐
相关产品推荐

