小能豆

Ipython Notebook 和 Matplotlib:如何将绘图包装在 html div 中?

py

我想css在我的部分情节中添加一些内容(具体来说,我想设置float:left)。

我如何在 div 内生成图表,以便可以用来css控制其布局?

例如,对于代码

def simple_plot(ax = None):
    if ax is None:
        fig, ax = plt.subplots()
    a = [1,2,3,4]
    b = [3,4,5,6]
    plt.plot(a, b,'-', color='black')

simple_plot()

默认输出的 htmlIpython Notebook

<div class="output_area">
  <div class="prompt"></div>
  <div class="output_subarea output_png">
    <img src="data:image/png;>

对于某些图,我想用 html/css 包装它,如下所示:

<div class="output_area">
  <div class="prompt"></div>
  <div class="output_subarea output_png">
    <div class="custom-css-for-matplotlib"> ## custom html/css code wrapper

我怎样才能做到这一点?

如果我可以在单元格中简单地编写如下代码,那就太棒了:

<div class='custom css class'>
simple_plot()
</div>

阅读 4

收藏
2024-11-20

共1个答案

小能豆

在 Jupyter Notebook 中,您可以通过使用 IPython 的 HTML 渲染功能将 matplotlib 图像包装在自定义 HTML 和 CSS 中。这是一个实现的示例步骤:

实现步骤

  1. 使用 matplotlib 绘制图。
  2. 将图形保存为 PNG 格式的 Base64 数据 URL。
  3. 使用 IPython 的 HTMLdisplay 方法,将图像嵌入到带有自定义 CSS 的 HTML 中。

以下是完整的代码示例:

import matplotlib.pyplot as plt
from io import BytesIO
import base64
from IPython.display import HTML, display

# 定义绘图函数
def simple_plot():
    fig, ax = plt.subplots(figsize=(4, 3))  # 控制图的大小
    a = [1, 2, 3, 4]
    b = [3, 4, 5, 6]
    ax.plot(a, b, '-', color='black')

    # 将图保存到内存
    buf = BytesIO()
    fig.savefig(buf, format="png", bbox_inches='tight')
    buf.seek(0)
    img_base64 = base64.b64encode(buf.read()).decode('utf-8')
    buf.close()
    plt.close(fig)

    # 生成 HTML 代码
    html_code = f"""
    <div class="custom-css-for-matplotlib" style="float:left; margin-right:10px;">
        <img src="data:image/png;base64,{img_base64}" style="width:100%; max-width:300px;"/>
    </div>
    """
    display(HTML(html_code))

# 调用函数
simple_plot()

代码详解

  1. 绘制图形
    使用 matplotlib 绘制图形并将其保存到 BytesIO 对象中。

  2. 生成 Base64 数据 URL
    使用 base64.b64encode 将图形编码为 Base64 格式,以便嵌入 HTML 中。

  3. 生成自定义 HTML/CSS
    包装 HTML <div> 并为其应用 CSS 样式(如 float:leftmargin-right)。

  4. 显示 HTML
    使用 IPython.display.HTMLdisplay 将 HTML 渲染到 Jupyter Notebook 单元格中。

效果

运行上述代码后,您将在 Jupyter Notebook 中看到一个带有 float:left 样式的图像。可以继续调整 HTML 和 CSS 代码以实现更复杂的布局。

改进(可选)

如果您需要为多个图或复杂布局添加更多控制,建议将所有样式写入单独的 CSS 文件并加载它们。例如:

custom_css = """
<style>
.custom-css-for-matplotlib {
    float: left;
    margin-right: 10px;
    border: 1px solid #ccc;
    padding: 5px;
    border-radius: 5px;
}
</style>
"""
display(HTML(custom_css))

通过这种方式,您可以轻松重复使用相同的样式。

2024-11-20