Django + Matplotlib:实现数据分析显示与下载为PDF或SVG

写作背景

首先,数据分析在当前的信息时代中扮演着重要的角色。随着数据量的增加和复杂性的提高,人们对于数据分析的需求也越来越高。

其次,笔者也确确实实曾经接到过一个这样的开发需求,甲方是一个医疗方面的科研团队,有相当大的一些关于癌症治疗方面的医疗数据,通过这些数据可以分析出很多东西,最重要的是将数据通过一些科学计算后转换为可视化的数据图,并且要根据用户的检索数据实时分析展示,并且可保存为pdf或svg格式的源文件,可提供后期印刷一类的二次修改使用;最终就选择了Django和Matplotlib这两个强大的库来实现数据分析的显示和下载功能。

本文将只会浅显的探讨如何使用Django和Matplotlib,并不会对数据分析方面的知识做过多的介绍!

环境搭建

这里我假设你已经会使用django,并且已经使用django搭建起了一个可运行的demo app。

Matplotlib的安装使用和其他的Python第三方包一致,只需要通过pip命令即可快速安装!

pip install matplotlib

代码示例

1、假如我们拥有一个如下代码所示的django 类视图

# demo/views.py


from django.shortcuts import render
from django.views.generic import View


class HomeView(View):
    """
    HomeView类是一个继承自View的视图类,用于处理与主页相关的请求。


    Attributes:
        template_name (str): 展示主页所使用的模板名称。
    """
    template_name = "demo/home.html"


    def get(self, request, *args, **kwargs):
        return render(request, self.template_name)

2、url如下所示

# 项目mysite的根urls.py


from django.urls import path
from. import views


urlpatterns = [
    path('', views.HomeView.as_view(), name='index'),
]

3、demo/templates/demo目录下home.html代码如下

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>


</body>
</html>

这只是一个空白的html页面,最后用来显示分析图!

那么,根据以上代码,我们可以通过django的runserver命令运行项目后看到该页面!

Matplotlib使用

1、在demo/views.py当中引入如下包

import base64
from io import BytesIO
from matplotlib.figure import Figure

from django.http import FileResponse

代码解释:

import base64 是我们导入了Python的base64模块,该模块提供了对 Base64 编码格式的支持。Base64 是一种用于编码二进制数据的方式,它将每3个字节的数据编码为4个字符,因此会将数据的大小增加约33%。这种编码格式常用于在文本中进行二进制数据的表示,尤其是在需要将二进制数据通过电子邮件等文本通道进行传输的情况下。通过导入 base64 模块,我们可以使用该模块提供的函数和类来进行 Base64 编码和解码操作。

from io import BytesIO 这一行代码是在 Python 中导入 BytesIO 类。BytesIO 类是 Python 标准库 io 模块中的一个类,用于在内存中处理二进制数据流。

BytesIO 类实现了一个缓冲区,这个缓冲区可以像文件一样进行读写操作,但实际上是在内存中进行的。因此,它可以在内存中处理和操作二进制数据,而不需要将数据写入磁盘。

通过使用 BytesIO 类,我们可以将二进制数据存储在内存中,并像处理文件一样对其进行读取、写入和其他操作。这对于处理大量数据或在内存中执行文件操作更加高效和灵活。

from matplotlib.figure import Figure 是导入matplotlib 库中的 Figure 类,Figure 类是 matplotlib 库中的一个核心类,用于创建一个图形窗口(figure window)。这个窗口可以包含各种图形元素,如坐标轴(axes)、曲线(lines)、文本(text)等。

通过导入 Figure 类,我们可以创建一个空的图形窗口,并在其中添加各种图形元素。这对于自定义图形的外观和布局非常有用。

from django.http import FileResponse是导入django为我们提供的一个响应对象,关于其作用django的官网对其有详细说明,如下所示:

2、实现在页面中显示分析图的需求

首先,我们在HomeView类中新增一个get_fig的方法,让其生成一个分析图对象:

