Word Cloud (詞雲) - JavaScript



上一篇中已經分享了用 Python 建立詞雲了。接下來繼續總結其餘建立詞雲的方法。javascript


>> Create Word Cloud via JavaScript

JavaScript 能夠藉助 d3 函數庫d3-cloud 插件來生成詞雲。html

1) 下載 d3, d3-cloud 及其相關文件,並在 HTML 文件中引用。java

<script src="dist/d3.v3.min.js"></script>
<script src="dist/d3.layout.cloud.js"></script>
<script src="dist/colorbrewer.v1.min.js"></script>

2) 準備文本。git

咱們再次使用上次保存的 Word Cloud History.txt 的文本。github

3) 用 HTML 寫一個簡單的 Web Page,讓咱們能夠作一些簡單的交互,例如選擇 *.txt 文件,點擊生成圖形,保存圖形等等。canvas

<div role="main">           
    <input type="file" id="txtFile" accept=".txt" single>                  

    <button id="btnCreate">Create</button>
    <button id="btnSave" disabled>Save</button>
          
    <div id="svgBox"></div>
</div>

完成後能夠用瀏覽器打開這個 Web Page 看看。
Word Cloud Web Page瀏覽器

4) 接下來咱們就能夠用 JavaScript 去實現這些控件的功能了。和 Python 不一樣,JavaScript 不能自動分詞和設置停用詞,因此咱們須要app

4-a) 讀取 *.txt 文件: readTXTFiledom

4-b) 分詞:generateWordListsvg

4-c) 重頭戲,畫 word cloud:drawWordCloud。根據 d3-cloud 給出的API設置字體顏色,字體大小,圖形的大小等等。

//Example for Step 3
    var layout = d3.layout.cloud() //構造詞雲實例
                .size([width, height])
                .words(
                    arrWord.map(function(d) {
                        var index = arrWord.indexOf(d);
                        return {text: d, size: arrWeight[index] * sizeFactor};
                    })
                )
                .padding(5)
                .rotate(function() { return ~~(Math.random() * 2) * 90; })
                .font(fontFamily)
                .fontSize(function(d) { return d.size; })
                .spiral("rectangular")
                .on("end", draw) //全部詞語放置完成後運行 draw 函數
                .start();

4-d). 保存圖形:saveSVGToPNG

//Save svg as png file
    var svg = document.querySelector("svg");
    var svgData = new XMLSerializer().serializeToString(svg);
    var svgSize = svg.getBoundingClientRect();
    var canvas = document.createElement("canvas");
    canvas.width = svgSize.width;
    canvas.height = svgSize.height;
    var ctx = canvas.getContext("2d");
    var img = document.createElement("img");
    img.setAttribute('crossOrigin', 'anonymous');
    img.setAttribute("src", "data:image/svg+xml;base64," + btoa(svgData));
    img.onload = function() {
        ctx.drawImage(img, 0, 0);
        var imgDataURL = canvas.toDataURL("image/png");
        console.log(canvas.toDataURL("image/png"));
        $("body").append("<a id='hiddenLink' href='" + imgDataURL + "' style='display:none;' download>Download Pic</a>");
        $("#hiddenLink")[0].click();
        $("#hiddenLink").remove();
    };

Word Cloud JavaScript


>> Notes

1) 這個例子尚未實現設置停用詞的功能,因此圖形中還包括了不少無心義的詞語,例如 the, a, of, in 等等。若是你看完這篇博客後有興趣繼續玩玩,能夠本身加個 function 實現這個功能。

簡單的方法就是設置兩個 Object, 一個裝詞語,一個裝停用詞。如今詞語中讀取第一個詞,並在停用詞中查找。若是是停用詞就丟掉,而後讀取第二個詞,如此類推。

2) 到目前爲止,將 svg 保存爲其餘圖片格式 (如 *.png)只適用於 Chrome 瀏覽器和 FireFox 瀏覽器。曾經花了不少時間去搜索和研究都沒有找到在 IE 怎樣將 svg 保存成其餘圖片格式。若是有好心人知道,也和我分享一下吧。Thanks!


>> Sample Code

download here



  1. Word Cloud (詞雲) - Python
  2. Word Cloud (詞雲) - R
  3. Word Cloud (詞雲) - Matlab
相關文章
相關標籤/搜索