diff --git a/bar_chart.go b/bar_chart.go index 61fd8f4..7fd068f 100644 --- a/bar_chart.go +++ b/bar_chart.go @@ -26,11 +26,7 @@ import ( "github.com/wcharczuk/go-chart/v2" ) -func BarChartRender(opt ChartOption) (*Draw, error) { - result, err := chartBasicRender(&opt) - if err != nil { - return nil, err - } +func barChartRender(opt ChartOption, result *basicRenderResult) (*Draw, error) { d := result.d bd, err := NewDraw(DrawOption{ diff --git a/chart.go b/chart.go index 0a067b1..a5f924d 100644 --- a/chart.go +++ b/chart.go @@ -30,6 +30,12 @@ import ( "github.com/wcharczuk/go-chart/v2/drawing" ) +const ( + ChartTypeLine = "line" + ChartTypeBar = "bar" + ChartTypePie = "pie" +) + type SeriesData struct { Value float64 Style chart.Style @@ -154,10 +160,46 @@ func (r Range) Values() []string { } type basicRenderResult struct { - xRange *Range - yRange *Range - d *Draw - titleBox chart.Box + xRange *Range + yRange *Range + d *Draw + titleBox chart.Box + seriesOffset int +} + +func ChartRender(opt ChartOption) (*Draw, error) { + result, err := chartBasicRender(&opt) + if err != nil { + return nil, err + } + lineSeries := make([]Series, 0) + barSeries := make([]Series, 0) + for _, item := range opt.SeriesList { + switch item.Type { + case ChartTypeBar: + barSeries = append(barSeries, item) + default: + lineSeries = append(lineSeries, item) + } + } + if len(barSeries) != 0 { + o := opt + o.SeriesList = barSeries + _, err = barChartRender(o, result) + if err != nil { + return nil, err + } + } + if len(lineSeries) != 0 { + o := opt + o.SeriesList = lineSeries + result.seriesOffset = len(barSeries) + _, err = lineChartRender(o, result) + if err != nil { + return nil, err + } + } + return result.d, nil } func chartBasicRender(opt *ChartOption) (*basicRenderResult, error) { diff --git a/line_chart.go b/line_chart.go index 5b8ba1b..56d83cd 100644 --- a/line_chart.go +++ b/line_chart.go @@ -27,11 +27,7 @@ import ( "github.com/wcharczuk/go-chart/v2/drawing" ) -func LineChartRender(opt ChartOption) (*Draw, error) { - result, err := chartBasicRender(&opt) - if err != nil { - return nil, err - } +func lineChartRender(opt ChartOption, result *basicRenderResult) (*Draw, error) { d := result.d theme := NewTheme(opt.Theme) @@ -55,7 +51,7 @@ func LineChartRender(opt ChartOption) (*Draw, error) { Y: y, X: xRange.getWidth(float64(j)), }) - seriesColor := theme.GetSeriesColor(i) + seriesColor := theme.GetSeriesColor(i + result.seriesOffset) dotFillColor := drawing.ColorWhite if theme.IsDark() { dotFillColor = seriesColor