class HomeView(View):
    ...
    
    def get_fig(self):
        """
        获取一个图形和轴对象


        返回:
        fig (matplotlib.figure.Figure): 图形对象
        ax (matplotlib.axes.Axes): 轴对象
        """
        fig = Figure(figsize=(5, 5))  # 创建一个大小为 5x5 的图形对象
        ax = fig.subplots()  # 在图形对象上创建一个子图对象
        ax.plot([1, 2, 3, 4])  # 在轴对象上绘制一条线
        
        # 标题
        fig.suptitle("Hello world")  # 设置图形的标题
        # 坐标轴
        ax.set_ylabel("Y zhou", fontdict={"size": 16, "color": "red", "weight": "bold", "family": "serif"})  # 设置轴对象的 y 轴标签
        ax.set_xlabel("X zhou")  # 设置轴对象的 x 轴标签
        return fig, ax  # 返回图形对象和轴对象

有了该图形对象之后,我们就可以用base64包将该图形对象在内存中转换为png格式的字节流,为此我们再在该视图类下新增一个img_base64_to_file的方法,让它接收一个图形对象fig作为参数!

class HomeView(View):
    ...
    
    def img_base64_to_file(self, fig):
        """
        将图像保存为base64编码的文件


        参数:
        fig:要保存的图像对象


        返回值:
        img:包含base64编码图像的HTML标签
        """


        buf = BytesIO()  # 创建字节流用于保存图像
        fig.savefig(buf, format="png")  # 将图像保存为png格式的字节流
        data = base64.b64encode(buf.getbuffer()).decode("ascii")  # 将字节流转换为base64编码的字符串
        img = f"<img src='data:image/png;base64,{data}'/>"  # 构建包含base64编码图像的HTML标签
        return img  # 返回HTML标签

做完以上两步之后,其实只需要将img_base64_to_file方法的返回值传递到get请求的上下文当中,在django的模版中通过模版过滤器safe渲染即可!其他动态筛选逻辑以及其他操作即可通过django的相关功能去实现!代码如下:

class HomeView(View):
    ...


    def get(self, request, *args, **kwargs):
        fig, ax = self.get_fig()
        img = self.img_base64_to_file(fig) 
        return render(request, self.template_name, {"img": img})

静态html模版中如下

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    {{ img|safe }}
</body>
</html>

最终渲染图

3、实现将分析图保存为pdf或svg格式

要实现该需求其实也非常简单,只需要在该视图类中新增一个post的请求,使用django的FileResponse将数据流保存到本地即可,其中需要关注的只是fig图形对象中的savefig方法的format参数的变化,也就是保存文件的格式,这个函数本身就是支持导出pdf和svg格式的!代码如下:

class HomeView(View):
    ...
    
    def download_response(self, fig, filename:str):
        """
        将给定的图形对象 fig 保存为 pdf 格式的文件并下载。


        参数:
        self (object): 类实例对象
        fig (matplotlib.figure.Figure): 绘制好的图形对象
        filename (str): 保存的文件名,包含扩展名


        返回值:
        FileResponse: 用于文件下载的响应对象
        """
        buf = BytesIO()
        fig.savefig(buf, format="pdf")
        buf.seek(0)
        return FileResponse(
            buf, 
            as_attachment=True, 
            filename=f"{filename}.pdf"
        )


    def post(self, request, *args, **kwargs):
        fig,ax = self.get_fig()
        return self.download_response(fig, "demo")

在html模版中通过post的表单请求即可下载,代码如下:

<body>
    {{ img|safe }}
    <form action="" method="post">
        {% csrf_token %}
        submit: <input type="submit" value="下载">
    </form>
</body>

最终,通过点击下载按钮,发起一个post请求就实现了下载到本地的功能,当然你想动态控制下载格式的话,还可以通过django的表单系统开放给用户,让用户自由选择所需要的下载格式,需要注意的是format参数要和文件后缀格式保持一致!


作者开源商城项目,欢迎大家fork学习,同步开发教程持续更新

开源地址:https://gitee.com/xingfugz/bayke-shop

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/227168.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网络安全(五)--Linux 入侵检测分析技术

