写点什么

终于玩明白 Golang 数据可视化了!

作者:Jackpop
  • 2021 年 12 月 07 日
  • 本文字数:3929 字

    阅读完需:约 13 分钟

程序员宝藏库:https://github.com/Jackpopc/CS-Books-Store


用图形和图表将数据可视化使其更容易被理解,在不同编程语言中,我们可以使用数据可视化库来轻松生成干净漂亮的图表。


在本教程中,我们将学习如何使用go-echarts库在 Golang 中绘制数据。


在 GitHub 上,它有超过 4k 颗星,使其成为 Go 中生成图表的最受欢迎的库之一。


我们将学习如何设置和安装这个包,然后逐步介绍如何创建不同的图表,包括条形图、折线图、饼图和文字云。


go-echarts包括多种自定义选项,比如多个 UI 主题,你可以用它来进一步改善你的数据可视化的外观和感觉。go-echarts有优秀的文档,并提供了一个干净和全面的 API。


本机上,Go 并不提供创建可定制的可视化的能力,但go-echarts提供了对多种数据输入格式和移动优化的支持。


要设置我们的项目并安装 go-echarts,请运行下面的代码。


mkdir learn_chartscd learn_charts
go mod init learn_chartsgo get -u github.com/go-echarts/go-echarts/...
touch main.go
复制代码


现在,在你喜欢的编辑器中打开main.go文件,让我们开始吧!

柱状图

首先,让我们介绍一下如何创建柱状图,这是最常见和最广泛使用的图表类型之一。


当你想显示各组之间的分布或比较时,条形图是理想的选择。


我将使用随机数据制作柱状图,并探索不同的选项来定制它。


首先,写一个函数来为我们的条形图创建随机样本数据:


package mainimport (    "math/rand"    "os"
"github.com/go-echarts/go-echarts/v2/opts")// generate random data for bar chartfunc generateBarItems() []opts.BarData { items := make([]opts.BarData, 0) for i := 0; i < 6; i++ { items = append(items, opts.BarData{Value: rand.Intn(500)}) } return items}
复制代码


现在,开始创建我们的柱状图。


为此,将初始化一个新的柱状图并设置全局选项,如标题和图例。


然后,使用AddSeries()方法和generateBarItems()函数向我们的实例中填充数据。


最后,将把图表渲染成一个 HTML 文件。


另外,你也可以使用 HTTP 服务器渲染你的图表:


