用go-echarts在Golang中实现数据的可视化

3,434 阅读6分钟

用图形和图表将数据可视化使其更容易被理解。我们可以使用数据可视化库来轻松生成干净漂亮的图表。

在本教程中,我们将学习如何在Golang中使用 [go-echarts](https://github.com/go-echarts/go-echarts)库。在GitHub上,它有超过4k颗星,使其成为Go中生成图表的最受欢迎的库之一。我们将学习如何设置和安装这个包,然后逐步介绍如何创建不同的图表,包括条形图、折线图、饼图和文字云。

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

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

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

mkdir learn_charts
cd learn_charts

go mod init learn_charts
go get -u github.com/go-echarts/go-echarts/...

touch main.go

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

在Golang中创建一个条形图

首先,我们来介绍一下如何创建条形图,这是最常见和最广泛使用的图表类型之一。当你想显示一个分布或跨组的比较时,条形图是理想的。我们将使用随机数据制作条形图,并探索不同的选项来定制它。

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

package main
import (
    "math/rand"
    "os"

    "github.com/go-echarts/go-echarts/v2/opts"
)
// generate random data for bar chart
func 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
}

现在,我们已经准备好创建我们的柱状图了。为此,我们将初始化一个新的柱状图并设置全局选项,如titlelegend 。然后,我们将使用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 的文件应该被创建。在浏览器中打开它,你应该可以看到你的第一个条形图和Go。你可以随意添加你喜欢的自定义样式。

Go echart Bar Chart

创建折线图

数据科学家经常使用折线图来跟踪一段时间内的变化。在我们的例子中,我们将用随机数据创建一个折线图,并比较两个随机类别。

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

package main

import (
    "math/rand"
    "os"

    "github.com/go-echarts/go-echarts/v2/opts"
)

// generate random data for line chart
func 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 ,你会看到下面这样的图表。

Go Echart Line Graph

创建饼图

当你要比较一个整体的各个部分时,饼图可以说是最好的选择。在我们的例子中,我们将用随机数据创建一个饼图,显示一个学生的销售分数分布。

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

package main

import (
    "math/rand"
    "os"

    "github.com/go-echarts/go-echarts/v2/opts"
)

// generate random data for pie chart
func 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 ,可以看到像下面这样的饼图。

Go echarts Pie Chart Example

创建词云

词语云通过用较大的字体突出显示数据集中最常用的词语。在我们的例子中,我们将用关于加密货币流行度的随机数据创建一个词云。

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

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 cloud
func 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 Echart Word Cloud Example

在上面的词云中,最频繁命名的加密货币以最大的字体出现。在我们的案例中,我们可以推断出这些货币包括比特币和以太坊。

总结

在这篇文章中,我们练习了使用go-echarts 库在Go中可视化数据的更好方法。go-echarts 提供了更多类型的图表,如热图、散点图和箱形图,按照我们上面使用的方法很容易建立和填充这些图表。

另外,你也可以考虑使用以下库来构建Go中的图表。

  • go chart: Go的基本图表库 (3k stars)
  • Glot:建立在gnuplot之上的绘图库(350颗星)。
  • PTerm。用于在控制台中绘制图表的Go模块(2k颗星)

我希望你在本教程中能学到一些新东西。现在,你可以在你自己的Go网络应用中使用图表了。编码愉快!

The postVisualizing data in Golang with go-echartsappeared first onLogRocket Blog.