From 69c70bfdf59515b96b5e0d00a067eb7a272098e1 Mon Sep 17 00:00:00 2001 From: Andre Ziviani Date: Thu, 11 Feb 2021 19:58:47 -0300 Subject: [PATCH] feat/tree: add tree chart type --- charts/series.go | 14 ++++++++++++++ charts/tree.go | 35 +++++++++++++++++++++++++++++++++++ opts/charts.go | 46 ++++++++++++++++++++++++++++++++++++++++++++++ types/charts.go | 1 + 4 files changed, 96 insertions(+) create mode 100644 charts/tree.go diff --git a/charts/series.go b/charts/series.go index 2a2d5908c..035ed7683 100644 --- a/charts/series.go +++ b/charts/series.go @@ -49,6 +49,11 @@ type SingleSeries struct { // Scatter SymbolSize float32 `json:"symbolSize,omitempty"` + // Tree + Orient string `json:"orient,omitempty"` + ExpandAndCollapse bool `json:"expandAndCollapse"` + InitialTreeDepth int `json:"initialTreeDepth,omitempty"` + // WordCloud Shape string `json:"shape,omitempty"` SizeRange []float32 `json:"sizeRange,omitempty"` @@ -195,6 +200,15 @@ func WithBar3DChartOpts(opt opts.Bar3DChart) SeriesOpts { } } +// WithTreeOpts +func WithTreeOpts(opt opts.TreeChart) SeriesOpts { + return func(s *SingleSeries) { + s.Orient = opt.Orient + s.ExpandAndCollapse = opt.ExpandAndCollapse + s.InitialTreeDepth = opt.InitialTreeDepth + } +} + // WithWorldCloudChartOpts func WithWorldCloudChartOpts(opt opts.WordCloudChart) SeriesOpts { return func(s *SingleSeries) { diff --git a/charts/tree.go b/charts/tree.go new file mode 100644 index 000000000..ec60cdf41 --- /dev/null +++ b/charts/tree.go @@ -0,0 +1,35 @@ +package charts + +import ( + "github.com/go-echarts/go-echarts/v2/opts" + "github.com/go-echarts/go-echarts/v2/render" + "github.com/go-echarts/go-echarts/v2/types" +) + +// Tree represents a Tree chart. +type Tree struct { + RectChart +} + +// Type returns the chart type. +func (Tree) Type() string { return types.Tree } + +// NewTree creates a new Tree chart instance. +func NewTree() *Tree { + c := &Tree{} + c.initBaseConfiguration() + c.Renderer = render.NewChartRender(c, c.Validate) + return c +} + +func (c *Tree) AddSeries(name string, data []opts.TreeData, options ...SeriesOpts) *Tree { + series := SingleSeries{Name: name, Type: types.Tree, Data: data} + series.configureSeriesOpts(options...) + c.MultiSeries = append(c.MultiSeries, series) + return c +} + +// Validate validates the given configuration. +func (c *Tree) Validate() { + c.Assets.Validate(c.AssetsHost) +} diff --git a/opts/charts.go b/opts/charts.go index 769a6440d..f14936687 100644 --- a/opts/charts.go +++ b/opts/charts.go @@ -516,3 +516,49 @@ type Chart3DData struct { // The style setting of the text label in a single bar. Label *Label `json:"label,omitempty"` } + +type TreeChart struct { + // The layout of the tree, which can be orthogonal and radial. + // * 'orthogonal' refer to the horizontal and vertical direction. + // * 'radial' refers to the view that the root node as the center and each layer of nodes as the ring. + Layout string + + // The direction of the orthogonal layout in the tree diagram. + // * 'from left to right' or 'LR' + // * 'from right to left' or 'RL' + // * 'from top to bottom' or 'TB' + // * 'from bottom to top' or 'BT' + Orient string `json:"orient,omitempty"` + + // Whether to enable mouse zooming and translating. false by default. + // If either zooming or translating is wanted, it can be set to 'scale' or 'move'. + // Otherwise, set it to be true to enable both. + Roam bool + + // Subtree collapses and expands interaction, default true. + ExpandAndCollapse bool `json:"expandAndCollapse"` + + // The initial level (depth) of the tree. The root node is the 0th layer, then the first layer, the second layer, ... , until the leaf node. + // This configuration item is primarily used in conjunction with collapsing and expansion interactions. + // The purpose is to prevent the nodes from obscuring each other. If set as -1 or null or undefined, all nodes are expanded. + InitialTreeDepth int `json:"initialTreeDepth,omitempty"` +} + +type TreeData struct { + // Name of the data item. + Name string `json:"name,omitempty"` + + // Value of the data item. + Value int `json:"value,omitempty"` + + Children []*TreeData `json:"children,omitempty"` + // Symbol of node of this category. + // Icon types provided by ECharts includes + // 'circle', 'rect', 'roundRect', 'triangle', 'diamond', 'pin', 'arrow', 'none' + // It can be set to an image with 'image://url' , in which URL is the link to an image, or dataURI of an image. + Symbol string `json:"symbol,omitempty"` + + // node of this category symbol size. It can be set to single numbers like 10, + // or use an array to represent width and height. For example, [20, 10] means symbol width is 20, and height is10. + SymbolSize interface{} `json:"symbolSize,omitempty"` +} diff --git a/types/charts.go b/types/charts.go index e8f2b4810..398cf96e6 100644 --- a/types/charts.go +++ b/types/charts.go @@ -26,4 +26,5 @@ const ( ChartSurface3D = "surface" ChartThemeRiver = "themeRiver" ChartWordCloud = "wordCloud" + Tree = "tree" )