diff --git a/docs/example_generation.jl b/docs/example_generation.jl index 44795ec3..e2aa9df5 100644 --- a/docs/example_generation.jl +++ b/docs/example_generation.jl @@ -167,6 +167,23 @@ const examples = PlotExample[ m=(Shape(verts),30,RGBA(0,0,0,0.2)), bg=:pink, fg=:darkblue, xlim = (0,1), ylim=(0,1), leg=false)) + ]), + + PlotExample("Contours", + "", + [ + :(x = 1:0.3:20), + :(y = x), + :(f(x,y) = sin(x)+cos(y)), + :(contour(x, y, f, fill=true)) + ]), + + PlotExample("Pie", + "", + [ + :(x = ["Nerds", "Hackers", "Scientists"]), + :(y = [0.4, 0.35, 0.25]), + :(pie(x, y, title="The Julia Community", l=0.5)) ]) ] diff --git a/src/Plots.jl b/src/Plots.jl index 6b2d3bd7..9483d2d6 100644 --- a/src/Plots.jl +++ b/src/Plots.jl @@ -49,6 +49,12 @@ export vline!, ohlc, ohlc!, + pie, + pie!, + contour, + contour!, + surface, + surface!, title!, xlabel!, @@ -152,6 +158,12 @@ vline(args...; kw...) = plot(args...; kw..., linetype = :vline) vline!(args...; kw...) = plot!(args...; kw..., linetype = :vline) ohlc(args...; kw...) = plot(args...; kw..., linetype = :ohlc) ohlc!(args...; kw...) = plot!(args...; kw..., linetype = :ohlc) +pie(args...; kw...) = plot(args...; kw..., linetype = :pie) +pie!(args...; kw...) = plot!(args...; kw..., linetype = :pie) +contour(args...; kw...) = plot(args...; kw..., linetype = :contour) +contour!(args...; kw...) = plot!(args...; kw..., linetype = :contour) +surface(args...; kw...) = plot(args...; kw..., linetype = :surface) +surface!(args...; kw...) = plot!(args...; kw..., linetype = :surface) title!(s::@compat(AbstractString); kw...) = plot!(; title = s, kw...) diff --git a/src/args.jl b/src/args.jl index 979361ae..fd04bc96 100644 --- a/src/args.jl +++ b/src/args.jl @@ -10,7 +10,8 @@ const _allAxes = [:auto, :left, :right] const _3dTypes = [:path3d, :scatter3d] const _allTypes = vcat([ :none, :line, :path, :steppre, :steppost, :sticks, :scatter, - :heatmap, :hexbin, :hist, :density, :bar, :hline, :vline, :ohlc, :contour + :heatmap, :hexbin, :hist, :density, :bar, :hline, :vline, :ohlc, + :contour, :pie ], _3dTypes) @compat const _typeAliases = Dict( :n => :none, diff --git a/src/backends/plotly.jl b/src/backends/plotly.jl index ae243f42..48bb03f0 100644 --- a/src/backends/plotly.jl +++ b/src/backends/plotly.jl @@ -82,7 +82,7 @@ function plotlyfont(font::Font) Dict( :family => font.family, :size => font.pointsize, - :color => font.color, + :color => webcolor(font.color), ) end @@ -105,7 +105,8 @@ function get_plot_html(plt::Plot{PlotlyPackage}) d_out[:title] = d[:title] d_out[:titlefont] = plotlyfont(d[:guidefont]) d_out[:width], d_out[:height] = d[:size] - d_out[:margin] = Dict(:l=>20, :b=>20, :r=>10, :t=>10) + # d_out[:margin] = Dict(:l=>20, :b=>20, :r=>10, :t=>10) + d_out[:margin] = Dict(:t=>20) d_out[:paper_bgcolor] = bgcolor d_out[:plot_bgcolor] = bgcolor @@ -179,6 +180,11 @@ end # :scatter, :heatmap, :hexbin, :hist, :density, :bar, # :hline, :vline, :contour, :path3d, :scatter3d] +function plotly_colorscale(grad::ColorGradient) + [[grad.values[i], webcolor(grad.colors[i])] for i in 1:length(grad.colors)] +end +plotly_colorscale(c) = plotly_colorscale(ColorGradient(:bluesreds)) + # get a dictionary representing the series params (d is the Plots-dict, d_out is the Plotly-dict) function get_series_html(d::Dict) d_out = Dict() @@ -219,6 +225,12 @@ function get_series_html(d::Dict) d_out[:ncontours] = d[:nlevels] d_out[:contours] = Dict(:coloring => d[:fillrange] != nothing ? "fill" : "lines") # TODO: colorscale: [[0, 'rgb(166,206,227)'], [0.25, 'rgb(31,120,180)'], [0.45, 'rgb(178,223,138)'], [0.65, 'rgb(51,160,44)'], [0.85, 'rgb(251,154,153)'], [1, 'rgb(227,26,28)']] + d_out[:colorscale] = plotly_colorscale(d[:linecolor]) + elseif lt == :pie + d_out[:type] = "pie" + d_out[:labels] = x + d_out[:values] = y + d_out[:hoverinfo] = "label+percent+name" else error("Plotly: linetype $lt isn't supported.") end diff --git a/src/backends/pyplot.jl b/src/backends/pyplot.jl index 81a4d93c..15cc094a 100644 --- a/src/backends/pyplot.jl +++ b/src/backends/pyplot.jl @@ -376,29 +376,30 @@ function Base.getindex(plt::Plot{PyPlotPackage}, i::Integer) # mapping[:x], mapping[:y] end -function Base.setindex!(plt::Plot{PyPlotPackage}, xy::Tuple, i::Integer) +function Base.setindex!{X,Y}(plt::Plot{PyPlotPackage}, xy::Tuple{X,Y}, i::Integer) series = plt.seriesargs[i][:serieshandle] + x, y = xy try - series[:set_data](xy...) + series[:set_data](x, y) catch - series[:set_offsets](hcat(xy...)) + series[:set_offsets](hcat(x, y)) end ax = series[:axes] if plt.plotargs[:xlims] == :auto xmin, xmax = ax[:get_xlim]() - ax[:set_xlim](min(xmin, minimum(xy[1])), max(xmax, maximum(xy[1]))) + ax[:set_xlim](min(xmin, minimum(x)), max(xmax, maximum(x))) end if plt.plotargs[:ylims] == :auto ymin, ymax = ax[:get_ylim]() - ax[:set_ylim](min(ymin, minimum(xy[2])), max(ymax, maximum(xy[2]))) + ax[:set_ylim](min(ymin, minimum(y)), max(ymax, maximum(y))) end - # getLeftAxis(plt)[:relim]() - # getRightAxis(plt)[:relim]() - # for mapping in getGadflyMappings(plt, i) - # mapping[:x], mapping[:y] = xy - # end + plt +end + +function Base.setindex!{X,Y,Z}(plt::Plot{PyPlotPackage}, xyz::Tuple{X,Y,Z}, i::Integer) + warn("setindex not implemented for xyz") plt end diff --git a/src/backends/supported.jl b/src/backends/supported.jl index 5e11bdb1..10a8de25 100644 --- a/src/backends/supported.jl +++ b/src/backends/supported.jl @@ -5,6 +5,7 @@ supportedStyles(::PlottingPackage) = [:solid] supportedMarkers(::PlottingPackage) = [:none] supportedScales(::PlottingPackage) = [:identity] subplotSupported(::PlottingPackage) = false +stringsSupported(::PlottingPackage) = false supportedAxes() = supportedAxes(backend()) supportedTypes() = supportedTypes(backend()) @@ -12,6 +13,7 @@ supportedStyles() = supportedStyles(backend()) supportedMarkers() = supportedMarkers(backend()) supportedScales() = supportedScales(backend()) subplotSupported() = subplotSupported(backend()) +stringsSupported() = stringsSupported(backend()) # -------------------------------------------------------------------------------------- @@ -428,7 +430,7 @@ supportedArgs(::PlotlyPackage) = [ # :axis, :background_color, :color_palette, - # :fillrange, + :fillrange, # :fillcolor, # :fillalpha, :foreground_color, @@ -471,19 +473,18 @@ supportedArgs(::PlotlyPackage) = [ :yscale, # :xflip, # :yflip, - # :z, + :z, :tickfont, :guidefont, :legendfont, :grid, - # :surface, - # :nlevels, + :nlevels, ] supportedAxes(::PlotlyPackage) = [:auto, :left] -supportedTypes(::PlotlyPackage) = [:none, :path, :scatter] #,:steppre, :steppost, :sticks, :heatmap, :hexbin, :hist, :bar, :hline, :vline, :contour] +supportedTypes(::PlotlyPackage) = [:none, :path, :scatter, :heatmap, :hist, :bar, :contour, :pie] #,:steppre, :steppost, :sticks, :heatmap, :hexbin, :hist, :bar, :hline, :vline, :contour] supportedStyles(::PlotlyPackage) = [:auto, :solid] #, :dash, :dot, :dashdot, :dashdotdot] supportedMarkers(::PlotlyPackage) = [:none, :auto, :ellipse] #, :rect, :diamond, :utriangle, :dtriangle, :cross, :xcross, :star5] #vcat(_allMarkers, Shape) supportedScales(::PlotlyPackage) = [:identity, :log] #, :log, :log2, :log10, :asinh, :sqrt] subplotSupported(::PlotlyPackage) = false - +stringsSupported(::PlotlyPackage) = true diff --git a/src/backends/web.jl b/src/backends/web.jl index a123c2b4..f0a39f93 100644 --- a/src/backends/web.jl +++ b/src/backends/web.jl @@ -28,7 +28,7 @@ end function standalone_html_window(plt::PlottingObject; kw...) html = standalone_html(plt; kw...) - println(html) + # println(html) filename = string(tempname(), ".html") output = open(filename, "w") write(output, html) diff --git a/src/colors.jl b/src/colors.jl index 2de46a89..0799e4a7 100644 --- a/src/colors.jl +++ b/src/colors.jl @@ -328,7 +328,10 @@ end make255(x) = round(Int, 255 * x) -function webcolor(c::Colorant) +function webcolor(c::Color) + @sprintf("rgb(%d, %d, %d)", [make255(f(c)) for f in [red,green,blue]]...) +end +function webcolor(c::TransparentColor) @sprintf("rgba(%d, %d, %d, %1.3f)", [make255(f(c)) for f in [red,green,blue]]..., alpha(c)) end webcolor(cs::ColorScheme) = webcolor(getColor(cs)) diff --git a/src/plot.jl b/src/plot.jl index b3d92330..5f392639 100644 --- a/src/plot.jl +++ b/src/plot.jl @@ -101,8 +101,10 @@ function plot!(plt::Plot, args...; kw...) for (i,di) in enumerate(seriesArgList) plt.n += 1 - setTicksFromStringVector(d, di, :x, :xticks) - setTicksFromStringVector(d, di, :y, :yticks) + if !stringsSupported() + setTicksFromStringVector(d, di, :x, :xticks) + setTicksFromStringVector(d, di, :y, :yticks) + end # remove plot args for k in keys(_plotDefaults) @@ -238,6 +240,9 @@ convertToAnyVector(s::Surface; kw...) = Any[s], nothing # vector of OHLC convertToAnyVector(v::AVec{OHLC}; kw...) = Any[v], nothing +# dates +convertToAnyVector{D<:Union{Date,DateTime}}(dts::AVec{D}; kw...) = Any[dts], nothing + # list of things (maybe other vectors, functions, or something else) function convertToAnyVector(v::AVec; kw...) if all(x -> typeof(x) <: Real, v) diff --git a/src/plotter.jl b/src/plotter.jl index ebbb1f7f..a5c22aec 100644 --- a/src/plotter.jl +++ b/src/plotter.jl @@ -240,7 +240,12 @@ function backend() try # @eval include(joinpath(Pkg.dir("Plots"), "src", "backends", "web.jl")) # @eval include(joinpath(Pkg.dir("Plots"), "src", "backends", "plotly.jl")) - @eval import JSON + @eval begin + import JSON + JSON._print(io::IO, state::JSON.State, dt::Union{Date,DateTime}) = print(io, '"', dt, '"') + # JSON.json(dt::Union{Date,DateTime}) = string(dt) + # JSON.json{D<:Union{Date,DateTime}}(dts::AVec{D}) = map(string, dts) + end catch err warn("Couldn't setup Plotly") rethrow(err)