refactor: adjust series label render

This commit is contained in:
vicanso 2022-09-23 20:50:42 +08:00
parent de49ef8c68
commit 1f5b9d513e
4 changed files with 94 additions and 55 deletions

View file

@ -93,9 +93,7 @@ func (b *barChart) render(result *defaultRenderResult, seriesList SeriesList) (B
markPointPainter := NewMarkPointPainter(seriesPainter)
markLinePainter := NewMarkLinePainter(seriesPainter)
labelPainter := NewSeriesLabelPainter(seriesPainter)
rendererList := []Renderer{
labelPainter,
markPointPainter,
markLinePainter,
}
@ -106,6 +104,18 @@ func (b *barChart) render(result *defaultRenderResult, seriesList SeriesList) (B
divideValues := xRange.AutoDivide()
points := make([]Point, len(series.Data))
var labelPainter *SeriesLabelPainter
if series.Label.Show {
labelPainter = NewSeriesLabelPainter(SeriesLabelPainterParams{
P: seriesPainter,
SeriesNames: seriesNames,
Label: series.Label,
Theme: opt.Theme,
Font: opt.Font,
})
rendererList = append(rendererList, labelPainter)
}
for j, item := range series.Data {
if j >= xRange.divideCount {
continue
@ -144,29 +154,14 @@ func (b *barChart) render(result *defaultRenderResult, seriesList SeriesList) (B
Y: top,
}
// 如果label不需要展示则返回
if !series.Label.Show {
if labelPainter == nil {
continue
}
distance := series.Label.Distance
if distance == 0 {
distance = 5
}
text := NewValueLabelFormatter(seriesNames, series.Label.Formatter)(index, item.Value, -1)
labelStyle := Style{
FontColor: theme.GetTextColor(),
FontSize: labelFontSize,
Font: opt.Font,
}
if !series.Label.Color.IsZero() {
labelStyle.FontColor = series.Label.Color
}
textBox := seriesPainter.MeasureText(text)
labelPainter.Add(LabelValue{
Text: text,
Style: labelStyle,
X: x + (barWidth-textBox.Width())>>1,
Y: barMaxHeight - h - distance,
Index: index,
Value: item.Value,
X: x + barWidth>>1,
Y: barMaxHeight - h,
})
}

File diff suppressed because one or more lines are too long

View file

@ -97,9 +97,7 @@ func (l *lineChart) render(result *defaultRenderResult, seriesList SeriesList) (
}
markPointPainter := NewMarkPointPainter(seriesPainter)
markLinePainter := NewMarkLinePainter(seriesPainter)
labelPainter := NewSeriesLabelPainter(seriesPainter)
rendererList := []Renderer{
labelPainter,
markPointPainter,
markLinePainter,
}
@ -108,7 +106,6 @@ func (l *lineChart) render(result *defaultRenderResult, seriesList SeriesList) (
strokeWidth = defaultStrokeWidth
}
seriesNames := seriesList.Names()
theme := opt.Theme
for index := range seriesList {
series := seriesList[index]
seriesColor := opt.Theme.GetSeriesColor(series.index)
@ -119,6 +116,17 @@ func (l *lineChart) render(result *defaultRenderResult, seriesList SeriesList) (
yRange := result.axisRanges[series.AxisIndex]
points := make([]Point, 0)
var labelPainter *SeriesLabelPainter
if series.Label.Show {
labelPainter = NewSeriesLabelPainter(SeriesLabelPainterParams{
P: seriesPainter,
SeriesNames: seriesNames,
Label: series.Label,
Theme: opt.Theme,
Font: opt.Font,
})
rendererList = append(rendererList, labelPainter)
}
for i, item := range series.Data {
h := yRange.getRestHeight(item.Value)
if item.Value == nullValue {
@ -131,29 +139,14 @@ func (l *lineChart) render(result *defaultRenderResult, seriesList SeriesList) (
points = append(points, p)
// 如果label不需要展示则返回
if !series.Label.Show {
if labelPainter == nil {
continue
}
distance := series.Label.Distance
if distance == 0 {
distance = 5
}
text := NewValueLabelFormatter(seriesNames, series.Label.Formatter)(index, item.Value, -1)
labelStyle := Style{
FontColor: theme.GetTextColor(),
FontSize: labelFontSize,
Font: opt.Font,
}
if !series.Label.Color.IsZero() {
labelStyle.FontColor = series.Label.Color
}
textBox := seriesPainter.MeasureText(text)
labelPainter.Add(LabelValue{
Text: text,
Style: labelStyle,
X: p.X - textBox.Width()>>1,
Y: p.Y - distance,
Index: index,
Value: item.Value,
X: p.X,
Y: p.Y,
})
}
// 如果需要填充区域

View file

@ -22,29 +22,80 @@
package charts
import "github.com/wcharczuk/go-chart/v2"
import (
"github.com/golang/freetype/truetype"
"github.com/wcharczuk/go-chart/v2"
)
type LabelValue struct {
type labelRenderValue struct {
Text string
Style Style
X int
Y int
}
type SeriesLabelPainter struct {
p *Painter
values []LabelValue
type LabelValue struct {
Index int
Value float64
X int
Y int
}
func NewSeriesLabelPainter(p *Painter) *SeriesLabelPainter {
type SeriesLabelPainter struct {
p *Painter
seriesNames []string
label *SeriesLabel
theme ColorPalette
font *truetype.Font
values []labelRenderValue
}
type SeriesLabelPainterParams struct {
P *Painter
SeriesNames []string
Label SeriesLabel
Theme ColorPalette
Font *truetype.Font
}
func NewSeriesLabelPainter(params SeriesLabelPainterParams) *SeriesLabelPainter {
return &SeriesLabelPainter{
p: p,
values: make([]LabelValue, 0),
p: params.P,
seriesNames: params.SeriesNames,
label: &params.Label,
theme: params.Theme,
font: params.Font,
values: make([]labelRenderValue, 0),
}
}
func (o *SeriesLabelPainter) Add(value LabelValue) {
o.values = append(o.values, value)
label := o.label
distance := label.Distance
if distance == 0 {
distance = 5
}
text := NewValueLabelFormatter(o.seriesNames, label.Formatter)(value.Index, value.Value, -1)
labelStyle := Style{
FontColor: o.theme.GetTextColor(),
FontSize: labelFontSize,
Font: o.font,
}
if !label.Color.IsZero() {
labelStyle.FontColor = label.Color
}
o.p.OverrideDrawingStyle(labelStyle)
textBox := o.p.MeasureText(text)
renderValue := labelRenderValue{
Text: text,
Style: labelStyle,
X: value.X - textBox.Width()>>1,
Y: value.Y - distance,
}
if textBox.Width()%2 != 0 {
renderValue.X++
}
o.values = append(o.values, renderValue)
}
func (o *SeriesLabelPainter) Render() (Box, error) {