@@ -23,14 +23,15 @@ func (sp ScatterPlot) GetMaxTicks() int {
2323 return sp.maxTicks
2424}
2525
26- // Get width and height of the svg
26+ // Get width of the svg
2727func (sp ScatterPlot) GetWidth() int {
2828 if sp.Width == 0 {
2929 return DefaultWidth
3030 }
3131 return sp.Width
3232}
3333
34+ // Get height of the svg
3435func (sp ScatterPlot) GetHeight() int {
3536 if sp.Height == 0 {
3637 return DefaultHeight
@@ -76,47 +77,47 @@ func StepXY(sp ScatterPlot, maxX, maxY, minX, minY float64) (float64, float64, f
7677
7778// Draw axes and axes titles, return SVG strings
7879func RenderAxes(sp ScatterPlot, Width, Height int, maxX, maxY, minX, minY float64) string {
79- svgOut := ""
80+ svgOut := ""
8081
8182 // Axe Y
82- svgOut += ufmt.Sprintf(`<rect x="%d" y="%d" width="%d" height="%d" fill="black"/>`, 40, Height-40, Width-60, 1)
83- svgOut += ufmt.Sprintf(
84- `<text x="%d" y="%d" style="font-family:'Inter var',sans-serif;font-size:%dpx;text-anchor:middle;" transform="rotate(-90 %d %d)" fill="black">%s</text>`,
85- 10, Height/2, 12, 15, Height/2, sp.YAxis,
86- )
83+ svgOut += ufmt.Sprintf(`<rect x="%d" y="%d" width="%d" height="%d" fill="black"/>`, 40, Height-40, Width-60, 1)
84+ svgOut += ufmt.Sprintf(
85+ `<text x="%d" y="%d" style="font-family:'Inter var',sans-serif;font-size:%dpx;text-anchor:middle;" transform="rotate(-90 %d %d)" fill="black">%s</text>`,
86+ 10, Height/2, 12, 15, Height/2, sp.YAxis,
87+ )
8788
8889 // Axe X
89- svgOut += ufmt.Sprintf(`<rect x="%d" y="%d" width="%d" height="%d" fill="black"/>`, 40, 20, 1, Height-60)
90- svgOut += ufmt.Sprintf(
91- `<text x="%d" y="%d" style="font-family:'Inter var',sans-serif;font-size:%dpx;text-anchor:middle;" fill="black">%s</text>`,
92- Width/2, Height-10, 12, sp.XAxis,
93- )
90+ svgOut += ufmt.Sprintf(`<rect x="%d" y="%d" width="%d" height="%d" fill="black"/>`, 40, 20, 1, Height-60)
91+ svgOut += ufmt.Sprintf(
92+ `<text x="%d" y="%d" style="font-family:'Inter var',sans-serif;font-size:%dpx;text-anchor:middle;" fill="black">%s</text>`,
93+ Width/2, Height-10, 12, sp.XAxis,
94+ )
9495
9596 // Scale helpers
9697 scaleX := func(val float64) float64 {
97- return 40 + (val-minX)/(maxX-minX)*float64(Width-60)
98+ return 40 + (val-minX)/(maxX-minX)*float64(Width-60)
9899 }
99100 scaleY := func(val float64) float64 {
100- return float64(Height-40) - (val-minY)/(maxY-minY)*float64(Height-60)
101+ return float64(Height-40) - (val-minY)/(maxY-minY)*float64(Height-60)
101102 }
102103
103104 // N icesteps calcul for graduation
104105 stepX, startX, endX, stepY, startY, endY := StepXY(sp, maxX, maxY, minX, minY)
105106
106107 // Graduation X
107108 for val := startX; val <= endX; val += stepX {
108- nx := scaleX(val)
109- y := float64(Height - 40)
110- svgOut += ufmt.Sprintf(`<rect x="%d" y="%d" width="%d" height="%d" fill="black"/>`, int(nx), int(y), 1, 5)
111- svgOut += ufmt.Sprintf(`<text x="%d" y="%d" style="font-size:%dpx;text-anchor:middle;" fill="black">%.1f</text>`, int(nx), int(y)+18, 11, val)
109+ nx := scaleX(val)
110+ y := float64(Height - 40)
111+ svgOut += ufmt.Sprintf(`<rect x="%d" y="%d" width="%d" height="%d" fill="black"/>`, int(nx), int(y), 1, 5)
112+ svgOut += ufmt.Sprintf(`<text x="%d" y="%d" style="font-size:%dpx;text-anchor:middle;" fill="black">%.1f</text>`, int(nx), int(y)+18, 11, val)
112113 }
113114
114115 // Graduation Y
115116 for val := startY; val <= endY; val += stepY {
116- ny := scaleY(val)
117- x := float64(40)
118- svgOut += ufmt.Sprintf(`<rect x="%d" y="%d" width="%d" height="%d" fill="black"/>`, int(x)-5, int(ny), 5, 1)
119- svgOut += ufmt.Sprintf(`<text x="%d" y="%d" style="font-size:%dpx;text-anchor:end;" fill="black">%.1f</text>`, int(x)-8, int(ny)+4, 11, val)
117+ ny := scaleY(val)
118+ x := float64(40)
119+ svgOut += ufmt.Sprintf(`<rect x="%d" y="%d" width="%d" height="%d" fill="black"/>`, int(x)-5, int(ny), 5, 1)
120+ svgOut += ufmt.Sprintf(`<text x="%d" y="%d" style="font-size:%dpx;text-anchor:end;" fill="black">%.1f</text>`, int(x)-8, int(ny)+4, 11, val)
120121 }
121122
122123 return svgOut
@@ -128,63 +129,61 @@ func RenderAxes(sp ScatterPlot, Width, Height int, maxX, maxY, minX, minY float6
128129func (sp ScatterPlot) String() string {
129130
130131 const (
131- pointRadius = 2
132+ pointRadius = 2
132133 )
133134
134135 Width := sp.GetWidth()
135136 Height := sp.GetHeight()
136137
137138 if len(sp.Points) == 0 {
138- return "\nscatterplot fails: no data provided"
139+ return "\nscatterplot fails: no data provided"
139140 }
140141
141142 // calcul min/max
142143 minX, minY := sp.Points[0].X, sp.Points[0].Y
143144 maxX, maxY := sp.Points[0].X, sp.Points[0].Y
144145
145146 for _, p := range sp.Points {
146- if p.X > maxX {
147- maxX = p.X
148- }
149- if p.X < minX {
150- minX = p.X
151- }
152- if p.Y > maxY {
153- maxY = p.Y
154- }
155- if p.Y < minY {
156- minY = p.Y
157- }
147+ if p.X > maxX {
148+ maxX = p.X
149+ }
150+ if p.X < minX {
151+ minX = p.X
152+ }
153+ if p.Y > maxY {
154+ maxY = p.Y
155+ }
156+ if p.Y < minY {
157+ minY = p.Y
158+ }
158159 }
159160
160161 svgOut := ""
161162 svgOut += RenderAxes(sp, Width, Height, maxX, maxY, minX, minY)
162163
163164 // Draw Points and labels
164165 for _, p := range sp.Points {
165- nx := 40 + (p.X-minX)/(maxX-minX)*float64(Width-60)
166- ny := float64(Height-40) - (p.Y-minY)/(maxY-minY)*float64(Height-60)
167-
168- svgOut += ufmt.Sprintf(`<circle cx="%d" cy="%d" r="%d" fill="%s"/>`, int(nx), int(ny), pointRadius, p.Color)
169-
170- if p.Label != "" {
171- svgOut += ufmt.Sprintf(
172- `<text x="%d" y="%d" style="font-family:'Inter var',sans-serif;font-size:10px;text-anchor:middle;" fill="#333">%s</text>`,
173- int(nx)+5, int(ny)+12, p.Label,
174- )
175- }
166+ nx := 40 + (p.X-minX)/(maxX-minX)*float64(Width-60)
167+ ny := float64(Height-40) - (p.Y-minY)/(maxY-minY)*float64(Height-60)
168+ svgOut += ufmt.Sprintf(`<circle cx="%d" cy="%d" r="%d" fill="%s"/>`, int(nx), int(ny), pointRadius, p.Color)
169+ if p.Label != "" {
170+ svgOut += ufmt.Sprintf(
171+ `<text x="%d" y="%d" style="font-family:'Inter var',sans-serif;font-size:10px;text-anchor:middle;" fill="#333">%s</text>`,
172+ int(nx)+5, int(ny)+12, p.Label,
173+ )
174+ }
176175 }
177176
178177 // Flags :
179178 if sp.FlagRe == true {
180- svgOut += RenderReFlag(sp.Points, minX, maxX, minY, maxY, Width, Height)
179+ svgOut += RenderReFlag(sp.Points, minX, maxX, minY, maxY, Width, Height)
181180 }
182181
183182 // Draw Title
184183 if sp.Title != "" {
185- svgOut += ufmt.Sprintf(`<text x="%d" y="%d" style="font-family:'Inter var',sans-serif;font-size:16px;text-anchor:middle;" fill="black">%s</text>`,
186- Width/2, 20, sp.Title,
187- )
184+ svgOut += ufmt.Sprintf(`<text x="%d" y="%d" style="font-family:'Inter var',sans-serif;font-size:16px;text-anchor:middle;" fill="black">%s</text>`,
185+ Width/2, 20, sp.Title,
186+ )
188187 }
189188
190189 return svgOut
0 commit comments