I've thought some about this in the past, too. Coming from Matlab, I've
imagined a Matlab-esque Base.Plots module that has just a handful of
definitions, mirroring the IO system:
abstract AbstractPlot
immutable NoPlots <: AbstractPlot end
STDPLOT = NoPlots() # When a plotting package loads, it assigns its own
AbstractPlot object to STDPLOT
line(args...) = line(STDPLOT, args...)
line(p::AbstractPlot, ys::AbstractArray) = line(p, 1:size(ys,1), ys)
# Then each plotting package would specialize on the following method:
line(::NoPlots, xs, ys) = error("Plotting requires a plotting package to be
installed. Here, try one of these: …")
# … and so on for just a handful of very common (and specific!) names …
scatter() …
bar() …
surface() …
Of course, doing anything more complicated would require delving into
documentation and using a more package-specific function. But users could
easily start from the source for these simple prototypes and grow from
there. Sure, this will be heretical for some plotting packages, but I
think there's value here, especially for quick and dirty exploratory data
analysis.
The plot function is tougher — there's not really a meaning to it beyond
"show this thing graphically," and packages use keywords or other arguments
to determine the kind of plot. I could see it being useful in cases like
yours, though, where you want to define a plotting routine for a your own
ROC object type. You would simply define `plot(p::AbstractPlot, t::ROCType
)` and then use the above primitives. The trouble is, as a package author,
you'll want to add fancier features like labels, legends, colors, titles,
bounds, error-bars, shaded regions, transforms, etc…. and now we're
marching down that crazy never-ending path Daniel fears.
So: yes, it's possible. Is it useful? I'm not so sure. I think no matter
what you're going to have to learn a specific plotting API, and as a
package author I think you're better off picking one to support well and
extending its functions directly. Maybe some cavalier users will come by
and add support for others they like with lazy loading through Requires.jl.
:)
Matt
On Thursday, January 22, 2015 at 1:03:44 PM UTC-5, Simon Danisch wrote:
>
> The reference does seem to fit here, as a general plotting language seems
> to be awfully complicated.
> By the way, I totally forgot to mention, that I want to turn GLPlot more
> into a meta package, offering different plotting interfaces, since I'm
> generalizing more and more of the render code and a lot of people prefer
> different interfaces to the same functionality.
> So it might become a lightweight package, which actually doesn't contain
> render code and only defines interfaces.
> If someone has any API that he wants to implement, GLPlot might become the
> go to package. If this happens, I should rename it though ;)
>
>
> Am Donnerstag, 22. Januar 2015 16:42:37 UTC+1 schrieb David van Leeuwen:
>>
>> Hello,
>>
>> I've just read up on most recent conversations mentioning plotting, after
>> I went through a similar install-and-try-out cycle for the various plotting
>> packages.
>>
>> I am busy with a package named ROC <https://github.com/davidavdav/ROC>
>> (Receiver
>> Operating Characteristic). It is mostly about decision cost functions and
>> efficiently computing ROC statistics, but there is also some support for
>> making various plots related to the ROC.
>>
>> I do not want to decide for a potential user of this package which
>> plotting package she should use. So it would be nice if there would be an
>> abstract plotting API (I suppose this does not exist yet).
>>
>> Supposing that it is possible to make an API that includes some common
>> plotting primitives, and that makes a runtime selection based on
>> `isdefined(plottingpackagename)`, how would you
>> - overload a function, typically `plot()`, when at module-include time
>> it is not yet known which plotting package the user wants
>> - specify the dependence of this package to any one of the available
>> plotting packages.
>>
>> Thoughts?
>>
>> Thanks,
>>
>> ---david
>>
>