Hi Mike, Matt, Some responses below.
On 12 December 2014 at 23:33, Matt Revelle <mreve...@gmail.com> wrote: > I had started thinking about this problem recently too and also had broken > it down to two parts. I was going to create a simple data frame protocol for > a) and a ggplot2-inspired library which emits SVG for b). There is prior > work for plotting in Incanter (using JFreeChart) and David Liebke also > started a SVG-emitting plot library, Analemma > (https://github.com/liebke/analemma). I believe there is some sort of data > frame implementation in Incanter. Thanks. I'll have a look at these. The data frame implementation in core.matrix is currently quite similar to the incanter data frame format. However we may find this format limiting, and therefore we're looking into extending it to matrices with arbitrary dimensionality. Thanks for the Analemma suggestion, I think some of the ideas will be useful. > > My motivation was for simple libraries which could be used to generate > well-designed figures. I frequently end up exporting data from Clojure to R > only for ggplot2. Having a data frame is useful for designing the plotting > API or quickly collecting aggregate statistics for certain attributes or > factor levels. That's unfortunate, and certainly part of what we are trying to avoid. Our initial focus is on a clojurescript implementation of the charting / figure generation, however the point of the discussion is to ensure that the charting format/data frame format would be usable from the clojure/JVM side too. > > On Friday, December 12, 2014 4:29:37 AM UTC-5, Mike Anderson wrote: >> >> Lucas, >> >> Thanks for kicking off the discussion - great to see your proposal on >> this. I think it will be really valuable if we can converge on a standard >> way of representing this kind of data in Clojure/ClojureScript. Copying the >> Incanter and main Clojure groups as well because I think there will be broad >> interest in this. >> >> My view is that it is worth distinguishing (decomplecting?) two things: >> >> a) The format used to convey the actual data, i.e. the labelled ":dataset" >> part of the data format suggested below >> b) The format used to specify the chart (chart type, axes etc.) >> >> I think a) Can be pretty closely linked to the standard core.matrix >> dataset / n-dimensional array structure. Agreed. We have attempted to follow a similar structure to the core.matrix dataset implementation, however it looks like this will prove limiting in the long run. Ideally core.matrix datasets will be extended to support n-dimensional core.matrix matrices. >> >> b) is much harder and may call for something more like ggplot2, also worth >> checking out Kevin Lynagh's c2 work (https://keminglabs.com/c2/) c2 is certainly interesting, though I haven't seen many examples of it being used in more advanced visualisations. It may be better to wrap d3 in a more declarative way, though based on our experiences thus far we may end up fighting between the two models. On the plus side, d3 is far more battle-tested. Our experience in wrapping d3 based charting libraries like C3 and Dimple with the OM component model has proven to be an excellent experience so far. Updates to these charts are only triggered when data changes, and are handled internally by d3's update model. However, once if we need to venture outside of these charting libraries for any other visualisation needs, then we're back to writing d3 code. >> >> Therefore it may be easier to tackle a) in isolation first. b) will >> probably need more experimentation before we can settle on something >> sufficiently well designed and general. I agree that the data frame/set spec is definitely the place to start. Cheers >> >> On Thursday, 11 December 2014 17:45:00 UTC+8, Lucas Bradstreet wrote: >>> >>> Hi everyone, >>> >>> We are currently writing an OM based visualisation / charting library >>> that we >>> intend to use extensively in combination with core.matrix and other data >>> analysis libraries/tools (e.g. gorilla REPL, incanter, etc). >>> >>> Some of the goals of this library: >>> - Provide a clojurescript wrapper for common visualisation libraries (C3, >>> dimple, Rickshaw, NVD3) for standard charting features. >>> - Provide a generic data format, with conversion functions to native >>> charting >>> library formats. >>> - Provide transformation functions between core.matrix datasets, incanter >>> datasets, etc to this generic charting format. >>> - Provide update functions to allow datasets to seamlessly be updated >>> with the >>> addition of data-points in map and vector formats. >>> - Provide seamless transitions when a dataset is updated, ala om. >>> >>> We would like to hear any of your thoughts regarding the following >>> charting >>> data format below. This format maps fairly closely to core.matrix >>> datasets >>> (note, although core.matrix datasets currently do not allow labelled >>> dimensions, this support is incoming). >>> >>> {:axes [{:label "X axis label" :type :category} >>> {:label "Y axis label" :type :category} >>> {:label "Z axis label" :type :measure} >>> {:label "C axis label" :type :color}] >>> :chart-type :area >>> :dataset {:labels [; 0th dimension is labelled from the 0th dimension >>> of the 1st >>> ; 1st dimension labels (i.e. columns) >>> ["timestamp" "event-count" "magnitude" "colour"] >>> ; 2nd dimension labels (i.e. series) >>> ["series1" "series2" "series3"]] >>> :data [[; series 1 data >>> [1 2 3 4] ; timestamp values >>> [100 200 300 400] ; event count value >>> [50 100 150 200] ; magnitude values >>> [25 50 75 100] ; colour values >>> ] >>> [[1 2 3 4] >>> [1 200 3 4] >>> [5 7 444 8] >>> [9 10 11 12]] >>> [[1 2 3 4] >>> [1 2 3 4] >>> [5 9 7 8] >>> [9 10 11 12]]]}} >>> >>> The above format is close to the native format used by C3, and can be >>> easily mapped >>> to a format that is more easily consumed by dimple charts: >>> >>> {:axes [{:key "timestamp", :type :category, :label "X axis label"} >>> {:key "event-count", :type :category, :label "Y axis label"} >>> {:key "magnitude", :type :measure, :label "Z axis label"} >>> {:key "colour", :type :color, :label "C axis label"}], >>> :chart-type :area, >>> :dataset [{:name "series1", >>> :values [{"colour" 25, "magnitude" 50, "event-count" 100, >>> "timestamp" 1} >>> {"colour" 50, "magnitude" 100, "event-count" 200, >>> "timestamp" 2} >>> {"colour" 75, "magnitude" 150, "event-count" 300, >>> "timestamp" 3} >>> {"colour" 100, "magnitude" 200, "event-count" 400, >>> "timestamp" 4}]} >>> {:name "series2", >>> :values [{"colour" 9, "magnitude" 5, "event-count" 1, >>> "timestamp" 1} >>> {"colour" 10, "magnitude" 7, "event-count" 200, >>> "timestamp" 2} >>> {"colour" 11, "magnitude" 444, "event-count" 3, >>> "timestamp" 3} >>> {"colour" 12, "magnitude" 8, "event-count" 4, >>> "timestamp" 4}]} >>> {:name "series3", >>> :values [{"colour" 9, "magnitude" 5, "event-count" 1, >>> "timestamp" 1} >>> {"colour" 10, "magnitude" 9, "event-count" 2, >>> "timestamp" 2} >>> {"colour" 11, "magnitude" 7, "event-count" 3, >>> "timestamp" 3} >>> {"colour" 12, "magnitude" 8, "event-count" 4, >>> "timestamp" 4}]}]} >>> >>> >>> We would love to hear any feedback of any kind on this format. >>> >>> Thanks, >>> >>> Lucas > > -- > You received this message because you are subscribed to the Google > Groups "Clojure" group. > To post to this group, send email to clojure@googlegroups.com > Note that posts from new members are moderated - please be patient with your > first post. > To unsubscribe from this group, send email to > clojure+unsubscr...@googlegroups.com > For more options, visit this group at > http://groups.google.com/group/clojure?hl=en > --- > You received this message because you are subscribed to the Google Groups > "Clojure" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to clojure+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/d/optout. -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.