refactor: adjust series label render
This commit is contained in:
parent
de49ef8c68
commit
1f5b9d513e
4 changed files with 94 additions and 55 deletions
39
bar_chart.go
39
bar_chart.go
|
|
@ -93,9 +93,7 @@ func (b *barChart) render(result *defaultRenderResult, seriesList SeriesList) (B
|
||||||
|
|
||||||
markPointPainter := NewMarkPointPainter(seriesPainter)
|
markPointPainter := NewMarkPointPainter(seriesPainter)
|
||||||
markLinePainter := NewMarkLinePainter(seriesPainter)
|
markLinePainter := NewMarkLinePainter(seriesPainter)
|
||||||
labelPainter := NewSeriesLabelPainter(seriesPainter)
|
|
||||||
rendererList := []Renderer{
|
rendererList := []Renderer{
|
||||||
labelPainter,
|
|
||||||
markPointPainter,
|
markPointPainter,
|
||||||
markLinePainter,
|
markLinePainter,
|
||||||
}
|
}
|
||||||
|
|
@ -106,6 +104,18 @@ func (b *barChart) render(result *defaultRenderResult, seriesList SeriesList) (B
|
||||||
|
|
||||||
divideValues := xRange.AutoDivide()
|
divideValues := xRange.AutoDivide()
|
||||||
points := make([]Point, len(series.Data))
|
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 {
|
for j, item := range series.Data {
|
||||||
if j >= xRange.divideCount {
|
if j >= xRange.divideCount {
|
||||||
continue
|
continue
|
||||||
|
|
@ -144,29 +154,14 @@ func (b *barChart) render(result *defaultRenderResult, seriesList SeriesList) (B
|
||||||
Y: top,
|
Y: top,
|
||||||
}
|
}
|
||||||
// 如果label不需要展示,则返回
|
// 如果label不需要展示,则返回
|
||||||
if !series.Label.Show {
|
if labelPainter == nil {
|
||||||
continue
|
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{
|
labelPainter.Add(LabelValue{
|
||||||
Text: text,
|
Index: index,
|
||||||
Style: labelStyle,
|
Value: item.Value,
|
||||||
X: x + (barWidth-textBox.Width())>>1,
|
X: x + barWidth>>1,
|
||||||
Y: barMaxHeight - h - distance,
|
Y: barMaxHeight - h,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
File diff suppressed because one or more lines are too long
|
|
@ -97,9 +97,7 @@ func (l *lineChart) render(result *defaultRenderResult, seriesList SeriesList) (
|
||||||
}
|
}
|
||||||
markPointPainter := NewMarkPointPainter(seriesPainter)
|
markPointPainter := NewMarkPointPainter(seriesPainter)
|
||||||
markLinePainter := NewMarkLinePainter(seriesPainter)
|
markLinePainter := NewMarkLinePainter(seriesPainter)
|
||||||
labelPainter := NewSeriesLabelPainter(seriesPainter)
|
|
||||||
rendererList := []Renderer{
|
rendererList := []Renderer{
|
||||||
labelPainter,
|
|
||||||
markPointPainter,
|
markPointPainter,
|
||||||
markLinePainter,
|
markLinePainter,
|
||||||
}
|
}
|
||||||
|
|
@ -108,7 +106,6 @@ func (l *lineChart) render(result *defaultRenderResult, seriesList SeriesList) (
|
||||||
strokeWidth = defaultStrokeWidth
|
strokeWidth = defaultStrokeWidth
|
||||||
}
|
}
|
||||||
seriesNames := seriesList.Names()
|
seriesNames := seriesList.Names()
|
||||||
theme := opt.Theme
|
|
||||||
for index := range seriesList {
|
for index := range seriesList {
|
||||||
series := seriesList[index]
|
series := seriesList[index]
|
||||||
seriesColor := opt.Theme.GetSeriesColor(series.index)
|
seriesColor := opt.Theme.GetSeriesColor(series.index)
|
||||||
|
|
@ -119,6 +116,17 @@ func (l *lineChart) render(result *defaultRenderResult, seriesList SeriesList) (
|
||||||
|
|
||||||
yRange := result.axisRanges[series.AxisIndex]
|
yRange := result.axisRanges[series.AxisIndex]
|
||||||
points := make([]Point, 0)
|
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 {
|
for i, item := range series.Data {
|
||||||
h := yRange.getRestHeight(item.Value)
|
h := yRange.getRestHeight(item.Value)
|
||||||
if item.Value == nullValue {
|
if item.Value == nullValue {
|
||||||
|
|
@ -131,29 +139,14 @@ func (l *lineChart) render(result *defaultRenderResult, seriesList SeriesList) (
|
||||||
points = append(points, p)
|
points = append(points, p)
|
||||||
|
|
||||||
// 如果label不需要展示,则返回
|
// 如果label不需要展示,则返回
|
||||||
if !series.Label.Show {
|
if labelPainter == nil {
|
||||||
continue
|
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{
|
labelPainter.Add(LabelValue{
|
||||||
Text: text,
|
Index: index,
|
||||||
Style: labelStyle,
|
Value: item.Value,
|
||||||
X: p.X - textBox.Width()>>1,
|
X: p.X,
|
||||||
Y: p.Y - distance,
|
Y: p.Y,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
// 如果需要填充区域
|
// 如果需要填充区域
|
||||||
|
|
|
||||||
|
|
@ -22,29 +22,80 @@
|
||||||
|
|
||||||
package charts
|
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
|
Text string
|
||||||
Style Style
|
Style Style
|
||||||
X int
|
X int
|
||||||
Y int
|
Y int
|
||||||
}
|
}
|
||||||
|
|
||||||
type SeriesLabelPainter struct {
|
type LabelValue struct {
|
||||||
p *Painter
|
Index int
|
||||||
values []LabelValue
|
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{
|
return &SeriesLabelPainter{
|
||||||
p: p,
|
p: params.P,
|
||||||
values: make([]LabelValue, 0),
|
seriesNames: params.SeriesNames,
|
||||||
|
label: ¶ms.Label,
|
||||||
|
theme: params.Theme,
|
||||||
|
font: params.Font,
|
||||||
|
values: make([]labelRenderValue, 0),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o *SeriesLabelPainter) Add(value LabelValue) {
|
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) {
|
func (o *SeriesLabelPainter) Render() (Box, error) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue