Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[WIP] subplots API #43

Open
timotheecour opened this issue Jan 28, 2019 · 2 comments
Open

[WIP] subplots API #43

timotheecour opened this issue Jan 28, 2019 · 2 comments

Comments

@timotheecour
Copy link
Contributor

timotheecour commented Jan 28, 2019

[will write more details here]

the obvious next step is provide a nice API to generate subplots, as in matlab / matplotlib etc
Ideally:

  • simple things should be easy to do in the API, eg:
    • let plots = createGrid(numPlots = 10, numPlotsPerRow = 3); plots[0] = ...
  • more complex use cases should be feasible, eg support use case where user has his own html and asks plotly to fill in a div with a Plot

note

@Vindaar
Copy link
Member

Vindaar commented Jan 30, 2019

I wanted to wait until you filled in the details, but no matter.

First of all you're aware of the subplots macro from #34 here:
https://github.com/brentp/nim-plotly/blob/master/src/plotly/plotly_subplots.nim?

What you describe is in possible already. Yes, not via creating a grid and filling it one after another. Only via a macro for now (but for the general use case it's really simple to use!).

What you describe however is basically done by the combine proc here:
https://github.com/brentp/nim-plotly/blob/master/src/plotly/plotly_subplots.nim#L62
The reason why this proc is not public is the fact that it has to work with PlotJson instead of the normal Plot[T] type. I don't want the user having to deal with the confusion of why there's another type aside from Plot[T] and the bother of having to convert each Plot[T] via toPlotJson before we can hand them all to combine.

For your createGrid approach it's thinkable to do something like

type
  Grid = object
    plts: seq[PlotJson]
    cols: int
    rows: int
    domains: seq[Domain]

proc `[]=`[T: Plot](grid: var Grid, idx: int, plt: T) =
  grid.plts[idx] = plt.toPlotJson

(didn't test that code) of course to avoid having the user deal with PlotJson by themselves.

more complex use cases should be feasible, eg support use case where user has his own html and asks plotly to fill in a div with a Plot

That seems orthogonal to subplots to me? Although that's surely a nice feature.

@timotheecour
Copy link
Contributor Author

Yes, not via creating a grid and filling it one after another. Only via a macro for now

thanks; wasn't aware of subplots macro;

let subplt = subplots:
  baseLayout: layout
  plot:
    plt1
    left: 0.0
    bottom: 0.0
    width: 0.45
    height: 1.0
    # alternatively use right, top instead of width, height
    # single letters also supported, e.g. l == left
  plot:
    plt2
    # or just write a concise tuple, here the
    (0.55, 0.0, 0.45, 1.0)

however that's not flexible enough for many workflows where's it's easier to fill them in 1 by 1 programmatically instead of declaratively (eg if arbitrary nrows/ncols or even if these are known at RT rather than CT)

The reason why this proc is not public is the fact that it has to work with PlotJson instead of the normal Plot[T] type. I don't want the user having to deal with the confusion of why there's another type aside from Plot[T] and the bother of having to convert each Plot[T] via toPlotJson before we can hand them all to combine

i don't think it's such a big deal to expose PlotJson and require toPlotJson in the appropriate places; we get CT errors anyways so it's trivial to fix;
I'd rather have the flexibility (even if there's a big fat warning in the proc doc comment regarding that) rather than being limited;

that being said, there may be a way to do everything via Plot[T]; but i need to think more

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants