Bootstrap

python 将matplotlib 输出到web

前言

python的matplotlib的数据可视化非常好用,最近在做信息安全的课设,需要用到可视化的界面,本人想好的是用web做前端,python做后台,那么就可以调用matplotlib的库了,接下来的问题就是将matplotlib画好的图输出给前端了

资料采集

知乎上的提供了思路但是方法不好用

保存图片输出路径的方法

简书上这篇实现很不错,使用base64编码,完美解决了以下问题web项目遇到的并发问题,就是如果先保存图片在本地,然后把路径告诉前端,这样要给每个用户分配不一样的路径,不然他们的图片会相互覆盖,产生的图片文件冗余也是麻烦

Matplotlib输出中文显示问题 - CSDN博客。能不用中文就不用中文吧,百度翻译一波

代码实现

使用python的flask框架

@app.route("/jianshu")
def jianshu():
    import matplotlib
    matplotlib.use('Agg')  # 不出现画图的框
    import matplotlib.pyplot as plt
    from io import BytesIO
    import base64

    # 这段正常画图
    plt.axis([0, 5, 0, 20])  # [xmin,xmax,ymin,ymax]对应轴的范围
    plt.title('My first plot')  # 图名
    plt.plot([1, 2, 3, 4], [1, 4, 9, 16], 'ro')  # 图上的点,最后一个参数为显示的模式
    # -----------

    # 转成图片的步骤
    sio = BytesIO()
    plt.savefig(sio, format='png')
    data = base64.encodebytes(sio.getvalue()).decode()
    print(data)
    html = '''
       <html>
           <body>
               <img src="https://img-blog.csdnimg.cn/2022010619580627845.png" />
           </body>
        <html>
    '''
    plt.close()
    # 记得关闭,不然画出来的图是重复的
    return html.format(data)
    #format的作用是将data填入{}

实验效果

这里写图片描述

后言

本机运行良好,但是在部署到服务器上却遇到了很大的麻烦
首先是,centos7上是没有GUI界面的,但是matplotlib.pyplot是需要tkinter库的支持的,直接部署上去报一堆问题,不明真相的我,按照报错,去装了一堆包
甚至是
这里写图片描述
搞得天翻地覆

最后都不知道在百度上搜索什么来解决这个了

问题得到解决

Linux终端没有GUI,如何使用matplotlib绘图
参考他的方法

python文件中:
在 from matplotlib import pylot 之前,添加代码:
如下:

import matplotlib as mpl
mpl.use('Agg')
from matplotlib import pylot 
;