龙空技术网

Python数据可视化,使用Flask的两种在线词云生成方式

civilpy 147

前言:

现在各位老铁们对“如何用python做词云”大约比较讲究,大家都想要剖析一些“如何用python做词云”的相关内容。那么小编也在网络上搜集了一些关于“如何用python做词云””的相关资讯,希望姐妹们能喜欢,各位老铁们快快来了解一下吧!

第一种,静态图片

直接上代码:

from flask import Flask, render_template, request, jsonifyimport randomfrom wordcloud import WordCloudimport base64app = Flask(__name__)@app.route('/')def index():    return render_template('index.html')@app.route('/generate_wordcloud', methods=['POST'])def generate_wordcloud():    text = request.form['text']    wc = WordCloud(width=800, height=400, background_color='white').generate(text)    wc.to_file('static/wordcloud.png')    with open("static/wordcloud.png", "rb") as image_file:        encoded_string = base64.b64encode(image_file.read()).decode('utf-8')    return jsonify({'image': encoded_string})if __name__ == '__main__':    app.run(debug=True)

上面代码中返回的是图片字节,需要在前端进行预处理。

<!DOCTYPE html><html><head>    <meta charset="UTF-8">    <title>WordCloud Generator</title>    <script src="//cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>    <script src="//cdnjs.cloudflare.com/ajax/libs/wordcloud2.js/1.0.6/wordcloud2.min.js"></script></head><body>    <h1>WordCloud Generator</h1>    <form id="wordcloud-form">        <label for="text">Enter text:</label><br>        <textarea id="text" name="text" rows="5" cols="50"></textarea><br>        <button type="submit">Generate WordCloud</button>    </form>    <br>    <div id="wordcloud-container"></div>    <script>        $(document).ready(function() {            $('#wordcloud-form').submit(function(event) {                event.preventDefault();                $.ajax({                    type: 'POST',                    url: '/generate_wordcloud',                    data: $('#wordcloud-form').serialize(),                    success: function(response) {                        $('#wordcloud-container').html('<img src="data:image/png;base64,' + response.image + '">');                        $('#text').val('');                    }                });            });        });    </script></body></html>

有点,生成的云图可以定义背景,形状等,但毕竟是静态的。

第二种,动态图片

1.wordcloud2.js下载(自行搜索)

2.下载之后导入wordcloud2.js到我们的网页

<script type="text/javascript" src="/static/lib/wordcloud2/wordcloud2.js"></script>

3.放置容器

<body>    <div id="canvas-container" style="float: left">        <canvas id="canvas" width="800px" height="600px"></canvas>    </div></body>

4.初始化

<script>    var wordFreqData = [['各位观众',45],['词云', 21],['来啦!!!',13]];    var canvas = document.getElementById('canvas');    var options = eval({            "list": wordFreqData,//或者[['各位观众',45],['词云', 21],['来啦!!!',13]],只要格式满足这样都可以            "gridSize": 6, // 密集程度 数字越小越密集            "weightFactor": 1, // 字体大小=原始大小*weightFactor            "maxFontSize": 60, //最大字号            "minFontSize": 14, //最小字号            "fontWeight": 'normal', //字体粗细            "fontFamily": 'Times, serif', // 字体            "color": 'random-light', // 字体颜色 'random-dark' 或者 'random-light'            "backgroundColor": '#333', // 背景颜色            "rotateRatio": 1 // 字体倾斜(旋转)概率,1代表总是倾斜(旋转)        });    //生成    WordCloud(canvas, options);</script>

注意,wordFreqData的数据格式:

假设列表为lst,可以使用Python内置的Counter来实现词频统计,然后将结果转为列表。具体代码如下:

from collections import Counterlst = ['apple', 'banana', 'apple', 'cherry', 'cherry', 'cherry']counter = Counter(lst)lst_freq = [[k, v] for k, v in counter.items()]print(lst_freq)

输出结果为:

[['apple', 2], ['banana', 1], ['cherry', 3]]

其中,lst_freq就是转换后的列表,每个元素都是一个长度为2的列表,第一个元素是列表中的元素,第二个元素是该元素在列表中出现的次数。

civilpy:Python数据分析及可视化实例目录

标签: #如何用python做词云