|
5 | 5 | package plots |
6 | 6 |
|
7 | 7 | import ( |
| 8 | + "fmt" |
8 | 9 | "math" |
9 | 10 |
|
10 | 11 | "cogentcore.org/core/math32" |
@@ -54,25 +55,38 @@ func (eb *YErrorBars) Defaults() { |
54 | 55 | // using Low, High data roles for error deviations around X, Y coordinates. |
55 | 56 | // Styler functions are obtained from the High data if present. |
56 | 57 | func NewYErrorBars(plt *plot.Plot, data plot.Data) *YErrorBars { |
57 | | - if data.CheckLengths() != nil { |
| 58 | + eb := &YErrorBars{} |
| 59 | + err := eb.SetData(data) |
| 60 | + if err != nil { |
58 | 61 | return nil |
59 | 62 | } |
60 | | - eb := &YErrorBars{} |
61 | | - eb.X = plot.MustCopyRole(data, plot.X) |
62 | | - eb.Y = plot.MustCopyRole(data, plot.Y) |
63 | | - eb.Low = plot.CopyRole(data, plot.Low) |
64 | | - eb.High = plot.CopyRole(data, plot.High) |
| 63 | + eb.Defaults() |
| 64 | + plt.Add(eb) |
| 65 | + return eb |
| 66 | +} |
| 67 | + |
| 68 | +// SetData sets the plot data. |
| 69 | +func (eb *YErrorBars) SetData(data any) error { |
| 70 | + dt, err := plot.DataOrValuer(data, plot.Y) |
| 71 | + if err != nil { |
| 72 | + return err |
| 73 | + } |
| 74 | + if err := dt.CheckLengths(); err != nil { |
| 75 | + return err |
| 76 | + } |
| 77 | + eb.X = plot.MustCopyRole(dt, plot.X) |
| 78 | + eb.Y = plot.MustCopyRole(dt, plot.Y) |
| 79 | + eb.Low = plot.CopyRole(dt, plot.Low) |
| 80 | + eb.High = plot.CopyRole(dt, plot.High) |
65 | 81 | if eb.Low == nil && eb.High != nil { |
66 | 82 | eb.Low = eb.High |
67 | 83 | } |
68 | 84 | if eb.X == nil || eb.Y == nil || eb.Low == nil || eb.High == nil { |
69 | | - return nil |
| 85 | + return fmt.Errorf("X or Y or Low or High is nil") |
70 | 86 | } |
71 | | - eb.stylers = plot.GetStylersFromData(data, plot.High) |
72 | | - eb.ystylers = plot.GetStylersFromData(data, plot.Y) |
73 | | - eb.Defaults() |
74 | | - plt.Add(eb) |
75 | | - return eb |
| 87 | + eb.stylers = plot.GetStylersFromData(dt, plot.X, plot.Low, plot.High) |
| 88 | + eb.ystylers = plot.GetStylersFromData(dt, plot.Y) |
| 89 | + return nil |
76 | 90 | } |
77 | 91 |
|
78 | 92 | // Styler adds a style function to set style parameters. |
@@ -205,27 +219,40 @@ func (eb *XErrorBars) Defaults() { |
205 | 219 | // NewXErrorBars adds a new XErrorBars plotter to given plot, |
206 | 220 | // using Low, High data roles for error deviations around X, Y coordinates. |
207 | 221 | func NewXErrorBars(plt *plot.Plot, data plot.Data) *XErrorBars { |
208 | | - if data.CheckLengths() != nil { |
| 222 | + eb := &XErrorBars{} |
| 223 | + err := eb.SetData(data) |
| 224 | + if err != nil { |
209 | 225 | return nil |
210 | 226 | } |
211 | | - eb := &XErrorBars{} |
212 | | - eb.X = plot.MustCopyRole(data, plot.X) |
213 | | - eb.Y = plot.MustCopyRole(data, plot.Y) |
214 | | - eb.Low = plot.MustCopyRole(data, plot.Low) |
215 | | - eb.High = plot.MustCopyRole(data, plot.High) |
216 | | - eb.Low = plot.CopyRole(data, plot.Low) |
217 | | - eb.High = plot.CopyRole(data, plot.High) |
| 227 | + eb.Defaults() |
| 228 | + plt.Add(eb) |
| 229 | + return eb |
| 230 | +} |
| 231 | + |
| 232 | +// SetData sets the plot data. |
| 233 | +func (eb *XErrorBars) SetData(data any) error { |
| 234 | + dt, err := plot.DataOrValuer(data, plot.Y) |
| 235 | + if err != nil { |
| 236 | + return err |
| 237 | + } |
| 238 | + if err := dt.CheckLengths(); err != nil { |
| 239 | + return err |
| 240 | + } |
| 241 | + eb.X = plot.MustCopyRole(dt, plot.X) |
| 242 | + eb.Y = plot.MustCopyRole(dt, plot.Y) |
| 243 | + eb.Low = plot.MustCopyRole(dt, plot.Low) |
| 244 | + eb.High = plot.MustCopyRole(dt, plot.High) |
| 245 | + eb.Low = plot.CopyRole(dt, plot.Low) |
| 246 | + eb.High = plot.CopyRole(dt, plot.High) |
218 | 247 | if eb.Low == nil && eb.High != nil { |
219 | 248 | eb.Low = eb.High |
220 | 249 | } |
221 | 250 | if eb.X == nil || eb.Y == nil || eb.Low == nil || eb.High == nil { |
222 | 251 | return nil |
223 | 252 | } |
224 | | - eb.stylers = plot.GetStylersFromData(data, plot.High) |
225 | | - eb.ystylers = plot.GetStylersFromData(data, plot.Y) |
226 | | - eb.Defaults() |
227 | | - plt.Add(eb) |
228 | | - return eb |
| 253 | + eb.stylers = plot.GetStylersFromData(dt, plot.High) |
| 254 | + eb.ystylers = plot.GetStylersFromData(dt, plot.Y) |
| 255 | + return nil |
229 | 256 | } |
230 | 257 |
|
231 | 258 | // Styler adds a style function to set style parameters. |
|
0 commit comments