(009)-使用Matplotlib生成图表并将其嵌入网页中

605 阅读3分钟

powershell run as administrator

pip install matplotlib

或者
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple matplotlib
import matplotlib.pyplot as plt
from io import BytesIO
import base64

# 生成数据
x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]

# 绘制图表
plt.plot(x, y)                  # 使用Matplotlib库中的plot函数绘制折线图
plt.title('Line chart')         # 设置图表标题
plt.xlabel('X')                 # 设置X轴标签
plt.ylabel('Y')                 # 设置Y轴标签

# 将图表保存到内存中
buffer = BytesIO()              # 创建BytesIO对象,用于将图表保存到内存中
plt.savefig(buffer, format='png')  # 将图表保存为PNG格式,并写入BytesIO对象中
buffer.seek(0)                  # 将文件指针移到文件开头

# 将图表转换为Base64编码的字符串
img_str = base64.b64encode(buffer.read()).decode()   # 读取BytesIO对象中的内容并转换为Base64编码字符串

# 生成网页代码
html = f"""
<html>
<head>
<title>My Chart</title>
</head>
<body>
<h1>My Chart</h1>
<img src="data:image/png;base64,{img_str}">  # 在HTML中嵌入Base64编码的图片
</body>
</html>
"""

# 将网页保存到文件中
with open('mychart.html', 'w') as f:  # 创建文件对象
    f.write(html)                    # 将HTML代码写入文件中

这段代码首先使用Matplotlib库生成一个简单的线形图,然后将图表保存到内存中,转换为Base64编码的字符串,并使用HTML代码将其嵌入到网页中。最后,将生成的HTML代码保存到文件中。


在Python中,可以使用许多框架和库来将其作为服务端生成API。下面是其中一些流行的选项:

Flask:Flask是一个轻量级的Web应用程序框架,它可以用于构建API。它非常灵活,易于使用和扩展。你可以通过编写Python函数并使用特定的路由将其映射到API端点来定义API。可以使用Flask-RESTful扩展轻松创建RESTful API。

Django:Django是一个功能强大的Web框架,可以用于生成API。它包括许多有用的功能,如用户身份验证,ORM等。Django REST framework是一个用于构建RESTful API的第三方包,它提供了许多有用的功能,如序列化,视图类,路由等。

FastAPI:FastAPI是一个新的Python Web框架,旨在提供快速,高效,易于使用的API。它支持异步请求和响应,并使用Pydantic进行数据验证和文档生成。FastAPI使用基于函数的路由来定义API端点,并使用OpenAPI和JSON Schema生成API文档。


在 Node.js 开发中,类似于 Python Beautiful Soup 的库是 cheeriocheerio 是一个轻量级的、快速的、类似 jQuery 的 DOM 操作库,可以方便地在服务器端解析和操作 HTML/XML 文档。

使用 cheerio 可以通过选择器、DOM 操作和属性获取等方式方便地对 HTML/XML 进行操作和解析,例如:

const cheerio = require('cheerio');
const html = '<html><head><title>My Page</title></head><body><h1>Hello, World!</h1></body></html>';

const $ = cheerio.load(html);

console.log($('title').text()); // 输出:My Page
console.log($('h1').text()); // 输出:Hello, World!

在这个例子中,首先使用 cheerio.load() 方法将 HTML 加载到 对象中,然后使用对象中,然后使用() 方法选择 HTML 元素,使用 text() 方法获取元素的文本内容。除了 text() 方法,cheerio 还提供了一系列的 DOM 操作方法,例如 html()、attr()、hasClass() 等等。


Matplotlib是一个用于绘制各种静态、动态、交互式图表的Python库,无法直接在Node.js中使用。不过,你可以使用Node.js中的child_process模块来启动一个Python进程,然后调用Python的Matplotlib库来生成图表,最后将图表数据以JSON等格式返回给Node.js程序。

以下是一个示例代码,展示了如何在Node.js中使用Python的Matplotlib库:

const { spawn } = require('child_process');
const express = require('express');

const app = express();

app.get('/plot', (req, res) => {
  // 生成绘图的Python代码
  const pythonCode = `
    import matplotlib.pyplot as plt
    import json

    # 生成数据
    x = [1, 2, 3, 4, 5]
    y = [2, 4, 6, 8, 10]

    # 绘制图表
    plt.plot(x, y)
    plt.title('Line chart')
    plt.xlabel('X')
    plt.ylabel('Y')

    # 将图表转换为JSON格式
    plt_json = json.dumps({'img': plt.show()})

    # 返回JSON格式的图表数据
    print(plt_json)
  `;

  // 启动Python进程
  const pythonProcess = spawn('python', ['-c', pythonCode]);

  // 监听Python进程的输出
  let output = '';
  pythonProcess.stdout.on('data', (data) => {
    output += data.toString();
  });

  // 监听Python进程的结束事件
  pythonProcess.on('close', () => {
    // 将Python输出的JSON格式的图表数据发送给客户端
    res.json(JSON.parse(output));
  });
});

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

这段代码创建了一个使用Express框架的Node.js服务,当客户端请求/plot接口时,会启动一个Python进程,执行Python代码生成图表数据,并将JSON格式的图表数据发送给客户端。客户端可以根据返回的JSON数据使用JavaScript或其他前端技术来渲染图表。

需要注意的是,这种方式并不适合频繁生成图表或需要处理大量数据的场景,因为每次请求都需要启动一个Python进程,对系统资源有一定压力。


在Node.js中执行Python可以通过child_process模块实现。

下面是一个简单的例子,展示了如何在Node.js中执行Python程序并获取其输出:

const { spawn } = require('child_process');

// 执行 Python 程序
const pythonProcess = spawn('python', ['my_script.py']);

// 监听标准输出
pythonProcess.stdout.on('data', (data) => {
  console.log(`stdout: ${data}`);
});

// 监听标准错误输出
pythonProcess.stderr.on('data', (data) => {
  console.error(`stderr: ${data}`);
});

// 监听进程结束事件
pythonProcess.on('close', (code) => {
  console.log(`child process exited with code ${code}`);
});

其中my_script.py是需要执行的Python脚本文件。在spawn函数中传入python作为第一个参数表示要执行Python程序,第二个参数是Python程序的参数列表,这里是一个空列表。然后可以监听stdoutstderr事件来获取程序的输出和错误输出。最后,监听close事件可以在Python程序结束时得到通知。

还一个使用:python-shell www.npmjs.com/package/pyt…


在Java中执行Python脚本可以使用Java提供的ProcessBuilder类或Runtime类来实现。

使用ProcessBuilder类:

ProcessBuilder pb = new ProcessBuilder("python", "path/to/script.py");
Process process = pb.start();

使用Runtime类:

Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec("python path/to/script.py");