8. Linux 入侵检测分析技术 目标 了解入侵检测分析的基本方法掌握查看登录失败用户的方法掌握查阅历史命令的方法掌握检查系统开机自启服务的方法 8.1. 概述 最好的安全防护当然是“域敌于国门之外”&#xff0c; 通过安全防护技术&#xff0c;来保证当前主机不被非授权人员…

【链表Linked List】力扣-117 填充每个节点的下一个右侧节点指针II

目录 问题描述 解题过程 官方题解 问题描述 给定一个二叉树&#xff1a; struct Node {int val;Node *left;Node *right;Node *next; } 填充它的每个 next 指针&#xff0c;让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点&#xff0c;则将 next 指针设置为 N…

IT行业软件数据文件传输安全与高效是如何保障的?

在当今迅速发展的科技世界中&#xff0c;云计算、大数据、移动互联网等信息技术正迎来蓬勃发展&#xff0c;IT行业正置身于一个全新的世界。数据不仅是最重要的资产&#xff0c;也是企业竞争力的核心所在。然而&#xff0c;如何缩短信息共享时间、高速流转数据、跨部门/跨区域协…

最新版本——Hadoop3.3.6单机版完全部署指南

大家好&#xff0c;我是独孤风&#xff0c;大数据流动的作者。 本文基于最新的 Hadoop 3.3.6 的版本编写&#xff0c;带大家通过单机版充分了解 Apache Hadoop 的使用。本文更强调实践&#xff0c;实践是大数据学习的重要环节&#xff0c;也能在实践中对该技术有更深的理解&…

企业计算机服务器中了mallox勒索病毒如何处理,Mallox勒索病毒解密

随着计算机技术的不断发展&#xff0c;越来越多的企业利用网络来提高工作效率&#xff0c;但随之而来的网络安全威胁也在不断增加&#xff0c;各种勒索病毒种类不断增加&#xff0c;给企业的数据安全带来严重的威胁&#xff0c;影响企业的生产业务开展。近期&#xff0c;云天数…

微信小程序js数组对象根据某个字段排序

一、排序栗子 注: 属性字段需要进行转换,如String类型或者Number类型 //升序排序 首元素(element1)在前 降序则(element1)元素在后 data data.sort((element1, element2) >element1.属性 - element2.属性 ); 二、代码 Page({/*** 页面的初始数据*/data: {user:…

【Flink系列三】数据流图和任务链计算方式

上文介绍了如何计算并行度和slot的数量&#xff0c;本文介绍Flink代码提交后&#xff0c;如何生成计算的DAG数据流图。 程序和数据流图 所有的Flink程序都是由三部分组成的&#xff1a;Source、Transformation和Sink。Source负责读取数据源&#xff0c;Transformation利用各种…

idea本地调试hadoop 遇到的几个问题

1.DEA对MapReduce的toString调用报错&#xff1a;Method threw ‘java.lang.IllegalStateException‘ exception. Cannot evaluate org.apache.hadoop.mapreduc 解决方法&#xff1a;关闭 IDEA 中的启用“ tostring() ”对象视图 2.代码和hdfs路径都对的情况下&#xff0c;程序…

【EI会议征稿】第三届密码学、网络安全和通信技术国际会议(CNSCT 2024)

第三届密码学、网络安全和通信技术国际会议&#xff08;CNSCT 2024&#xff09; 2024 3rd International Conference on Cryptography, Network Security and Communication Technology 随着互联网和网络应用的不断发展&#xff0c;网络安全在计算机科学中的地位越来越重要&…

MySQL 中Relay Log打满磁盘问题的排查方案

MySQL 中Relay Log打满磁盘问题的排查方案 引言&#xff1a; MySQL Relay Log&#xff08;中继日志&#xff09;是MySQL复制过程中的一个重要组件&#xff0c;它用于将主数据库的二进制日志事件传递给从数据库。然而&#xff0c;当中继日志不断增长并最终占满磁盘空间时&…

5组10个共50个音频可视化效果PR音乐视频制作模板

