From fdb1b191b2c4bd06d3892d46ebbd5ddeb25a303d Mon Sep 17 00:00:00 2001 From: Will Charczuk Date: Fri, 14 Apr 2017 17:43:52 -0700 Subject: [PATCH] color maps --- _examples/scatter/main.go | 19 +-- bar_chart.go | 24 +++- chart.go | 29 ++-- colors.go | 184 ++++++++++++++++++++++++++ defaults.go | 132 ------------------ draw.go | 15 ++- font.go | 28 ++++ pie_chart.go | 28 ++-- style.go | 8 +- value_provider.go | 8 ++ vidris.go | 272 ++++++++++++++++++++++++++++++++++++++ 11 files changed, 577 insertions(+), 170 deletions(-) create mode 100644 colors.go create mode 100644 font.go create mode 100644 vidris.go diff --git a/_examples/scatter/main.go b/_examples/scatter/main.go index 780c71f..b267316 100644 --- a/_examples/scatter/main.go +++ b/_examples/scatter/main.go @@ -14,18 +14,19 @@ func drawChart(res http.ResponseWriter, req *http.Request) { Series: []chart.Series{ chart.ContinuousSeries{ Style: chart.Style{ - Show: true, - StrokeWidth: chart.Disabled, - DotWidth: 3, + Show: true, + StrokeWidth: chart.Disabled, + DotWidthProvider: func(rx, ry, x, y float64) float64 { return 10 * (y / ry) }, + DotColorProvider: chart.Vidris, }, - XValues: chart.Sequence.Random(8192, 1024), - YValues: chart.Sequence.Random(8192, 1024), + XValues: chart.Sequence.Random(128, 1024), + YValues: chart.Sequence.Random(128, 1024), }, }, } - res.Header().Set("Content-Type", chart.ContentTypeSVG) - err := graph.Render(chart.SVG, res) + res.Header().Set("Content-Type", chart.ContentTypePNG) + err := graph.Render(chart.PNG, res) if err != nil { log.Println(err.Error()) } @@ -49,8 +50,8 @@ func unit(res http.ResponseWriter, req *http.Request) { }, } - res.Header().Set("Content-Type", chart.ContentTypeSVG) - err := graph.Render(chart.SVG, res) + res.Header().Set("Content-Type", chart.ContentTypePNG) + err := graph.Render(chart.PNG, res) if err != nil { log.Println(err.Error()) } diff --git a/bar_chart.go b/bar_chart.go index d63e025..3fe5992 100644 --- a/bar_chart.go +++ b/bar_chart.go @@ -14,6 +14,8 @@ type BarChart struct { Title string TitleStyle Style + ColorPalette ColorPalette + Width int Height int DPI float64 @@ -407,23 +409,23 @@ func (bc BarChart) getBackgroundStyle() Style { func (bc BarChart) styleDefaultsBackground() Style { return Style{ - FillColor: DefaultBackgroundColor, - StrokeColor: DefaultBackgroundStrokeColor, + FillColor: bc.GetColorPalette().BackgroundColor(), + StrokeColor: bc.GetColorPalette().BackgroundStrokeColor(), StrokeWidth: DefaultStrokeWidth, } } func (bc BarChart) styleDefaultsBar(index int) Style { return Style{ - StrokeColor: GetAlternateColor(index), + StrokeColor: bc.GetColorPalette().GetSeriesColor(index), StrokeWidth: 3.0, - FillColor: GetAlternateColor(index), + FillColor: bc.GetColorPalette().GetSeriesColor(index), } } func (bc BarChart) styleDefaultsTitle() Style { return bc.TitleStyle.InheritFrom(Style{ - FontColor: DefaultTextColor, + FontColor: bc.GetColorPalette().TextColor(), Font: bc.GetFont(), FontSize: bc.getTitleFontSize(), TextHorizontalAlign: TextHorizontalAlignCenter, @@ -448,10 +450,10 @@ func (bc BarChart) getTitleFontSize() float64 { func (bc BarChart) styleDefaultsAxes() Style { return Style{ - StrokeColor: DefaultAxisColor, + StrokeColor: bc.GetColorPalette().AxisStrokeColor(), Font: bc.GetFont(), FontSize: DefaultAxisFontSize, - FontColor: DefaultAxisColor, + FontColor: bc.GetColorPalette().TextColor(), TextHorizontalAlign: TextHorizontalAlignCenter, TextVerticalAlign: TextVerticalAlignTop, TextWrap: TextWrapWord, @@ -463,3 +465,11 @@ func (bc BarChart) styleDefaultsElements() Style { Font: bc.GetFont(), } } + +// GetColorPalette returns the color palette for the chart. +func (bc BarChart) GetColorPalette() ColorPalette { + if bc.ColorPalette != nil { + return bc.ColorPalette + } + return AlternateColorPalette +} diff --git a/chart.go b/chart.go index 7bc8c0f..f4f0098 100644 --- a/chart.go +++ b/chart.go @@ -14,6 +14,8 @@ type Chart struct { Title string TitleStyle Style + ColorPalette ColorPalette + Width int Height int DPI float64 @@ -490,7 +492,7 @@ func (c Chart) drawSeries(r Renderer, canvasBox Box, xrange, yrange, yrangeAlt R func (c Chart) drawTitle(r Renderer) { if len(c.Title) > 0 && c.TitleStyle.Show { r.SetFont(c.TitleStyle.GetFont(c.GetFont())) - r.SetFontColor(c.TitleStyle.GetFontColor(DefaultTextColor)) + r.SetFontColor(c.TitleStyle.GetFontColor(c.GetColorPalette().TextColor())) titleFontSize := c.TitleStyle.GetFontSize(DefaultTitleFontSize) r.SetFontSize(titleFontSize) @@ -508,25 +510,24 @@ func (c Chart) drawTitle(r Renderer) { func (c Chart) styleDefaultsBackground() Style { return Style{ - FillColor: DefaultBackgroundColor, - StrokeColor: DefaultBackgroundStrokeColor, + FillColor: c.GetColorPalette().BackgroundColor(), + StrokeColor: c.GetColorPalette().BackgroundStrokeColor(), StrokeWidth: DefaultBackgroundStrokeWidth, } } func (c Chart) styleDefaultsCanvas() Style { return Style{ - FillColor: DefaultCanvasColor, - StrokeColor: DefaultCanvasStrokeColor, + FillColor: c.GetColorPalette().CanvasColor(), + StrokeColor: c.GetColorPalette().CanvasStrokeColor(), StrokeWidth: DefaultCanvasStrokeWidth, } } func (c Chart) styleDefaultsSeries(seriesIndex int) Style { - strokeColor := GetDefaultColor(seriesIndex) return Style{ - DotColor: strokeColor, - StrokeColor: strokeColor, + DotColor: c.GetColorPalette().GetSeriesColor(seriesIndex), + StrokeColor: c.GetColorPalette().GetSeriesColor(seriesIndex), StrokeWidth: DefaultSeriesLineWidth, Font: c.GetFont(), FontSize: DefaultFontSize, @@ -536,9 +537,9 @@ func (c Chart) styleDefaultsSeries(seriesIndex int) Style { func (c Chart) styleDefaultsAxes() Style { return Style{ Font: c.GetFont(), - FontColor: DefaultAxisColor, + FontColor: c.GetColorPalette().TextColor(), FontSize: DefaultAxisFontSize, - StrokeColor: DefaultAxisColor, + StrokeColor: c.GetColorPalette().AxisStrokeColor(), StrokeWidth: DefaultAxisLineWidth, } } @@ -549,6 +550,14 @@ func (c Chart) styleDefaultsElements() Style { } } +// GetColorPalette returns the color palette for the chart. +func (c Chart) GetColorPalette() ColorPalette { + if c.ColorPalette != nil { + return c.ColorPalette + } + return DefaultColorPalette +} + // Box returns the chart bounds as a box. func (c Chart) Box() Box { dpr := c.Background.Padding.GetRight(DefaultBackgroundPadding.Right) diff --git a/colors.go b/colors.go new file mode 100644 index 0000000..87dd4f0 --- /dev/null +++ b/colors.go @@ -0,0 +1,184 @@ +package chart + +import "github.com/wcharczuk/go-chart/drawing" + +var ( + // ColorWhite is white. + ColorWhite = drawing.Color{R: 255, G: 255, B: 255, A: 255} + // ColorBlue is the basic theme blue color. + ColorBlue = drawing.Color{R: 0, G: 116, B: 217, A: 255} + // ColorCyan is the basic theme cyan color. + ColorCyan = drawing.Color{R: 0, G: 217, B: 210, A: 255} + // ColorGreen is the basic theme green color. + ColorGreen = drawing.Color{R: 0, G: 217, B: 101, A: 255} + // ColorRed is the basic theme red color. + ColorRed = drawing.Color{R: 217, G: 0, B: 116, A: 255} + // ColorOrange is the basic theme orange color. + ColorOrange = drawing.Color{R: 217, G: 101, B: 0, A: 255} + // ColorYellow is the basic theme yellow color. + ColorYellow = drawing.Color{R: 217, G: 210, B: 0, A: 255} + // ColorBlack is the basic theme black color. + ColorBlack = drawing.Color{R: 51, G: 51, B: 51, A: 255} + // ColorLightGray is the basic theme light gray color. + ColorLightGray = drawing.Color{R: 239, G: 239, B: 239, A: 255} + + // ColorAlternateBlue is a alternate theme color. + ColorAlternateBlue = drawing.Color{R: 106, G: 195, B: 203, A: 255} + // ColorAlternateGreen is a alternate theme color. + ColorAlternateGreen = drawing.Color{R: 42, G: 190, B: 137, A: 255} + // ColorAlternateGray is a alternate theme color. + ColorAlternateGray = drawing.Color{R: 110, G: 128, B: 139, A: 255} + // ColorAlternateYellow is a alternate theme color. + ColorAlternateYellow = drawing.Color{R: 240, G: 174, B: 90, A: 255} + // ColorAlternateLightGray is a alternate theme color. + ColorAlternateLightGray = drawing.Color{R: 187, G: 190, B: 191, A: 255} + + // ColorTransparent is a transparent (alpha zero) color. + ColorTransparent = drawing.Color{R: 1, G: 1, B: 1, A: 0} +) + +var ( + // DefaultBackgroundColor is the default chart background color. + // It is equivalent to css color:white. + DefaultBackgroundColor = ColorWhite + // DefaultBackgroundStrokeColor is the default chart border color. + // It is equivalent to color:white. + DefaultBackgroundStrokeColor = ColorWhite + // DefaultCanvasColor is the default chart canvas color. + // It is equivalent to css color:white. + DefaultCanvasColor = ColorWhite + // DefaultCanvasStrokeColor is the default chart canvas stroke color. + // It is equivalent to css color:white. + DefaultCanvasStrokeColor = ColorWhite + // DefaultTextColor is the default chart text color. + // It is equivalent to #333333. + DefaultTextColor = ColorBlack + // DefaultAxisColor is the default chart axis line color. + // It is equivalent to #333333. + DefaultAxisColor = ColorBlack + // DefaultStrokeColor is the default chart border color. + // It is equivalent to #efefef. + DefaultStrokeColor = ColorLightGray + // DefaultFillColor is the default fill color. + // It is equivalent to #0074d9. + DefaultFillColor = ColorBlue + // DefaultAnnotationFillColor is the default annotation background color. + DefaultAnnotationFillColor = ColorWhite + // DefaultGridLineColor is the default grid line color. + DefaultGridLineColor = ColorLightGray +) + +var ( + // DefaultColors are a couple default series colors. + DefaultColors = []drawing.Color{ + ColorBlue, + ColorGreen, + ColorRed, + ColorCyan, + ColorOrange, + } + + // DefaultAlternateColors are a couple alternate colors. + DefaultAlternateColors = []drawing.Color{ + ColorAlternateBlue, + ColorAlternateGreen, + ColorAlternateGray, + ColorAlternateYellow, + ColorBlue, + ColorGreen, + ColorRed, + ColorCyan, + ColorOrange, + } +) + +// GetDefaultColor returns a color from the default list by index. +// NOTE: the index will wrap around (using a modulo). +func GetDefaultColor(index int) drawing.Color { + finalIndex := index % len(DefaultColors) + return DefaultColors[finalIndex] +} + +// GetAlternateColor returns a color from the default list by index. +// NOTE: the index will wrap around (using a modulo). +func GetAlternateColor(index int) drawing.Color { + finalIndex := index % len(DefaultAlternateColors) + return DefaultAlternateColors[finalIndex] +} + +// ColorPalette is a set of colors that. +type ColorPalette interface { + BackgroundColor() drawing.Color + BackgroundStrokeColor() drawing.Color + CanvasColor() drawing.Color + CanvasStrokeColor() drawing.Color + AxisStrokeColor() drawing.Color + TextColor() drawing.Color + GetSeriesColor(index int) drawing.Color +} + +// DefaultColorPalette represents the default palatte. +var DefaultColorPalette defaultColorPalette + +type defaultColorPalette struct{} + +func (dp defaultColorPalette) BackgroundColor() drawing.Color { + return DefaultBackgroundColor +} + +func (dp defaultColorPalette) BackgroundStrokeColor() drawing.Color { + return DefaultBackgroundStrokeColor +} + +func (dp defaultColorPalette) CanvasColor() drawing.Color { + return DefaultCanvasColor +} + +func (dp defaultColorPalette) CanvasStrokeColor() drawing.Color { + return DefaultCanvasStrokeColor +} + +func (dp defaultColorPalette) AxisStrokeColor() drawing.Color { + return DefaultAxisColor +} + +func (dp defaultColorPalette) TextColor() drawing.Color { + return DefaultTextColor +} + +func (dp defaultColorPalette) GetSeriesColor(index int) drawing.Color { + return GetDefaultColor(index) +} + +// AlternateColorPalette represents the default palatte. +var AlternateColorPalette alternateColorPalette + +type alternateColorPalette struct{} + +func (ap alternateColorPalette) BackgroundColor() drawing.Color { + return DefaultBackgroundColor +} + +func (ap alternateColorPalette) BackgroundStrokeColor() drawing.Color { + return DefaultBackgroundStrokeColor +} + +func (ap alternateColorPalette) CanvasColor() drawing.Color { + return DefaultCanvasColor +} + +func (ap alternateColorPalette) CanvasStrokeColor() drawing.Color { + return DefaultCanvasStrokeColor +} + +func (ap alternateColorPalette) AxisStrokeColor() drawing.Color { + return DefaultAxisColor +} + +func (ap alternateColorPalette) TextColor() drawing.Color { + return DefaultTextColor +} + +func (ap alternateColorPalette) GetSeriesColor(index int) drawing.Color { + return GetAlternateColor(index) +} diff --git a/defaults.go b/defaults.go index 17e95fa..d74330f 100644 --- a/defaults.go +++ b/defaults.go @@ -1,12 +1,5 @@ package chart -import ( - "sync" - - "github.com/golang/freetype/truetype" - "github.com/wcharczuk/go-chart/drawing" -) - const ( // DefaultChartHeight is the default chart height. DefaultChartHeight = 400 @@ -82,96 +75,6 @@ const ( DefaultBarWidth = 50 ) -var ( - // ColorWhite is white. - ColorWhite = drawing.Color{R: 255, G: 255, B: 255, A: 255} - // ColorBlue is the basic theme blue color. - ColorBlue = drawing.Color{R: 0, G: 116, B: 217, A: 255} - // ColorCyan is the basic theme cyan color. - ColorCyan = drawing.Color{R: 0, G: 217, B: 210, A: 255} - // ColorGreen is the basic theme green color. - ColorGreen = drawing.Color{R: 0, G: 217, B: 101, A: 255} - // ColorRed is the basic theme red color. - ColorRed = drawing.Color{R: 217, G: 0, B: 116, A: 255} - // ColorOrange is the basic theme orange color. - ColorOrange = drawing.Color{R: 217, G: 101, B: 0, A: 255} - // ColorYellow is the basic theme yellow color. - ColorYellow = drawing.Color{R: 217, G: 210, B: 0, A: 255} - // ColorBlack is the basic theme black color. - ColorBlack = drawing.Color{R: 51, G: 51, B: 51, A: 255} - // ColorLightGray is the basic theme light gray color. - ColorLightGray = drawing.Color{R: 239, G: 239, B: 239, A: 255} - - // ColorAlternateBlue is a alternate theme color. - ColorAlternateBlue = drawing.Color{R: 106, G: 195, B: 203, A: 255} - // ColorAlternateGreen is a alternate theme color. - ColorAlternateGreen = drawing.Color{R: 42, G: 190, B: 137, A: 255} - // ColorAlternateGray is a alternate theme color. - ColorAlternateGray = drawing.Color{R: 110, G: 128, B: 139, A: 255} - // ColorAlternateYellow is a alternate theme color. - ColorAlternateYellow = drawing.Color{R: 240, G: 174, B: 90, A: 255} - // ColorAlternateLightGray is a alternate theme color. - ColorAlternateLightGray = drawing.Color{R: 187, G: 190, B: 191, A: 255} - - // ColorTransparent is a transparent (alpha zero) color. - ColorTransparent = drawing.Color{R: 1, G: 1, B: 1, A: 0} -) - -var ( - // DefaultBackgroundColor is the default chart background color. - // It is equivalent to css color:white. - DefaultBackgroundColor = ColorWhite - // DefaultBackgroundStrokeColor is the default chart border color. - // It is equivalent to color:white. - DefaultBackgroundStrokeColor = ColorWhite - // DefaultCanvasColor is the default chart canvas color. - // It is equivalent to css color:white. - DefaultCanvasColor = ColorWhite - // DefaultCanvasStrokeColor is the default chart canvas stroke color. - // It is equivalent to css color:white. - DefaultCanvasStrokeColor = ColorWhite - // DefaultTextColor is the default chart text color. - // It is equivalent to #333333. - DefaultTextColor = ColorBlack - // DefaultAxisColor is the default chart axis line color. - // It is equivalent to #333333. - DefaultAxisColor = ColorBlack - // DefaultStrokeColor is the default chart border color. - // It is equivalent to #efefef. - DefaultStrokeColor = ColorLightGray - // DefaultFillColor is the default fill color. - // It is equivalent to #0074d9. - DefaultFillColor = ColorBlue - // DefaultAnnotationFillColor is the default annotation background color. - DefaultAnnotationFillColor = ColorWhite - // DefaultGridLineColor is the default grid line color. - DefaultGridLineColor = ColorLightGray -) - -var ( - // DefaultColors are a couple default series colors. - DefaultColors = []drawing.Color{ - ColorBlue, - ColorGreen, - ColorRed, - ColorCyan, - ColorOrange, - } - - // DefaultAlternateColors are a couple alternate colors. - DefaultAlternateColors = []drawing.Color{ - ColorAlternateBlue, - ColorAlternateGreen, - ColorAlternateGray, - ColorAlternateYellow, - ColorBlue, - ColorGreen, - ColorRed, - ColorCyan, - ColorOrange, - } -) - var ( // DashArrayDots is a dash array that represents '....' style stroke dashes. DashArrayDots = []int{1, 1} @@ -183,20 +86,6 @@ var ( DashArrayDashesLarge = []int{10, 10} ) -// GetDefaultColor returns a color from the default list by index. -// NOTE: the index will wrap around (using a modulo). -func GetDefaultColor(index int) drawing.Color { - finalIndex := index % len(DefaultColors) - return DefaultColors[finalIndex] -} - -// GetAlternateColor returns a color from the default list by index. -// NOTE: the index will wrap around (using a modulo). -func GetAlternateColor(index int) drawing.Color { - finalIndex := index % len(DefaultAlternateColors) - return DefaultAlternateColors[finalIndex] -} - var ( // DefaultAnnotationPadding is the padding around an annotation. DefaultAnnotationPadding = Box{Top: 5, Left: 5, Right: 5, Bottom: 5} @@ -205,27 +94,6 @@ var ( DefaultBackgroundPadding = Box{Top: 5, Left: 5, Right: 5, Bottom: 5} ) -var ( - _defaultFontLock sync.Mutex - _defaultFont *truetype.Font -) - -// GetDefaultFont returns the default font (Roboto-Medium). -func GetDefaultFont() (*truetype.Font, error) { - if _defaultFont == nil { - _defaultFontLock.Lock() - defer _defaultFontLock.Unlock() - if _defaultFont == nil { - font, err := truetype.Parse(roboto) - if err != nil { - return nil, err - } - _defaultFont = font - } - } - return _defaultFont, nil -} - const ( // ContentTypePNG is the png mime type. ContentTypePNG = "image/png" diff --git a/draw.go b/draw.go index 6b8e3f7..6bfa90b 100644 --- a/draw.go +++ b/draw.go @@ -56,15 +56,26 @@ func (d draw) LineSeries(r Renderer, canvasBox Box, xrange, yrange Range, style } if style.ShouldDrawDot() { - dotWidth := style.GetDotWidth() + defaultDotWidth := style.GetDotWidth() style.GetDotOptions().WriteDrawingOptionsToRenderer(r) - for i := 0; i < vs.Len(); i++ { vx, vy = vs.GetValue(i) x = cl + xrange.Translate(vx) y = cb - yrange.Translate(vy) + dotWidth := defaultDotWidth + if style.DotWidthProvider != nil { + dotWidth = style.DotWidthProvider(xrange.GetDelta(), yrange.GetDelta(), vx, vy) + } + + if style.DotColorProvider != nil { + dotColor := style.DotColorProvider(xrange.GetDelta(), yrange.GetDelta(), vx, vy) + + r.SetFillColor(dotColor) + r.SetStrokeColor(dotColor) + } + r.Circle(dotWidth, x, y) r.FillStroke() } diff --git a/font.go b/font.go new file mode 100644 index 0000000..749c605 --- /dev/null +++ b/font.go @@ -0,0 +1,28 @@ +package chart + +import ( + "sync" + + "github.com/golang/freetype/truetype" +) + +var ( + _defaultFontLock sync.Mutex + _defaultFont *truetype.Font +) + +// GetDefaultFont returns the default font (Roboto-Medium). +func GetDefaultFont() (*truetype.Font, error) { + if _defaultFont == nil { + _defaultFontLock.Lock() + defer _defaultFontLock.Unlock() + if _defaultFont == nil { + font, err := truetype.Parse(roboto) + if err != nil { + return nil, err + } + _defaultFont = font + } + } + return _defaultFont, nil +} diff --git a/pie_chart.go b/pie_chart.go index c2d485c..815e6de 100644 --- a/pie_chart.go +++ b/pie_chart.go @@ -13,6 +13,8 @@ type PieChart struct { Title string TitleStyle Style + ColorPalette ColorPalette + Width int Height int DPI float64 @@ -195,17 +197,17 @@ func (pc PieChart) getCanvasStyle() Style { func (pc PieChart) styleDefaultsCanvas() Style { return Style{ - FillColor: DefaultCanvasColor, - StrokeColor: DefaultCanvasStrokeColor, + FillColor: pc.GetColorPalette().CanvasColor(), + StrokeColor: pc.GetColorPalette().CanvasStrokeColor(), StrokeWidth: DefaultStrokeWidth, } } func (pc PieChart) styleDefaultsPieChartValue() Style { return Style{ - StrokeColor: ColorWhite, + StrokeColor: pc.GetColorPalette().TextColor(), StrokeWidth: 5.0, - FillColor: ColorWhite, + FillColor: pc.GetColorPalette().TextColor(), } } @@ -213,9 +215,9 @@ func (pc PieChart) stylePieChartValue(index int) Style { return pc.SliceStyle.InheritFrom(Style{ StrokeColor: ColorWhite, StrokeWidth: 5.0, - FillColor: GetAlternateColor(index), + FillColor: pc.GetColorPalette().GetSeriesColor(index), FontSize: pc.getScaledFontSize(), - FontColor: ColorWhite, + FontColor: pc.GetColorPalette().TextColor(), Font: pc.GetFont(), }) } @@ -236,8 +238,8 @@ func (pc PieChart) getScaledFontSize() float64 { func (pc PieChart) styleDefaultsBackground() Style { return Style{ - FillColor: DefaultBackgroundColor, - StrokeColor: DefaultBackgroundStrokeColor, + FillColor: pc.GetColorPalette().BackgroundColor(), + StrokeColor: pc.GetColorPalette().BackgroundStrokeColor(), StrokeWidth: DefaultStrokeWidth, } } @@ -250,7 +252,7 @@ func (pc PieChart) styleDefaultsElements() Style { func (pc PieChart) styleDefaultsTitle() Style { return pc.TitleStyle.InheritFrom(Style{ - FontColor: ColorWhite, + FontColor: pc.GetColorPalette().TextColor(), Font: pc.GetFont(), FontSize: pc.getTitleFontSize(), TextHorizontalAlign: TextHorizontalAlignCenter, @@ -273,6 +275,14 @@ func (pc PieChart) getTitleFontSize() float64 { return 10 } +// GetColorPalette returns the color palette for the chart. +func (pc PieChart) GetColorPalette() ColorPalette { + if pc.ColorPalette != nil { + return pc.ColorPalette + } + return AlternateColorPalette +} + // Box returns the chart bounds as a box. func (pc PieChart) Box() Box { dpr := pc.Background.Padding.GetRight(DefaultBackgroundPadding.Right) diff --git a/style.go b/style.go index d49aef8..c51e1d2 100644 --- a/style.go +++ b/style.go @@ -45,6 +45,9 @@ type Style struct { DotColor drawing.Color DotWidth float64 + DotWidthProvider SizeProvider + DotColorProvider ColorProvider + FillColor drawing.Color FontSize float64 @@ -355,6 +358,9 @@ func (s Style) InheritFrom(defaults Style) (final Style) { final.DotColor = s.GetDotColor(defaults.DotColor) final.DotWidth = s.GetDotWidth(defaults.DotWidth) + final.DotWidthProvider = s.DotWidthProvider + final.DotColorProvider = s.DotColorProvider + final.FillColor = s.GetFillColor(defaults.FillColor) final.FontColor = s.GetFontColor(defaults.FontColor) final.FontSize = s.GetFontSize(defaults.FontSize) @@ -426,7 +432,7 @@ func (s Style) ShouldDrawStroke() bool { // ShouldDrawDot tells drawing functions if they should draw the dot. func (s Style) ShouldDrawDot() bool { - return !s.DotColor.IsZero() && s.DotWidth > 0 + return (!s.DotColor.IsZero() && s.DotWidth > 0) || s.DotColorProvider != nil || s.DotWidthProvider != nil } // ShouldDrawFill tells drawing functions if they should draw the stroke. diff --git a/value_provider.go b/value_provider.go index 90aec9d..143d63b 100644 --- a/value_provider.go +++ b/value_provider.go @@ -1,5 +1,7 @@ package chart +import "github.com/wcharczuk/go-chart/drawing" + // ValueProvider is a type that produces values. type ValueProvider interface { Len() int @@ -33,3 +35,9 @@ type FullBoundedValueProvider interface { BoundedValueProvider BoundedLastValueProvider } + +// SizeProvider is a provider for integer size. +type SizeProvider func(rx, ry, x, y float64) float64 + +// ColorProvider is a provider for dot size. +type ColorProvider func(rx, ry, x, y float64) drawing.Color diff --git a/vidris.go b/vidris.go new file mode 100644 index 0000000..8bca6f7 --- /dev/null +++ b/vidris.go @@ -0,0 +1,272 @@ +package chart + +import "github.com/wcharczuk/go-chart/drawing" + +func colorFromValues(r, g, b float64) drawing.Color { + return drawing.Color{R: uint8(r * 256), G: uint8(g * 256), B: uint8(b * 256), A: 255} +} + +var vidrisColors = [256]drawing.Color{ + colorFromValues(0.26700401, 0.00487433, 0.32941519), + colorFromValues(0.26851048, 0.00960483, 0.33542652), + colorFromValues(0.26994384, 0.01462494, 0.34137895), + colorFromValues(0.27130489, 0.01994186, 0.34726862), + colorFromValues(0.27259384, 0.02556309, 0.35309303), + colorFromValues(0.27380934, 0.03149748, 0.35885256), + colorFromValues(0.27495242, 0.03775181, 0.36454323), + colorFromValues(0.27602238, 0.04416723, 0.37016418), + colorFromValues(0.2770184, 0.05034437, 0.37571452), + colorFromValues(0.27794143, 0.05632444, 0.38119074), + colorFromValues(0.27879067, 0.06214536, 0.38659204), + colorFromValues(0.2795655, 0.06783587, 0.39191723), + colorFromValues(0.28026658, 0.07341724, 0.39716349), + colorFromValues(0.28089358, 0.07890703, 0.40232944), + colorFromValues(0.28144581, 0.0843197, 0.40741404), + colorFromValues(0.28192358, 0.08966622, 0.41241521), + colorFromValues(0.28232739, 0.09495545, 0.41733086), + colorFromValues(0.28265633, 0.10019576, 0.42216032), + colorFromValues(0.28291049, 0.10539345, 0.42690202), + colorFromValues(0.28309095, 0.11055307, 0.43155375), + colorFromValues(0.28319704, 0.11567966, 0.43611482), + colorFromValues(0.28322882, 0.12077701, 0.44058404), + colorFromValues(0.28318684, 0.12584799, 0.44496), + colorFromValues(0.283072, 0.13089477, 0.44924127), + colorFromValues(0.28288389, 0.13592005, 0.45342734), + colorFromValues(0.28262297, 0.14092556, 0.45751726), + colorFromValues(0.28229037, 0.14591233, 0.46150995), + colorFromValues(0.28188676, 0.15088147, 0.46540474), + colorFromValues(0.28141228, 0.15583425, 0.46920128), + colorFromValues(0.28086773, 0.16077132, 0.47289909), + colorFromValues(0.28025468, 0.16569272, 0.47649762), + colorFromValues(0.27957399, 0.17059884, 0.47999675), + colorFromValues(0.27882618, 0.1754902, 0.48339654), + colorFromValues(0.27801236, 0.18036684, 0.48669702), + colorFromValues(0.27713437, 0.18522836, 0.48989831), + colorFromValues(0.27619376, 0.19007447, 0.49300074), + colorFromValues(0.27519116, 0.1949054, 0.49600488), + colorFromValues(0.27412802, 0.19972086, 0.49891131), + colorFromValues(0.27300596, 0.20452049, 0.50172076), + colorFromValues(0.27182812, 0.20930306, 0.50443413), + colorFromValues(0.27059473, 0.21406899, 0.50705243), + colorFromValues(0.26930756, 0.21881782, 0.50957678), + colorFromValues(0.26796846, 0.22354911, 0.5120084), + colorFromValues(0.26657984, 0.2282621, 0.5143487), + colorFromValues(0.2651445, 0.23295593, 0.5165993), + colorFromValues(0.2636632, 0.23763078, 0.51876163), + colorFromValues(0.26213801, 0.24228619, 0.52083736), + colorFromValues(0.26057103, 0.2469217, 0.52282822), + colorFromValues(0.25896451, 0.25153685, 0.52473609), + colorFromValues(0.25732244, 0.2561304, 0.52656332), + colorFromValues(0.25564519, 0.26070284, 0.52831152), + colorFromValues(0.25393498, 0.26525384, 0.52998273), + colorFromValues(0.25219404, 0.26978306, 0.53157905), + colorFromValues(0.25042462, 0.27429024, 0.53310261), + colorFromValues(0.24862899, 0.27877509, 0.53455561), + colorFromValues(0.2468114, 0.28323662, 0.53594093), + colorFromValues(0.24497208, 0.28767547, 0.53726018), + colorFromValues(0.24311324, 0.29209154, 0.53851561), + colorFromValues(0.24123708, 0.29648471, 0.53970946), + colorFromValues(0.23934575, 0.30085494, 0.54084398), + colorFromValues(0.23744138, 0.30520222, 0.5419214), + colorFromValues(0.23552606, 0.30952657, 0.54294396), + colorFromValues(0.23360277, 0.31382773, 0.54391424), + colorFromValues(0.2316735, 0.3181058, 0.54483444), + colorFromValues(0.22973926, 0.32236127, 0.54570633), + colorFromValues(0.22780192, 0.32659432, 0.546532), + colorFromValues(0.2258633, 0.33080515, 0.54731353), + colorFromValues(0.22392515, 0.334994, 0.54805291), + colorFromValues(0.22198915, 0.33916114, 0.54875211), + colorFromValues(0.22005691, 0.34330688, 0.54941304), + colorFromValues(0.21812995, 0.34743154, 0.55003755), + colorFromValues(0.21620971, 0.35153548, 0.55062743), + colorFromValues(0.21429757, 0.35561907, 0.5511844), + colorFromValues(0.21239477, 0.35968273, 0.55171011), + colorFromValues(0.2105031, 0.36372671, 0.55220646), + colorFromValues(0.20862342, 0.36775151, 0.55267486), + colorFromValues(0.20675628, 0.37175775, 0.55311653), + colorFromValues(0.20490257, 0.37574589, 0.55353282), + colorFromValues(0.20306309, 0.37971644, 0.55392505), + colorFromValues(0.20123854, 0.38366989, 0.55429441), + colorFromValues(0.1994295, 0.38760678, 0.55464205), + colorFromValues(0.1976365, 0.39152762, 0.55496905), + colorFromValues(0.19585993, 0.39543297, 0.55527637), + colorFromValues(0.19410009, 0.39932336, 0.55556494), + colorFromValues(0.19235719, 0.40319934, 0.55583559), + colorFromValues(0.19063135, 0.40706148, 0.55608907), + colorFromValues(0.18892259, 0.41091033, 0.55632606), + colorFromValues(0.18723083, 0.41474645, 0.55654717), + colorFromValues(0.18555593, 0.4185704, 0.55675292), + colorFromValues(0.18389763, 0.42238275, 0.55694377), + colorFromValues(0.18225561, 0.42618405, 0.5571201), + colorFromValues(0.18062949, 0.42997486, 0.55728221), + colorFromValues(0.17901879, 0.43375572, 0.55743035), + colorFromValues(0.17742298, 0.4375272, 0.55756466), + colorFromValues(0.17584148, 0.44128981, 0.55768526), + colorFromValues(0.17427363, 0.4450441, 0.55779216), + colorFromValues(0.17271876, 0.4487906, 0.55788532), + colorFromValues(0.17117615, 0.4525298, 0.55796464), + colorFromValues(0.16964573, 0.45626209, 0.55803034), + colorFromValues(0.16812641, 0.45998802, 0.55808199), + colorFromValues(0.1666171, 0.46370813, 0.55811913), + colorFromValues(0.16511703, 0.4674229, 0.55814141), + colorFromValues(0.16362543, 0.47113278, 0.55814842), + colorFromValues(0.16214155, 0.47483821, 0.55813967), + colorFromValues(0.16066467, 0.47853961, 0.55811466), + colorFromValues(0.15919413, 0.4822374, 0.5580728), + colorFromValues(0.15772933, 0.48593197, 0.55801347), + colorFromValues(0.15626973, 0.4896237, 0.557936), + colorFromValues(0.15481488, 0.49331293, 0.55783967), + colorFromValues(0.15336445, 0.49700003, 0.55772371), + colorFromValues(0.1519182, 0.50068529, 0.55758733), + colorFromValues(0.15047605, 0.50436904, 0.55742968), + colorFromValues(0.14903918, 0.50805136, 0.5572505), + colorFromValues(0.14760731, 0.51173263, 0.55704861), + colorFromValues(0.14618026, 0.51541316, 0.55682271), + colorFromValues(0.14475863, 0.51909319, 0.55657181), + colorFromValues(0.14334327, 0.52277292, 0.55629491), + colorFromValues(0.14193527, 0.52645254, 0.55599097), + colorFromValues(0.14053599, 0.53013219, 0.55565893), + colorFromValues(0.13914708, 0.53381201, 0.55529773), + colorFromValues(0.13777048, 0.53749213, 0.55490625), + colorFromValues(0.1364085, 0.54117264, 0.55448339), + colorFromValues(0.13506561, 0.54485335, 0.55402906), + colorFromValues(0.13374299, 0.54853458, 0.55354108), + colorFromValues(0.13244401, 0.55221637, 0.55301828), + colorFromValues(0.13117249, 0.55589872, 0.55245948), + colorFromValues(0.1299327, 0.55958162, 0.55186354), + colorFromValues(0.12872938, 0.56326503, 0.55122927), + colorFromValues(0.12756771, 0.56694891, 0.55055551), + colorFromValues(0.12645338, 0.57063316, 0.5498411), + colorFromValues(0.12539383, 0.57431754, 0.54908564), + colorFromValues(0.12439474, 0.57800205, 0.5482874), + colorFromValues(0.12346281, 0.58168661, 0.54744498), + colorFromValues(0.12260562, 0.58537105, 0.54655722), + colorFromValues(0.12183122, 0.58905521, 0.54562298), + colorFromValues(0.12114807, 0.59273889, 0.54464114), + colorFromValues(0.12056501, 0.59642187, 0.54361058), + colorFromValues(0.12009154, 0.60010387, 0.54253043), + colorFromValues(0.11973756, 0.60378459, 0.54139999), + colorFromValues(0.11951163, 0.60746388, 0.54021751), + colorFromValues(0.11942341, 0.61114146, 0.53898192), + colorFromValues(0.11948255, 0.61481702, 0.53769219), + colorFromValues(0.11969858, 0.61849025, 0.53634733), + colorFromValues(0.12008079, 0.62216081, 0.53494633), + colorFromValues(0.12063824, 0.62582833, 0.53348834), + colorFromValues(0.12137972, 0.62949242, 0.53197275), + colorFromValues(0.12231244, 0.63315277, 0.53039808), + colorFromValues(0.12344358, 0.63680899, 0.52876343), + colorFromValues(0.12477953, 0.64046069, 0.52706792), + colorFromValues(0.12632581, 0.64410744, 0.52531069), + colorFromValues(0.12808703, 0.64774881, 0.52349092), + colorFromValues(0.13006688, 0.65138436, 0.52160791), + colorFromValues(0.13226797, 0.65501363, 0.51966086), + colorFromValues(0.13469183, 0.65863619, 0.5176488), + colorFromValues(0.13733921, 0.66225157, 0.51557101), + colorFromValues(0.14020991, 0.66585927, 0.5134268), + colorFromValues(0.14330291, 0.66945881, 0.51121549), + colorFromValues(0.1466164, 0.67304968, 0.50893644), + colorFromValues(0.15014782, 0.67663139, 0.5065889), + colorFromValues(0.15389405, 0.68020343, 0.50417217), + colorFromValues(0.15785146, 0.68376525, 0.50168574), + colorFromValues(0.16201598, 0.68731632, 0.49912906), + colorFromValues(0.1663832, 0.69085611, 0.49650163), + colorFromValues(0.1709484, 0.69438405, 0.49380294), + colorFromValues(0.17570671, 0.6978996, 0.49103252), + colorFromValues(0.18065314, 0.70140222, 0.48818938), + colorFromValues(0.18578266, 0.70489133, 0.48527326), + colorFromValues(0.19109018, 0.70836635, 0.48228395), + colorFromValues(0.19657063, 0.71182668, 0.47922108), + colorFromValues(0.20221902, 0.71527175, 0.47608431), + colorFromValues(0.20803045, 0.71870095, 0.4728733), + colorFromValues(0.21400015, 0.72211371, 0.46958774), + colorFromValues(0.22012381, 0.72550945, 0.46622638), + colorFromValues(0.2263969, 0.72888753, 0.46278934), + colorFromValues(0.23281498, 0.73224735, 0.45927675), + colorFromValues(0.2393739, 0.73558828, 0.45568838), + colorFromValues(0.24606968, 0.73890972, 0.45202405), + colorFromValues(0.25289851, 0.74221104, 0.44828355), + colorFromValues(0.25985676, 0.74549162, 0.44446673), + colorFromValues(0.26694127, 0.74875084, 0.44057284), + colorFromValues(0.27414922, 0.75198807, 0.4366009), + colorFromValues(0.28147681, 0.75520266, 0.43255207), + colorFromValues(0.28892102, 0.75839399, 0.42842626), + colorFromValues(0.29647899, 0.76156142, 0.42422341), + colorFromValues(0.30414796, 0.76470433, 0.41994346), + colorFromValues(0.31192534, 0.76782207, 0.41558638), + colorFromValues(0.3198086, 0.77091403, 0.41115215), + colorFromValues(0.3277958, 0.77397953, 0.40664011), + colorFromValues(0.33588539, 0.7770179, 0.40204917), + colorFromValues(0.34407411, 0.78002855, 0.39738103), + colorFromValues(0.35235985, 0.78301086, 0.39263579), + colorFromValues(0.36074053, 0.78596419, 0.38781353), + colorFromValues(0.3692142, 0.78888793, 0.38291438), + colorFromValues(0.37777892, 0.79178146, 0.3779385), + colorFromValues(0.38643282, 0.79464415, 0.37288606), + colorFromValues(0.39517408, 0.79747541, 0.36775726), + colorFromValues(0.40400101, 0.80027461, 0.36255223), + colorFromValues(0.4129135, 0.80304099, 0.35726893), + colorFromValues(0.42190813, 0.80577412, 0.35191009), + colorFromValues(0.43098317, 0.80847343, 0.34647607), + colorFromValues(0.44013691, 0.81113836, 0.3409673), + colorFromValues(0.44936763, 0.81376835, 0.33538426), + colorFromValues(0.45867362, 0.81636288, 0.32972749), + colorFromValues(0.46805314, 0.81892143, 0.32399761), + colorFromValues(0.47750446, 0.82144351, 0.31819529), + colorFromValues(0.4870258, 0.82392862, 0.31232133), + colorFromValues(0.49661536, 0.82637633, 0.30637661), + colorFromValues(0.5062713, 0.82878621, 0.30036211), + colorFromValues(0.51599182, 0.83115784, 0.29427888), + colorFromValues(0.52577622, 0.83349064, 0.2881265), + colorFromValues(0.5356211, 0.83578452, 0.28190832), + colorFromValues(0.5455244, 0.83803918, 0.27562602), + colorFromValues(0.55548397, 0.84025437, 0.26928147), + colorFromValues(0.5654976, 0.8424299, 0.26287683), + colorFromValues(0.57556297, 0.84456561, 0.25641457), + colorFromValues(0.58567772, 0.84666139, 0.24989748), + colorFromValues(0.59583934, 0.84871722, 0.24332878), + colorFromValues(0.60604528, 0.8507331, 0.23671214), + colorFromValues(0.61629283, 0.85270912, 0.23005179), + colorFromValues(0.62657923, 0.85464543, 0.22335258), + colorFromValues(0.63690157, 0.85654226, 0.21662012), + colorFromValues(0.64725685, 0.85839991, 0.20986086), + colorFromValues(0.65764197, 0.86021878, 0.20308229), + colorFromValues(0.66805369, 0.86199932, 0.19629307), + colorFromValues(0.67848868, 0.86374211, 0.18950326), + colorFromValues(0.68894351, 0.86544779, 0.18272455), + colorFromValues(0.69941463, 0.86711711, 0.17597055), + colorFromValues(0.70989842, 0.86875092, 0.16925712), + colorFromValues(0.72039115, 0.87035015, 0.16260273), + colorFromValues(0.73088902, 0.87191584, 0.15602894), + colorFromValues(0.74138803, 0.87344918, 0.14956101), + colorFromValues(0.75188414, 0.87495143, 0.14322828), + colorFromValues(0.76237342, 0.87642392, 0.13706449), + colorFromValues(0.77285183, 0.87786808, 0.13110864), + colorFromValues(0.78331535, 0.87928545, 0.12540538), + colorFromValues(0.79375994, 0.88067763, 0.12000532), + colorFromValues(0.80418159, 0.88204632, 0.11496505), + colorFromValues(0.81457634, 0.88339329, 0.11034678), + colorFromValues(0.82494028, 0.88472036, 0.10621724), + colorFromValues(0.83526959, 0.88602943, 0.1026459), + colorFromValues(0.84556056, 0.88732243, 0.09970219), + colorFromValues(0.8558096, 0.88860134, 0.09745186), + colorFromValues(0.86601325, 0.88986815, 0.09595277), + colorFromValues(0.87616824, 0.89112487, 0.09525046), + colorFromValues(0.88627146, 0.89237353, 0.09537439), + colorFromValues(0.89632002, 0.89361614, 0.09633538), + colorFromValues(0.90631121, 0.89485467, 0.09812496), + colorFromValues(0.91624212, 0.89609127, 0.1007168), + colorFromValues(0.92610579, 0.89732977, 0.10407067), + colorFromValues(0.93590444, 0.8985704, 0.10813094), + colorFromValues(0.94563626, 0.899815, 0.11283773), + colorFromValues(0.95529972, 0.90106534, 0.11812832), + colorFromValues(0.96489353, 0.90232311, 0.12394051), + colorFromValues(0.97441665, 0.90358991, 0.13021494), + colorFromValues(0.98386829, 0.90486726, 0.13689671), + colorFromValues(0.99324789, 0.90615657, 0.1439362), +} + +// Vidris creates a vidris color map provider. +func Vidris(rx, ry, x, y float64) drawing.Color { + index := uint8((y / ry) * 256) + return vidrisColors[index] +}