From bbad84f537d7db4e26b6bbc9b331bf0bebe8b831 Mon Sep 17 00:00:00 2001 From: Rico Date: Sat, 5 Feb 2022 17:07:04 +0100 Subject: [PATCH 1/4] feat: implement legend type with fixed length line on the left side fixes #185 --- legend.go | 118 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 118 insertions(+) diff --git a/legend.go b/legend.go index fbd48ed0..a6c301c9 100644 --- a/legend.go +++ b/legend.go @@ -118,6 +118,124 @@ func Legend(c *Chart, userDefaults ...Style) Renderable { } } +// LegendLineLeft is a legend with the line drawn left to the legend text. +func LegendLineLeft(c *Chart, userDefaults ...Style) Renderable { + return func(r Renderer, cb Box, chartDefaults Style) { + legendDefaults := Style{ + FillColor: drawing.ColorWhite, + FontColor: DefaultTextColor, + FontSize: 8.0, + StrokeColor: DefaultAxisColor, + StrokeWidth: DefaultAxisLineWidth, + } + + var legendStyle Style + if len(userDefaults) > 0 { + legendStyle = userDefaults[0].InheritFrom(chartDefaults.InheritFrom(legendDefaults)) + } else { + legendStyle = chartDefaults.InheritFrom(legendDefaults) + } + + // DEFAULTS + legendPadding := Box{ + Top: 5, + Left: 5, + Right: 5, + Bottom: 5, + } + lineTextGap := 5 + lineLengthMinimum := 25 + + var labels []string + var lines []Style + for index, s := range c.Series { + if !s.GetStyle().Hidden { + if _, isAnnotationSeries := s.(AnnotationSeries); !isAnnotationSeries { + labels = append(labels, s.GetName()) + lines = append(lines, s.GetStyle().InheritFrom(c.styleDefaultsSeries(index))) + } + } + } + + legend := Box{ + Top: cb.Top, + Left: cb.Left, + // bottom and right will be sized by the legend content + relevant padding. + } + + legendContent := Box{ + Top: legend.Top + legendPadding.Top, + Left: legend.Left + legendPadding.Left, + Right: legend.Left + legendPadding.Left, + Bottom: legend.Top + legendPadding.Top, + } + + legendStyle.GetTextOptions().WriteToRenderer(r) + + // measure + labelCount := 0 + for x := 0; x < len(labels); x++ { + if len(labels[x]) > 0 { + tb := r.MeasureText(labels[x]) + if labelCount > 0 { + legendContent.Bottom += DefaultMinimumTickVerticalSpacing + } + legendContent.Bottom += tb.Height() + right := legendContent.Left + tb.Width() + lineTextGap + lineLengthMinimum + legendContent.Right = MaxInt(legendContent.Right, right) + labelCount++ + } + } + + legend = legend.Grow(legendContent) + legend.Right = legendContent.Right + legendPadding.Right + legend.Bottom = legendContent.Bottom + legendPadding.Bottom + + Draw.Box(r, legend, legendStyle) + + legendStyle.GetTextOptions().WriteToRenderer(r) + + ycursor := legendContent.Top + lx := legendContent.Left + legendCount := 0 + var label string + for x := 0; x < len(labels); x++ { + label = labels[x] + if len(label) > 0 { + if legendCount > 0 { + ycursor += DefaultMinimumTickVerticalSpacing + } + + // Calculate text dimensions + tb := r.MeasureText(label) + ty := ycursor + tb.Height() + th2 := tb.Height() >> 1 + + // Calculate line x and y coordinates + ly := ty - th2 + + // Calculate line ending x coordinate + lx2 := lx + lineLengthMinimum + + r.SetStrokeColor(lines[x].GetStrokeColor()) + r.SetStrokeWidth(lines[x].GetStrokeWidth()) + r.SetStrokeDashArray(lines[x].GetStrokeDashArray()) + + r.MoveTo(lx, ly) + r.LineTo(lx2, ly) + r.Stroke() + + // Calculate Text starting coordinates + textX := lx2 + lineTextGap + r.Text(label, textX, ty) + + ycursor += tb.Height() + legendCount++ + } + } + } +} + // LegendThin is a legend that doesn't obscure the chart area. func LegendThin(c *Chart, userDefaults ...Style) Renderable { return func(r Renderer, cb Box, chartDefaults Style) { From 5407f1fdb49d1eb1578c6365bc536b2b54e19614 Mon Sep 17 00:00:00 2001 From: Rico Date: Sat, 5 Feb 2022 17:08:25 +0100 Subject: [PATCH 2/4] docs: add example for legend with line on the left side --- examples/legend_line_left/main.go | 62 +++++++++++++++++++++++++++ examples/legend_line_left/output.png | Bin 0 -> 51525 bytes 2 files changed, 62 insertions(+) create mode 100644 examples/legend_line_left/main.go create mode 100644 examples/legend_line_left/output.png diff --git a/examples/legend_line_left/main.go b/examples/legend_line_left/main.go new file mode 100644 index 00000000..10675ccd --- /dev/null +++ b/examples/legend_line_left/main.go @@ -0,0 +1,62 @@ +package main + +import ( + "github.com/wcharczuk/go-chart/v2" + "os" + "time" +) + +func main() { + xv, yv := xvalues(), yvalues() + + priceSeries := chart.TimeSeries{ + Name: "Very long name for a time series to test legend", + Style: chart.Style{ + StrokeColor: chart.GetDefaultColor(0), + }, + XValues: xv, + YValues: yv, + } + + linRegSeries := &chart.LinearRegressionSeries{ + Name: "Regression", + InnerSeries: priceSeries, + } + + graph := chart.Chart{ + XAxis: chart.XAxis{ + TickPosition: chart.TickPositionBetweenTicks, + }, + YAxis: chart.YAxis{ + Range: &chart.ContinuousRange{ + Max: 220.0, + Min: 180.0, + }, + }, + Series: []chart.Series{ + priceSeries, + linRegSeries, + }, + } + + graph.Elements = []chart.Renderable{chart.LegendLineLeft(&graph, chart.Style{})} + + f, _ := os.Create("output.png") + defer f.Close() + graph.Render(chart.PNG, f) +} + +func xvalues() []time.Time { + rawx := []string{"2015-07-17", "2015-07-20", "2015-07-21", "2015-07-22", "2015-07-23", "2015-07-24", "2015-07-27", "2015-07-28", "2015-07-29", "2015-07-30", "2015-07-31", "2015-08-03", "2015-08-04", "2015-08-05", "2015-08-06", "2015-08-07", "2015-08-10", "2015-08-11", "2015-08-12", "2015-08-13", "2015-08-14", "2015-08-17", "2015-08-18", "2015-08-19", "2015-08-20", "2015-08-21", "2015-08-24", "2015-08-25", "2015-08-26", "2015-08-27", "2015-08-28", "2015-08-31", "2015-09-01", "2015-09-02", "2015-09-03", "2015-09-04", "2015-09-08", "2015-09-09", "2015-09-10", "2015-09-11", "2015-09-14", "2015-09-15", "2015-09-16", "2015-09-17", "2015-09-18", "2015-09-21", "2015-09-22", "2015-09-23", "2015-09-24", "2015-09-25", "2015-09-28", "2015-09-29", "2015-09-30", "2015-10-01", "2015-10-02", "2015-10-05", "2015-10-06", "2015-10-07", "2015-10-08", "2015-10-09", "2015-10-12", "2015-10-13", "2015-10-14", "2015-10-15", "2015-10-16", "2015-10-19", "2015-10-20", "2015-10-21", "2015-10-22", "2015-10-23", "2015-10-26", "2015-10-27", "2015-10-28", "2015-10-29", "2015-10-30", "2015-11-02", "2015-11-03", "2015-11-04", "2015-11-05", "2015-11-06", "2015-11-09", "2015-11-10", "2015-11-11", "2015-11-12", "2015-11-13", "2015-11-16", "2015-11-17", "2015-11-18", "2015-11-19", "2015-11-20", "2015-11-23", "2015-11-24", "2015-11-25", "2015-11-27", "2015-11-30", "2015-12-01", "2015-12-02", "2015-12-03", "2015-12-04", "2015-12-07", "2015-12-08", "2015-12-09", "2015-12-10", "2015-12-11", "2015-12-14", "2015-12-15", "2015-12-16", "2015-12-17", "2015-12-18", "2015-12-21", "2015-12-22", "2015-12-23", "2015-12-24", "2015-12-28", "2015-12-29", "2015-12-30", "2015-12-31", "2016-01-04", "2016-01-05", "2016-01-06", "2016-01-07", "2016-01-08", "2016-01-11", "2016-01-12", "2016-01-13", "2016-01-14", "2016-01-15", "2016-01-19", "2016-01-20", "2016-01-21", "2016-01-22", "2016-01-25", "2016-01-26", "2016-01-27", "2016-01-28", "2016-01-29", "2016-02-01", "2016-02-02", "2016-02-03", "2016-02-04", "2016-02-05", "2016-02-08", "2016-02-09", "2016-02-10", "2016-02-11", "2016-02-12", "2016-02-16", "2016-02-17", "2016-02-18", "2016-02-19", "2016-02-22", "2016-02-23", "2016-02-24", "2016-02-25", "2016-02-26", "2016-02-29", "2016-03-01", "2016-03-02", "2016-03-03", "2016-03-04", "2016-03-07", "2016-03-08", "2016-03-09", "2016-03-10", "2016-03-11", "2016-03-14", "2016-03-15", "2016-03-16", "2016-03-17", "2016-03-18", "2016-03-21", "2016-03-22", "2016-03-23", "2016-03-24", "2016-03-28", "2016-03-29", "2016-03-30", "2016-03-31", "2016-04-01", "2016-04-04", "2016-04-05", "2016-04-06", "2016-04-07", "2016-04-08", "2016-04-11", "2016-04-12", "2016-04-13", "2016-04-14", "2016-04-15", "2016-04-18", "2016-04-19", "2016-04-20", "2016-04-21", "2016-04-22", "2016-04-25", "2016-04-26", "2016-04-27", "2016-04-28", "2016-04-29", "2016-05-02", "2016-05-03", "2016-05-04", "2016-05-05", "2016-05-06", "2016-05-09", "2016-05-10", "2016-05-11", "2016-05-12", "2016-05-13", "2016-05-16", "2016-05-17", "2016-05-18", "2016-05-19", "2016-05-20", "2016-05-23", "2016-05-24", "2016-05-25", "2016-05-26", "2016-05-27", "2016-05-31", "2016-06-01", "2016-06-02", "2016-06-03", "2016-06-06", "2016-06-07", "2016-06-08", "2016-06-09", "2016-06-10", "2016-06-13", "2016-06-14", "2016-06-15", "2016-06-16", "2016-06-17", "2016-06-20", "2016-06-21", "2016-06-22", "2016-06-23", "2016-06-24", "2016-06-27", "2016-06-28", "2016-06-29", "2016-06-30", "2016-07-01", "2016-07-05", "2016-07-06", "2016-07-07", "2016-07-08", "2016-07-11", "2016-07-12", "2016-07-13", "2016-07-14", "2016-07-15"} + + var dates []time.Time + for _, ts := range rawx { + parsed, _ := time.Parse(chart.DefaultDateFormat, ts) + dates = append(dates, parsed) + } + return dates +} + +func yvalues() []float64 { + return []float64{212.47, 212.59, 211.76, 211.37, 210.18, 208.00, 206.79, 209.33, 210.77, 210.82, 210.50, 209.79, 209.38, 210.07, 208.35, 207.95, 210.57, 208.66, 208.92, 208.66, 209.42, 210.59, 209.98, 208.32, 203.97, 197.83, 189.50, 187.27, 194.46, 199.27, 199.28, 197.67, 191.77, 195.41, 195.55, 192.59, 197.43, 194.79, 195.85, 196.74, 196.01, 198.45, 200.18, 199.73, 195.45, 196.46, 193.90, 193.60, 192.90, 192.87, 188.01, 188.12, 191.63, 192.13, 195.00, 198.47, 197.79, 199.41, 201.21, 201.33, 201.52, 200.25, 199.29, 202.35, 203.27, 203.37, 203.11, 201.85, 205.26, 207.51, 207.00, 206.60, 208.95, 208.83, 207.93, 210.39, 211.00, 210.36, 210.15, 210.04, 208.08, 208.56, 207.74, 204.84, 202.54, 205.62, 205.47, 208.73, 208.55, 209.31, 209.07, 209.35, 209.32, 209.56, 208.69, 210.68, 208.53, 205.61, 209.62, 208.35, 206.95, 205.34, 205.87, 201.88, 202.90, 205.03, 208.03, 204.86, 200.02, 201.67, 203.50, 206.02, 205.68, 205.21, 207.40, 205.93, 203.87, 201.02, 201.36, 198.82, 194.05, 191.92, 192.11, 193.66, 188.83, 191.93, 187.81, 188.06, 185.65, 186.69, 190.52, 187.64, 190.20, 188.13, 189.11, 193.72, 193.65, 190.16, 191.30, 191.60, 187.95, 185.42, 185.43, 185.27, 182.86, 186.63, 189.78, 192.88, 192.09, 192.00, 194.78, 192.32, 193.20, 195.54, 195.09, 193.56, 198.11, 199.00, 199.78, 200.43, 200.59, 198.40, 199.38, 199.54, 202.76, 202.50, 202.17, 203.34, 204.63, 204.38, 204.67, 204.56, 203.21, 203.12, 203.24, 205.12, 206.02, 205.52, 206.92, 206.25, 204.19, 206.42, 203.95, 204.50, 204.02, 205.92, 208.00, 208.01, 207.78, 209.24, 209.90, 210.10, 208.97, 208.97, 208.61, 208.92, 209.35, 207.45, 206.33, 207.97, 206.16, 205.01, 204.97, 205.72, 205.89, 208.45, 206.50, 206.56, 204.76, 206.78, 204.85, 204.91, 204.20, 205.49, 205.21, 207.87, 209.28, 209.34, 210.24, 209.84, 210.27, 210.91, 210.28, 211.35, 211.68, 212.37, 212.08, 210.07, 208.45, 208.04, 207.75, 208.37, 206.52, 207.85, 208.44, 208.10, 210.81, 203.24, 199.60, 203.20, 206.66, 209.48, 209.92, 208.41, 209.66, 209.53, 212.65, 213.40, 214.95, 214.92, 216.12, 215.83} +} diff --git a/examples/legend_line_left/output.png b/examples/legend_line_left/output.png new file mode 100644 index 0000000000000000000000000000000000000000..e6b893cc8918661b5e9e84d0f07b0a8335fe692a GIT binary patch literal 51525 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�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 Date: Tue, 8 Feb 2022 03:10:53 +0100 Subject: [PATCH 3/4] fix: use padding in legend from passed style Prior to this commit we simply defined a hardcoded padding. This commit respects the passed style and inherits from a default padding defined in legendDefaults. --- legend.go | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/legend.go b/legend.go index a6c301c9..ae32360c 100644 --- a/legend.go +++ b/legend.go @@ -127,6 +127,12 @@ func LegendLineLeft(c *Chart, userDefaults ...Style) Renderable { FontSize: 8.0, StrokeColor: DefaultAxisColor, StrokeWidth: DefaultAxisLineWidth, + Padding: Box{ + Top: 5, + Left: 5, + Right: 5, + Bottom: 5, + }, } var legendStyle Style @@ -137,12 +143,6 @@ func LegendLineLeft(c *Chart, userDefaults ...Style) Renderable { } // DEFAULTS - legendPadding := Box{ - Top: 5, - Left: 5, - Right: 5, - Bottom: 5, - } lineTextGap := 5 lineLengthMinimum := 25 @@ -164,10 +164,10 @@ func LegendLineLeft(c *Chart, userDefaults ...Style) Renderable { } legendContent := Box{ - Top: legend.Top + legendPadding.Top, - Left: legend.Left + legendPadding.Left, - Right: legend.Left + legendPadding.Left, - Bottom: legend.Top + legendPadding.Top, + Top: legend.Top + legendStyle.Padding.Top, + Left: legend.Left + legendStyle.Padding.Left, + Right: legend.Left + legendStyle.Padding.Left, + Bottom: legend.Top + legendStyle.Padding.Top, } legendStyle.GetTextOptions().WriteToRenderer(r) @@ -188,8 +188,8 @@ func LegendLineLeft(c *Chart, userDefaults ...Style) Renderable { } legend = legend.Grow(legendContent) - legend.Right = legendContent.Right + legendPadding.Right - legend.Bottom = legendContent.Bottom + legendPadding.Bottom + legend.Right = legendContent.Right + legendStyle.Padding.Right + legend.Bottom = legendContent.Bottom + legendStyle.Padding.Bottom Draw.Box(r, legend, legendStyle) @@ -215,7 +215,7 @@ func LegendLineLeft(c *Chart, userDefaults ...Style) Renderable { ly := ty - th2 // Calculate line ending x coordinate - lx2 := lx + lineLengthMinimum + lx2 := lx + lineLengthMinimum - legendStyle.Padding.Left r.SetStrokeColor(lines[x].GetStrokeColor()) r.SetStrokeWidth(lines[x].GetStrokeWidth()) From 901d2bb313e1b7626127c6647715b8e231c5543b Mon Sep 17 00:00:00 2001 From: Rico Date: Tue, 8 Feb 2022 03:47:05 +0100 Subject: [PATCH 4/4] fix: use fixed length for left stroked legend The stroke length was just way too long, so I first tried to decrease the length by subtracting the padding from it, but it was not a big difference. I ended up using a hardcoded value because it gave the best visual results on different resolutions. --- legend.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/legend.go b/legend.go index ae32360c..995df0c6 100644 --- a/legend.go +++ b/legend.go @@ -145,6 +145,7 @@ func LegendLineLeft(c *Chart, userDefaults ...Style) Renderable { // DEFAULTS lineTextGap := 5 lineLengthMinimum := 25 + strokeLength := 17 var labels []string var lines []Style @@ -215,7 +216,7 @@ func LegendLineLeft(c *Chart, userDefaults ...Style) Renderable { ly := ty - th2 // Calculate line ending x coordinate - lx2 := lx + lineLengthMinimum - legendStyle.Padding.Left + lx2 := lx + strokeLength r.SetStrokeColor(lines[x].GetStrokeColor()) r.SetStrokeWidth(lines[x].GetStrokeWidth())