我们常常看到的图形跟着音乐跳动&#xff0c;非常有节奏感&#xff0c;那这个是怎么做到的呢&#xff1f;5组10个共50个音频可视化效果PR音乐视频制作模板满足你的制作需求。 PR音乐模板|10个音频可视化视频制作模板05 https://prmuban.com/36704.html 10个音频可视化视频制作…

论文阅读——Deformable ConvNets v2

论文&#xff1a;https://arxiv.org/pdf/1811.11168.pdf 代码&#xff1a;https://github.com/chengdazhi/Deformable-Convolution-V2-PyTorch 1. 介绍 可变形卷积能够很好地学习到发生形变的物体&#xff0c;但是论文观察到当尽管比普通卷积网络能够更适应物体形变&#xff…

华为OD机试 - 攀登者2(Java JS Python C)

题目描述 攀登者喜欢寻找各种地图,并且尝试攀登到最高的山峰。 地图表示为一维数组,数组的索引代表水平位置,数组的元素代表相对海拔高度。其中数组元素0代表地面。 例如:[0,1,2,4,3,1,0,0,1,2,3,1,2,1,0],代表如下图所示的地图,地图中有两个山脉位置分别为 1,2,3,4,5…

Qt 如何使用VTK显示点云

开发环境 ubuntu 20.04 VTK 8.2 编译VTK 下载源码 git clone --recursive https://gitlab.kitware.com/vtk/vtk.git 使用版本管理工具&#xff0c;切换版本到8.2 更改编译选项&#xff0c;这里使用cmake-gui进行配置 1、编译类型修改为Release 2、安装路径可以设置&#xf…

Appium 并行测试多个设备

一、前置说明 在自动化测试中&#xff0c;经常需要验证多台设备的兼容性&#xff0c;Appium可以用同一套测试运例并行测试多个设备&#xff0c;以达到验证兼容性的目的。 解决思路&#xff1a; 查找已连接的所有设备&#xff1b;为每台设备启动相应的Appium Server&#xff1b…

【头歌系统数据库实验】实验7 SQL的复杂多表查询-1

目录 第1关&#xff1a;求各颜色零件的平均重量 第2关&#xff1a;求北京和天津供应商的总个数 第3关&#xff1a;求各供应商供应的零件总数 第4关&#xff1a;求各供应商供应给各工程的零件总数 第5关&#xff1a;求重量大于所有零件平均重量的零件名称 第6关&#xff1…

字节开源的netPoll底层LinkBuffer设计与实现

字节开源的netPoll底层LinkBuffer设计与实现 为什么需要LinkBuffer介绍设计思路数据结构LinkBufferNodeAPI LinkBuffer读 API写 APIbook / bookAck api 小结 本文基于字节开源的NetPoll版本进行讲解&#xff0c;对应官方文档链接为: Netpoll对应官方文档链接 netPoll底层有一个…

IntelliJ IDEA开启git版本控制的简单教程

这篇文章想要分享一下怎么在IntelliJ IDEA开启版本控制&#xff0c;博主使用的是gitee&#xff0c;首先需要安装git&#xff0c;关于git的安装这里就不介绍了&#xff0c;很简单。 目录 创建git仓库 创建项目 开启版本控制 拉取项目 创建git仓库 首先&#xff0c;需要登录…

python 使用 AppiumService 类启动appium server

一、前置说明 在Appium的1.6.0版本中引入了AppiumService类&#xff0c;可以很方便的通过该类来管理Appium服务器的启动和停止。 二、操作步骤 import osfrom appium.webdriver.appium_service import AppiumService as OriginalServerfrom libs import pathclass AppiumSer…

office办公技能|ppt插件使用

PPT插件获取&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1BOmPioUKeY2TdC-1V-o3Vw 提取码&#xff1a;tdji 一、ppt插件介绍 PPT插件是一种可以帮助用户在Microsoft PowerPoint软件中添加各种额外功能和效果的应用程序。使用PPT插件可以让用户更加轻松地制作出专业、…