Skip to content

Commit 29b7c71

Browse files
authored
Merge pull request #62 from cogentcore/plot
plot: plot SetData is a separate interface method for updating plot data
2 parents 051e3b0 + fba9f07 commit 29b7c71

8 files changed

Lines changed: 125 additions & 76 deletions

File tree

go.mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ go 1.25.6
88
// https://github.com/googleapis/go-genproto/issues/1015
99

1010
require (
11-
cogentcore.org/core v0.3.35
11+
cogentcore.org/core v0.3.36-0.20260612144634-1bad52409d9d
1212
github.com/cogentcore/readline v0.1.3
1313
github.com/cogentcore/yaegi v0.0.0-20260116172027-700fbf8949f3
1414
github.com/mitchellh/go-homedir v1.1.0
@@ -71,7 +71,7 @@ require (
7171
golang.org/x/sync v0.20.0 // indirect
7272
golang.org/x/sys v0.45.0 // indirect
7373
golang.org/x/text v0.37.0 // indirect
74-
google.golang.org/genproto v0.0.0-20260608224507-4308a22a1bab // indirect
74+
google.golang.org/genproto v0.0.0-20260610212136-7ab31c22f7ad // indirect
7575
google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa // indirect
7676
gopkg.in/yaml.v3 v3.0.1 // indirect
7777
modernc.org/knuth v0.5.4 // indirect

go.sum

Lines changed: 9 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
codeberg.org/go-pdf/fpdf v0.11.0 h1:n3I8WISQ1cr0S2rvx9DOlE/GypbcimMWqLpel3slHmY=
22
codeberg.org/go-pdf/fpdf v0.11.0/go.mod h1:Y0DGRAdZ0OmnZPvjbMp/1bYxmIPxm0ws4tfoPOc4LjU=
3-
cogentcore.org/core v0.3.35 h1:4MXrFnPT7gz0VwyBeFZLIjiXpFKgz6GiDjxxMn9CV3Q=
4-
cogentcore.org/core v0.3.35/go.mod h1:bq1W15L76MTl+Gd+SB2xxdte1hG9HI9rNyAi+Xgv+Wo=
3+
cogentcore.org/core v0.3.36-0.20260612144634-1bad52409d9d h1:0tTH0f6xa4PmXA0psMvqTrE9QjfJw+98XfnH2aO/bKk=
4+
cogentcore.org/core v0.3.36-0.20260612144634-1bad52409d9d/go.mod h1:bq1W15L76MTl+Gd+SB2xxdte1hG9HI9rNyAi+Xgv+Wo=
55
git.sr.ht/~sbinet/cmpimg v0.1.0 h1:E0zPRk2muWuCqSKSVZIWsgtU9pjsw3eKHi8VmQeScxo=
66
git.sr.ht/~sbinet/cmpimg v0.1.0/go.mod h1:FU12psLbF4TfNXkKH2ZZQ29crIqoiqTZmeQ7dkp/pxE=
77
github.com/Bios-Marcel/wastebasket/v2 v2.0.3 h1:TkoDPcSqluhLGE+EssHu7UGmLgUEkWg7kNyHyyJ3Q9g=
@@ -137,21 +137,16 @@ github.com/tdewolff/test v1.0.11 h1:FdLbwQVHxqG16SlkGveC0JVyrJN62COWTRyUFzfbtBE=
137137
github.com/tdewolff/test v1.0.11/go.mod h1:XPuWBzvdUzhCuxWO1ojpXsyzsA5bFoS3tO/Q3kFuTG8=
138138
go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64=
139139
go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y=
140-
go.opentelemetry.io/otel v1.39.0 h1:8yPrr/S0ND9QEfTfdP9V+SiwT4E0G7Y5MO7p85nis48=
141-
go.opentelemetry.io/otel v1.39.0/go.mod h1:kLlFTywNWrFyEdH0oj2xK0bFYZtHRYUdv1NklR/tgc8=
142140
go.opentelemetry.io/otel v1.43.0 h1:mYIM03dnh5zfN7HautFE4ieIig9amkNANT+xcVxAj9I=
143-
go.opentelemetry.io/otel/metric v1.39.0 h1:d1UzonvEZriVfpNKEVmHXbdf909uGTOQjA0HF0Ls5Q0=
144-
go.opentelemetry.io/otel/metric v1.39.0/go.mod h1:jrZSWL33sD7bBxg1xjrqyDjnuzTUB0x1nBERXd7Ftcs=
141+
go.opentelemetry.io/otel v1.43.0/go.mod h1:JuG+u74mvjvcm8vj8pI5XiHy1zDeoCS2LB1spIq7Ay0=
145142
go.opentelemetry.io/otel/metric v1.43.0 h1:d7638QeInOnuwOONPp4JAOGfbCEpYb+K6DVWvdxGzgM=
146-
go.opentelemetry.io/otel/sdk v1.39.0 h1:nMLYcjVsvdui1B/4FRkwjzoRVsMK8uL/cj0OyhKzt18=
147-
go.opentelemetry.io/otel/sdk v1.39.0/go.mod h1:vDojkC4/jsTJsE+kh+LXYQlbL8CgrEcwmt1ENZszdJE=
143+
go.opentelemetry.io/otel/metric v1.43.0/go.mod h1:RDnPtIxvqlgO8GRW18W6Z/4P462ldprJtfxHxyKd2PY=
148144
go.opentelemetry.io/otel/sdk v1.43.0 h1:pi5mE86i5rTeLXqoF/hhiBtUNcrAGHLKQdhg4h4V9Dg=
149-
go.opentelemetry.io/otel/sdk/metric v1.39.0 h1:cXMVVFVgsIf2YL6QkRF4Urbr/aMInf+2WKg+sEJTtB8=
150-
go.opentelemetry.io/otel/sdk/metric v1.39.0/go.mod h1:xq9HEVH7qeX69/JnwEfp6fVq5wosJsY1mt4lLfYdVew=
145+
go.opentelemetry.io/otel/sdk v1.43.0/go.mod h1:P+IkVU3iWukmiit/Yf9AWvpyRDlUeBaRg6Y+C58QHzg=
151146
go.opentelemetry.io/otel/sdk/metric v1.43.0 h1:S88dyqXjJkuBNLeMcVPRFXpRw2fuwdvfCGLEo89fDkw=
152-
go.opentelemetry.io/otel/trace v1.39.0 h1:2d2vfpEDmCJ5zVYz7ijaJdOF59xLomrvj7bjt6/qCJI=
153-
go.opentelemetry.io/otel/trace v1.39.0/go.mod h1:88w4/PnZSazkGzz/w84VHpQafiU4EtqqlVdxWy+rNOA=
147+
go.opentelemetry.io/otel/sdk/metric v1.43.0/go.mod h1:C/RJtwSEJ5hzTiUz5pXF1kILHStzb9zFlIEe85bhj6A=
154148
go.opentelemetry.io/otel/trace v1.43.0 h1:BkNrHpup+4k4w+ZZ86CZoHHEkohws8AY+WTX09nk+3A=
149+
go.opentelemetry.io/otel/trace v1.43.0/go.mod h1:/QJhyVBUUswCphDVxq+8mld+AvhXZLhe+8WVFxiFff0=
155150
golang.org/x/crypto v0.51.0 h1:IBPXwPfKxY7cWQZ38ZCIRPI50YLeevDLlLnyC5wRGTI=
156151
golang.org/x/crypto v0.51.0/go.mod h1:8AdwkbraGNABw2kOX6YFPs3WM22XqI4EXEd8g+x7Oc8=
157152
golang.org/x/exp v0.0.0-20260112195511-716be5621a96 h1:Z/6YuSHTLOHfNFdb8zVZomZr7cqNgTJvA8+Qz75D8gU=
@@ -182,14 +177,10 @@ golang.org/x/tools v0.44.0/go.mod h1:KA0AfVErSdxRZIsOVipbv3rQhVXTnlU6UhKxHd1seDI
182177
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
183178
gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4=
184179
gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E=
185-
google.golang.org/genproto v0.0.0-20260608224507-4308a22a1bab h1:bG8JpL3dfsvJKRgrh7yMkswdxzBqQDRYqkLDHo3+708=
186-
google.golang.org/genproto v0.0.0-20260608224507-4308a22a1bab/go.mod h1:cVHIikDNAdx8ISZeW+2rYkEMf3xn0GSaBYmVnWXQBUo=
187-
google.golang.org/genproto/googleapis/rpc v0.0.0-20260511170946-3700d4141b60 h1:seT2EwLWM78plQ7wcDfuWBc/4FAEAXDDiaSol4ku4qo=
188-
google.golang.org/genproto/googleapis/rpc v0.0.0-20260511170946-3700d4141b60/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8=
180+
google.golang.org/genproto v0.0.0-20260610212136-7ab31c22f7ad h1:cYL1DPJAQr4JMvhfGao0PDXoaf03ifMljAuDyrbMBd0=
181+
google.golang.org/genproto v0.0.0-20260610212136-7ab31c22f7ad/go.mod h1:cVHIikDNAdx8ISZeW+2rYkEMf3xn0GSaBYmVnWXQBUo=
189182
google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa h1:mZHHdPZl0dbGHCflZgAq/Q468DWVFcU2whhB2KAo8fk=
190183
google.golang.org/genproto/googleapis/rpc v0.0.0-20260526163538-3dc84a4a5aaa/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8=
191-
google.golang.org/grpc v1.80.0 h1:Xr6m2WmWZLETvUNvIUmeD5OAagMw3FiKmMlTdViWsHM=
192-
google.golang.org/grpc v1.80.0/go.mod h1:ho/dLnxwi3EDJA4Zghp7k2Ec1+c2jqup0bFkw07bwF4=
193184
google.golang.org/grpc v1.81.1 h1:VnnIIZ88UzOOKLukQi+ImGz8O1Wdp8nAGGnvOfEIWQQ=
194185
google.golang.org/grpc v1.81.1/go.mod h1:xGH9GfzOyMTGIOXBJmXt+BX/V0kcdQbdcuwQ/zNw42I=
195186
google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE=

plot/plots/bar.go

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import (
1515
"fmt"
1616
"math"
1717

18-
"cogentcore.org/core/base/errors"
1918
"cogentcore.org/core/math32"
2019
"cogentcore.org/core/math32/minmax"
2120
"cogentcore.org/lab/plot"
@@ -74,24 +73,33 @@ type Bar struct {
7473
// Optional error-bar values can be provided using the High data role.
7574
// Styler functions are obtained from the Y metadata if present.
7675
func NewBar(plt *plot.Plot, data any) *Bar {
77-
dt := errors.Log1(plot.DataOrValuer(data, plot.Y))
78-
if dt == nil {
76+
bc := &Bar{}
77+
err := bc.SetData(data)
78+
if err != nil {
7979
return nil
8080
}
81-
if dt.CheckLengths() != nil {
82-
return nil
81+
bc.Defaults()
82+
plt.Add(bc)
83+
return bc
84+
}
85+
86+
// SetData sets the plot data.
87+
func (bc *Bar) SetData(data any) error {
88+
dt, err := plot.DataOrValuer(data, plot.Y)
89+
if err != nil {
90+
return err
91+
}
92+
if err := dt.CheckLengths(); err != nil {
93+
return err
8394
}
84-
bc := &Bar{}
8595
bc.Y = plot.MustCopyRole(dt, plot.Y)
8696
if bc.Y == nil {
87-
return nil
97+
return fmt.Errorf("Y is nil")
8898
}
8999
bc.XLabels = plot.CopyRoleLabels(dt, plot.X)
90-
bc.stylers = plot.GetStylersFromData(dt, plot.Y)
100+
bc.stylers = plot.GetStylersFromData(dt, plot.X, plot.Y)
91101
bc.Err = plot.CopyRole(dt, plot.High)
92-
bc.Defaults()
93-
plt.Add(bc)
94-
return bc
102+
return nil
95103
}
96104

97105
func (bc *Bar) Defaults() {

plot/plots/errbars.go

Lines changed: 52 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
package plots
66

77
import (
8+
"fmt"
89
"math"
910

1011
"cogentcore.org/core/math32"
@@ -54,25 +55,38 @@ func (eb *YErrorBars) Defaults() {
5455
// using Low, High data roles for error deviations around X, Y coordinates.
5556
// Styler functions are obtained from the High data if present.
5657
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 {
5861
return nil
5962
}
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)
6581
if eb.Low == nil && eb.High != nil {
6682
eb.Low = eb.High
6783
}
6884
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")
7086
}
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
7690
}
7791

7892
// Styler adds a style function to set style parameters.
@@ -205,27 +219,40 @@ func (eb *XErrorBars) Defaults() {
205219
// NewXErrorBars adds a new XErrorBars plotter to given plot,
206220
// using Low, High data roles for error deviations around X, Y coordinates.
207221
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 {
209225
return nil
210226
}
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)
218247
if eb.Low == nil && eb.High != nil {
219248
eb.Low = eb.High
220249
}
221250
if eb.X == nil || eb.Y == nil || eb.Low == nil || eb.High == nil {
222251
return nil
223252
}
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
229256
}
230257

231258
// Styler adds a style function to set style parameters.

plot/plots/labels.go

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
package plots
66

77
import (
8+
"fmt"
89
"image"
910
"math"
1011

@@ -44,29 +45,39 @@ type Labels struct {
4445
// which must specify X, Y and Label roles.
4546
// Styler functions are obtained from the Label metadata if present.
4647
func NewLabels(plt *plot.Plot, data plot.Data) *Labels {
47-
if data.CheckLengths() != nil {
48-
return nil
49-
}
5048
lb := &Labels{}
51-
lb.X = plot.MustCopyRole(data, plot.X)
52-
lb.Y = plot.MustCopyRole(data, plot.Y)
53-
if lb.X == nil || lb.Y == nil {
49+
err := lb.SetData(data)
50+
if err != nil {
5451
return nil
5552
}
56-
ld := data[plot.Label]
57-
if ld == nil {
58-
return nil
53+
lb.Defaults()
54+
plt.Add(lb)
55+
return lb
56+
}
57+
58+
// SetData sets the plot data.
59+
func (lb *Labels) SetData(data any) error {
60+
dt, err := plot.DataOrValuer(data, plot.Y)
61+
if err != nil {
62+
return err
63+
}
64+
if err := dt.CheckLengths(); err != nil {
65+
return err
66+
}
67+
lb.X = plot.MustCopyRole(dt, plot.X)
68+
lb.Y = plot.MustCopyRole(dt, plot.Y)
69+
ld := dt[plot.Label]
70+
if ld == nil || lb.X == nil || lb.Y == nil {
71+
return fmt.Errorf("Label or X or Y is nil")
5972
}
6073
lb.Labels = make(plot.Labels, lb.X.Len())
6174
for i := range ld.Len() {
6275
lb.Labels[i] = ld.String1D(i)
6376
}
6477

65-
lb.stylers = plot.GetStylersFromData(data, plot.Label)
66-
lb.ystylers = plot.GetStylersFromData(data, plot.Y)
67-
lb.Defaults()
68-
plt.Add(lb)
69-
return lb
78+
lb.stylers = plot.GetStylersFromData(dt, plot.Label)
79+
lb.ystylers = plot.GetStylersFromData(dt, plot.Y)
80+
return nil
7081
}
7182

7283
func (lb *Labels) Defaults() {

plot/plots/xy.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ func (ln *XY) SetData(data any) error {
8181
if ln.X == nil || ln.Y == nil {
8282
return fmt.Errorf("X or Y is nil")
8383
}
84-
ln.stylers = plot.GetStylersFromData(dt, plot.Y)
84+
ln.stylers = plot.GetStylersFromData(dt, plot.X, plot.Y)
8585
ln.Size = plot.CopyRole(dt, plot.Size)
8686
return nil
8787
}

plot/plotter.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,11 @@ type Plotter interface {
2020
// UpdateRange updates the given ranges.
2121
UpdateRange(plt *Plot)
2222

23+
// SetData sets the plot data, which can be of type [Data],
24+
// or a [Valuer]. This is needed to update the plot data if already
25+
// set previously.
26+
SetData(data any) error
27+
2328
// Data returns the data by roles for this plot, for both the original
2429
// data and the pixel-transformed X,Y coordinates for that data.
2530
// This allows a GUI interface to inspect data etc.

plot/style.go

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -198,12 +198,19 @@ func Styler(obj any, f func(s *Style)) {
198198
// GetStylersFromData returns [Stylers] from given role
199199
// in given [Data]. nil if not present. Mostly used internally
200200
// for Plotters implementations.
201-
func GetStylersFromData(data Data, role Roles) Stylers {
202-
vr, ok := data[role]
203-
if !ok {
204-
return nil
201+
func GetStylersFromData(data Data, role ...Roles) Stylers {
202+
var st Stylers
203+
for _, rl := range role {
204+
vr, ok := data[rl]
205+
if !ok {
206+
continue
207+
}
208+
s := GetStylers(vr)
209+
if s != nil {
210+
st = append(st, s...)
211+
}
205212
}
206-
return GetStylers(vr)
213+
return st
207214
}
208215

209216
// BasicStylers returns a basic set of [Stylers] that can be used with

0 commit comments

Comments
 (0)