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

go-echarts

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

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

go-echartsgo-echarts
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

柱状图

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

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

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

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

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
}

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

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

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

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

img

折线图

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

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

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

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

img

饼图

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

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

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

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

img

词云

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

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

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

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

img

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

结语

go-echarts
go-echarts

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

go chartGlotgnuplotPTerm

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

大家好,我是Jackpop!我花费了半个月的时间把这几年来收集的各种技术干货整理到一起,其中内容包括但不限于Python、机器学习、深度学习、计算机视觉、推荐系统、Linux、工程化、Java,内容多达5T+,获取方式:技术干货_免费高速下载|百度网盘-分享无限制(提取码:0000)