first draft winston

This commit is contained in:
Thomas Breloff 2015-09-16 15:08:50 -04:00
parent 01e994e0f1
commit 73944fc9bf
5 changed files with 185 additions and 7 deletions

View File

@ -8,7 +8,7 @@ gadfly!() = plotter!(:gadfly)
supportedArgs(::GadflyPackage) = setdiff(ARGS, [:heatmap_c, :fillto, :pos]) supportedArgs(::GadflyPackage) = setdiff(ARGS, [:heatmap_c, :fillto, :pos])
supportedAxes(::GadflyPackage) = setdiff(ALL_AXES, [:right]) supportedAxes(::GadflyPackage) = setdiff(ALL_AXES, [:right])
supportedTypes(::GadflyPackage) = setdiff(TYPES, [:stepinverted]) supportedTypes(::GadflyPackage) = setdiff(ALL_TYPES, [:stepinverted])
supportedStyles(::GadflyPackage) = [:auto, :solid] supportedStyles(::GadflyPackage) = [:auto, :solid]
supportedMarkers(::GadflyPackage) = [:none, :auto, :rect, :ellipse, :diamond, :cross] supportedMarkers(::GadflyPackage) = [:none, :auto, :rect, :ellipse, :diamond, :cross]

View File

@ -8,8 +8,8 @@ pyplot!() = plotter!(:pyplot)
# ------------------------------- # -------------------------------
supportedArgs(::PyPlotPackage) = setdiff(ARGS, [:reg, :heatmap_c, :fillto, :pos]) supportedArgs(::PyPlotPackage) = setdiff(ARGS, [:reg, :heatmap_c, :fillto, :pos])
# supportedAxes(::PyPlotPackage) = [:left] supportedAxes(::PyPlotPackage) = ALL_AXES
# supportedTypes(::PyPlotPackage) = setdiff(TYPES, [:stepinverted]) supportedTypes(::PyPlotPackage) = ALL_TYPES
supportedStyles(::PyPlotPackage) = setdiff(ALL_STYLES, [:dashdotdot]) supportedStyles(::PyPlotPackage) = setdiff(ALL_STYLES, [:dashdotdot])
supportedMarkers(::PyPlotPackage) = setdiff(ALL_MARKERS, [:star2]) supportedMarkers(::PyPlotPackage) = setdiff(ALL_MARKERS, [:star2])
subplotSupported(::PyPlotPackage) = false subplotSupported(::PyPlotPackage) = false

View File

@ -10,10 +10,10 @@ immutable [PkgName]Package <: PlottingPackage end
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
supportedArgs(::[PkgName]Package) = ARGS supportedArgs(::[PkgName]Package) = ARGS
supportedAxes(::[PkgName]Package) = AXES supportedAxes(::[PkgName]Package) = ALL_AXES
supportedTypes(::[PkgName]Package) = TYPES supportedTypes(::[PkgName]Package) = ALL_TYPES
supportedStyles(::[PkgName]Package) = STYLES supportedStyles(::[PkgName]Package) = ALL_STYLES
supportedMarkers(::[PkgName]Package) = MARKERS supportedMarkers(::[PkgName]Package) = ALL_MARKERS
subplotSupported(::[PkgName]Package) = false subplotSupported(::[PkgName]Package) = false
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------

165
src/backends/winston.jl Normal file
View File