func createBarChart() {    // create a new bar instance    bar := charts.NewBar()
// Set global options bar.SetGlobalOptions(charts.WithTitleOpts(opts.Title{ Title: "Bar chart in Go", Subtitle: "This is fun to use!", }))
// Put data into instance bar.SetXAxis([]string{"Jan", "Feb", "Mar", "Apr", "May", "Jun"}). AddSeries("Category A", generateBarItems()). AddSeries("Category B", generateBarItems()) f, _ := os.Create("bar.html") _ = bar.Render(f)}
复制代码


通过上面的命令,应该创建一个名为bar.html的文件。


在浏览器中打开它,你应该看到你的第一个柱状图,你可以随意添加你喜欢的自定义样式。


折线图

数据科学家经常使用折线图来跟踪一段时间内的变化。


在我们的例子中,我们将用随机数据创建一个折线图,比较两个随机类别。


首先,让我们为图表生成我们的随机数据:


package main
import ( "math/rand" "os"
"github.com/go-echarts/go-echarts/v2/opts")
// generate random data for line chartfunc generateLineItems() []opts.LineData { items := make([]opts.LineData, 0) for i := 0; i < 7; i++ { items = append(items, opts.LineData{Value: rand.Intn(500)}) } return items}
复制代码


现在,准备创建一个折线图。


为此,将为我们的折线图初始化一个新的实例,就像我们为柱状图所做的那样。


然后,需要将把数据填充到我们的实例中,并将我们的图表渲染成一个 HTML 文件:


func createLineChart() {    // create a new line instance    line := charts.NewLine()
// set some global options like Title/Legend/ToolTip or anything else line.SetGlobalOptions( charts.WithInitializationOpts(opts.Initialization{ Theme: types.ThemeInfographic }), charts.WithTitleOpts(opts.Title{ Title: "Line chart in Go", Subtitle: "This is fun to use!", }) )
// Put data into instance line.SetXAxis([]string{"Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"}). AddSeries("Category A", generateLineItems()). AddSeries("Category B", generateLineItems()). SetSeriesOptions(charts.WithLineChartOpts(opts.LineChart{Smooth: true})) f, _ := os.Create("line.html") _ = line.Render(f)}
复制代码


在浏览器中打开line.html,你会看到一个类似下面的图表:


饼图

饼图可以说是在你比较一个整体的一部分时的最佳选择。


在我们的例子中,我们将用随机数据创建一个饼图来显示一个学生的销售分数分布。


让我们写一个小函数来为饼图创建随机数据样本:


package main
import ( "math/rand" "os"
"github.com/go-echarts/go-echarts/v2/opts")
// generate random data for pie chartfunc generatePieItems() []opts.PieData { subjects := []string{"Maths", "English", "Science", "Computers", "History", "Geography"} items := make([]opts.PieData, 0) for i := 0; i < 6; i++ { items = append(items, opts.PieData{ Name: subjects[i], Value: rand.Intn(500)}) } return items}
复制代码


现在,需要创建一个实例并添加自定义。


我们将添加额外的标签选项,并为我们的饼图设置一个半径,可以随意改变这些选项:


func createPieChart() {    // create a new pie instance    pie := charts.NewPie()    pie.SetGlobalOptions(        charts.WithTitleOpts(            opts.Title{                Title:    "Pie chart in Go",                Subtitle: "This is fun to use!",            },        ),    )    pie.SetSeriesOptions()    pie.AddSeries("Monthly revenue",        generatePieItems()).        SetSeriesOptions(            charts.WithPieChartOpts(                opts.PieChart{                    Radius: 200,                },            ),            charts.WithLabelOpts(                opts.Label{                    Show:      true,                    Formatter: "{b}: {c}",                },            ),        )    f, _ := os.Create("pie.html")    _ = pie.Render(f)}
复制代码


在浏览器中打开pie.html,可以看到下面这样的饼状图:


词云

词语云通过用较大的字体突出显示数据集中最常使用的词语。


在我们的例子中,我们将用关于加密货币流行度的随机数据创建一个词云。


让我们写一个函数来为我们的词云创建随机数据样本:


package main
import ( "math/rand" "os"
"github.com/go-echarts/go-echarts/v2/opts")
var wordCloudData = map[string]interface{}{ "Bitcoin": 10000, "Ethereum": 8000, "Cardano": 5000, "Polygon": 4000, "Polkadot": 3000, "Chainlink": 2500, "Solana": 2000, "Ripple": 1500, "Decentraland": 1000, "Tron": 800, "Sandbox": 500, "Litecoin": 200,}
// generate random data for word cloudfunc generateWordCloudData(data map[string]interface{}) (items []opts.WordCloudData) { items = make([]opts.WordCloudData, 0) for k, v := range data { items = append(items, opts.WordCloudData{Name: k, Value: v}) } return}
复制代码


现在,我们需要创建一个实例并添加自定义选项。


首先,我们使用charts.WithTitleOpts()定义标题和副标题,然后我们向我们的词云图表实例添加数据:


func createWordCloud() {    wc := charts.NewWordCloud()    wc.SetGlobalOptions(        charts.WithTitleOpts(opts.Title{            Title:    "Popular Cryptocurrencies",            Subtitle: "Spot your favourite coins",        }))    wc.AddSeries("wordcloud", generateWordCloudData(wordCloudData)).        SetSeriesOptions(            charts.WithWorldCloudChartOpts(                opts.WordCloudChart{                    SizeRange: []float32{40, 80},                    Shape:     "cardioid",                }),        )    f, _ := os.Create("word_cloud.html")    _ = wc.Render(f)}
复制代码


在你的浏览器中打开word_cloud.html,可以看到像下面这样的单词云:



在上面的词云中,最经常命名的加密货币以最大的字体出现。

结语

在这篇文章中,我们使用go-echarts库练习了一种更好的在 Go 可视化数据的方法。


go-echarts提供了更多类型的图表,如热图、散点图和箱形图,按照我们上面的方法,这些图表很容易建立和填充。


除此之外,你也可以考虑使用以下库来构建 Go 中的图表:


  • go chart: Go 的基本图表库 (3k stars)

  • Glot:建立在gnuplot之上的绘图库(350 starts)

  • PTerm:用于在控制台中绘制图表的 Go 模块(2k stars)


希望你在本教程中能学到一些新东西。




大家好,我是 Jackpop!我花费了半个月的时间把这几年来收集的各种技术干货整理到一起,其中内容包括但不限于 Python、机器学习、深度学习、计算机视觉、推荐系统、Linux、工程化、Java,内容多达 5T+,获取方式:https://pan.baidu.com/s/1eks7CUyjbWQ3A7O9cmYljA(提取码:0000)

发布于: 4 小时前阅读数: 7
用户头像

Jackpop

关注

还未添加个人签名 2020.09.16 加入

公众号:平凡而诗意,微信:code_7steps,全网粉丝超20万,技术进阶、优质资源、实用工具,欢迎关注!

评论

发布
暂无评论
终于玩明白Golang数据可视化了!