@ -0,0 +1,165 @@
# https://github.com/nolta/Winston.jl
# credit goes to https://github.com/jverzani for the first draft of this backend implementation
immutable WinstonPackage <: PlottingPackage end
winston!() = plotter!(:winston)
# ---------------------------------------------------------------------------
## dictionaries for conversion of Plots.jl names to Winston ones.
const winston_linestyle = Dict(:solid=>"solid",
:dash=>"dash",
:dot=>"dotted",
:dashdot=>"dotdashed",
:dashdotdot=>"dotdashed")
const winston_marker = Dict(:none=>".",
:ellipse=>"circle",
:rect => "square",
:diamond=>"diamond",
:utriangle=>"triangle",
:dtriangle=>"down-triangle",
:cross => "cross",
:xcross => "cross",
:star1 => "asterisk",
:star2 => "filled circle",
:hexagon => "asterisk"
)
supportedArgs(::WinstonPackage) = ARGS
supportedAxes(::WinstonPackage) = [:auto, :left]
supportedTypes(::WinstonPackage) = [:none, :line, :sticks, :scatter, :hist, :bar]
supportedStyles(::WinstonPackage) = vcat(:auto, keys(winston_linestyle))
supportedMarkers(::WinstonPackage) = vcat(:auto, collect(keys(winston_marker)))
subplotSupported(::WinstonPackage) = false
# ---------------------------------------------------------------------------
function plot(pkg::WinstonPackage; kw...)
d = Dict(kw)
# TODO: create the window/canvas/context that is the plot within the backend (call it `o`)
# TODO: initialize the plot... title, xlabel, bgcolor, etc
o = Winston.FramedPlot()
# add the title, axis labels, and theme
Winston.setattr(o, "xlabel", d[:xlabel])
Winston.setattr(o, "ylabel", d[:ylabel])
Winston.setattr(o, "title", d[:title])
# TODO: add the legend?
Plot(o, pkg, 0, d, Dict[])
end
copy_remove(d::Dict, s::Symbol) = delete!(copy(d), s)
function addRegressionLineWinston(d::Dict)
xs, ys = regressionXY(d[:x], d[:y])
Winston.add(plt.o, Winston.Curve(xs, ys, kind="dotted"))
end
function plot!(::WinstonPackage, plt::Plot; kw...)
d = Dict(kw)
# TODO: add one series to the underlying package
# until we call it normally, do the hack
if d[:linetype] == :bar
d = barHack(;d...)
end
e = Dict()
e[:color] = d[:color]
# label # string or symbol, applies to that line, may go in a legend
e[:linewidth] = d[:width]
e[:kind] = winston_linestyle[d[:linestyle]]
e[:symbolkind] = winston_marker[d[:marker]]
# markercolor # same choices as `color`, or :match will set the color to be the same as `color`
e[:symbolsize] = d[:markersize] / 3
# fillto # fillto value for area plots
# size # (Int,Int), resize the enclosing window
# pos # (Int,Int), move the enclosing window to this position
# windowtitle # string or symbol, set the title of the enclosing windowtitle
# screen # Integer, move enclosing window to this screen number (for multiscreen desktops)
## lintype :line, :step, :stepinverted, :sticks, :dots, :none, :heatmap, :hexbin, :hist, :bar
if d[:linetype] == :none
Winston.add(plt.o, Winston.Points(d[:x], d[:y]; copy_remove(e, :kind)...))
elseif d[:linetype] == :line
Winston.add(plt.o, Winston.Curve(d[:x], d[:y]; e...))
# elseif d[:linetype] == :step
# fn = Winston.XXX
# elseif d[:linetype] == :stepinverted
# fn = Winston.XXX
elseif d[:linetype] == :sticks
Winston.add(plt.o, Winston.Stems(d[:x], d[:y]; e...))
# elseif d[:linetype] == :dots
# fn = Winston.XXX
# elseif d[:linetype] == :heatmap
# fn = Winston.XXX
# elseif d[:linetype] == :hexbin
# fn = Winston.XXX
elseif d[:linetype] == :hist
hst = hist(d[:y], d[:nbins])
Winston.add(plt.o, Winston.Histogram(hst...; copy_remove(e, :nbins)...))
# elseif d[:linetype] == :bar
# # fn = Winston.XXX
end
# marker
if d[:marker] != :none
Winston.add(plt.o, Winston.Points(d[:x], d[:y]; copy_remove(e, :kind)...))
end
# optionally add a regression line
d[:reg] && d[:linetype] != :hist && addRegressionLineWinston(d)
push!(plt.seriesargs, d)
plt
end
function Base.display(::WinstonPackage, plt::Plot)
Winston.display(plt.o)
end
# -------------------------------
function savepng(::WinstonPackage, plt::PlottingObject, fn::String; kw...)
f = open(fn, "w")
writemime(f, "image/png", plt.o)
close(f)
end
# -------------------------------
function buildSubplotObject!(::WinstonPackage, subplt::Subplot)
# TODO: build the underlying Subplot object. this is where you might layout the panes within a GUI window, for example
end
function Base.display(::WinstonPackage, subplt::Subplot)
# TODO: display/show the Subplot object
end

View File

@ -105,6 +105,19 @@ function sticksHack(; kw...)
end end
function regressionXY(x, y)
# regress
β, α = [x ones(length(x))] \ y
# make a line segment
regx = [minimum(x), maximum(x)]
regy = β * regx + α
regx, regy
end
# Some conversion functions # Some conversion functions
# note: I borrowed these conversion constants from Compose.jl's Measure # note: I borrowed these conversion constants from Compose.jl's Measure
const INCH_SCALAR = 25.4 const INCH_SCALAR = 25.4