working on background color; hexbin/heatmap; started test_plottypes

This commit is contained in:
Thomas Breloff 2015-09-09 23:18:05 -04:00
parent 88a4b5cd12
commit 8ff438763b
5 changed files with 101 additions and 50 deletions

View File

@ -42,6 +42,12 @@ type Plot
n::Int # number of series n::Int # number of series
end end
Base.string(plt::Plot) = "Plot{$(plt.plotter) n=$(plt.n)}"
Base.print(io::IO, plt::Plot) = print(io, string(plt))
Base.show(io::IO, plt::Plot) = print(io, string(plt))
# ---------------------------------------------------------
type CurrentPlot type CurrentPlot
nullableplot::Nullable{Plot} nullableplot::Nullable{Plot}

View File

@ -7,7 +7,7 @@ const NUMCOLORS = length(COLORS)
# these are valid choices... first one is default value if unset # these are valid choices... first one is default value if unset
const LINE_AXES = (:left, :right) const LINE_AXES = (:left, :right)
const LINE_TYPES = (:line, :step, :stepinverted, :sticks, :dots, :none, :heatmap, :hist, :bar) const LINE_TYPES = (:line, :step, :stepinverted, :sticks, :dots, :none, :heatmap, :hexbin, :hist, :bar)
const LINE_STYLES = (:solid, :dash, :dot, :dashdot, :dashdotdot) const LINE_STYLES = (:solid, :dash, :dot, :dashdot, :dashdotdot)
const LINE_MARKERS = (:none, :ellipse, :rect, :diamond, :utriangle, :dtriangle, :cross, :xcross, :star1, :star2, :hexagon) const LINE_MARKERS = (:none, :ellipse, :rect, :diamond, :utriangle, :dtriangle, :cross, :xcross, :star1, :star2, :hexagon)
@ -27,6 +27,7 @@ PLOT_DEFAULTS[:markercolor] = :match
PLOT_DEFAULTS[:markersize] = 10 PLOT_DEFAULTS[:markersize] = 10
PLOT_DEFAULTS[:heatmap_n] = 100 PLOT_DEFAULTS[:heatmap_n] = 100
PLOT_DEFAULTS[:heatmap_c] = (0.15, 0.5) PLOT_DEFAULTS[:heatmap_c] = (0.15, 0.5)
PLOT_DEFAULTS[:fillto] = nothing # fills in the area
# plot globals # plot globals
PLOT_DEFAULTS[:title] = "" PLOT_DEFAULTS[:title] = ""
@ -34,7 +35,7 @@ PLOT_DEFAULTS[:xlabel] = ""
PLOT_DEFAULTS[:ylabel] = "" PLOT_DEFAULTS[:ylabel] = ""
PLOT_DEFAULTS[:yrightlabel] = "" PLOT_DEFAULTS[:yrightlabel] = ""
PLOT_DEFAULTS[:legend] = true PLOT_DEFAULTS[:legend] = true
PLOT_DEFAULTS[:background_color] = :white # PLOT_DEFAULTS[:background_color] = nothing
PLOT_DEFAULTS[:xticks] = true PLOT_DEFAULTS[:xticks] = true
PLOT_DEFAULTS[:yticks] = true PLOT_DEFAULTS[:yticks] = true
@ -56,11 +57,11 @@ autocolor(idx::Integer) = COLORS[mod1(idx,NUMCOLORS)]
# converts a symbol or string into a colorant (Colors.RGB), and assigns a color automatically # converts a symbol or string into a colorant (Colors.RGB), and assigns a color automatically
# note: if plt is nothing, we aren't doing anything with the color anyways # note: if plt is nothing, we aren't doing anything with the color anyways
function getRGBColor(c, plt) function getRGBColor(c, n::Int = 0)
# auto-assign a color based on plot index # auto-assign a color based on plot index
if c == :auto if c == :auto && n > 0
c = autocolor(plt.n) c = autocolor(n)
end end
# convert it from a symbol/string # convert it from a symbol/string
@ -83,6 +84,14 @@ function getPlotKeywordArgs(kw, i::Int, plt = nothing)
d = Dict(kw) d = Dict(kw)
outd = Dict() outd = Dict()
# default to a white background, but only on the initial call (so we don't change the background automatically)
if haskey(d, :background_color)
outd[:background_color] = getRGBColor(d[:background_color])
elseif plt == nothing
d[:background_color] = colorant"white"
end
# fill in outd with either 1) plural value, 2) value, 3) default
for k in keys(PLOT_DEFAULTS) for k in keys(PLOT_DEFAULTS)
plural = makeplural(k) plural = makeplural(k)
if haskey(d, plural) if haskey(d, plural)
@ -94,26 +103,17 @@ function getPlotKeywordArgs(kw, i::Int, plt = nothing)
end end
end end
# once the plot is created, we can get line/marker colors
if plt != nothing if plt != nothing
# update color # update color
outd[:color] = getRGBColor(outd[:color], plt) outd[:color] = getRGBColor(outd[:color], plt.n)
# update markercolor # update markercolor
mc = outd[:markercolor] mc = outd[:markercolor]
mc = (mc == :match ? outd[:color] : getRGBColor(mc, plt)) mc = (mc == :match ? outd[:color] : getRGBColor(mc, plt.n))
outd[:markercolor] = mc outd[:markercolor] = mc
end end
# # auto assign a color
# if plt != nothing
# if outd[:color] == :auto
# outd[:color] = autocolor(plt.n)
# end
# if outd[:markercolor] == :auto
# outd[:markercolor] = outd[:color]
# end
# end
outd outd
end end

View File

@ -7,56 +7,67 @@ immutable GadflyPackage <: PlottingPackage end
# create a blank Gadfly.Plot object # create a blank Gadfly.Plot object
function plot(pkg::GadflyPackage; kw...) function plot(pkg::GadflyPackage; kw...)
@eval import DataFrames @eval import DataFrames
plt = Gadfly.Plot() plt = Gadfly.Plot()
plt.mapping = Dict() plt.mapping = Dict()
plt.data_source = DataFrames.DataFrame() plt.data_source = DataFrames.DataFrame()
plt.layers = plt.layers[1:0] plt.layers = plt.layers[1:0]
# add the title, axis labels, and theme
d = Dict(kw)
plt.guides = Gadfly.GuideElement[Gadfly.Guide.xlabel(d[:xlabel]), Gadfly.Guide.ylabel(d[:ylabel]), Gadfly.Guide.title(d[:title])]
plt.theme = Gadfly.Theme(background_color = (haskey(d, :background_color) ? d[:background_color] : colorant"white"))
# key_position = (d[:legend] ? :bottom : :none))
Plot(plt, pkg, 0) Plot(plt, pkg, 0)
end end
function getGeoms(linetype::Symbol, marker::Symbol, heatmap_n::Int)
geoms = []
# note: currently only accepts lines and dots if linetype in (:heatmap,:hexbin)
function getGeomLine(linetype::Symbol) push!(geoms, Gadfly.Geom.hexbin(xbincount=heatmap_n, ybincount=heatmap_n))
linetype == :line && return [Gadfly.Geom.line] else
linetype == :dots && return [Gadfly.Geom.point] if linetype == :line
push!(geoms, Gadfly.Geom.line)
elseif linetype == :dots || marker != :none
push!(geoms, Gadfly.Geom.point)
elseif linetype != :dots
error("linetype $linetype not currently supported with Gadfly") error("linetype $linetype not currently supported with Gadfly")
end
end
end end
# note: currently map any marker to point # # note: currently only accepts lines and dots
function getGeomPoint(marker::Symbol) # function getGeomLine(linetype::Symbol, heatmap_n::Int)
marker == :none && return [] # linetype == :line && return [Gadfly.Geom.line]
[Gadfly.Geom.point] # linetype == :dots && return [Gadfly.Geom.point]
end # linetype in (:heatmap, :hexbin) && return [Gadfly.Geom.hexbin(xbincount=heatmap_n, ybincount=heatmap_n)]
# error("linetype $linetype not currently supported with Gadfly")
# end
# # note: currently map any marker to point
# function getGeomPoint(linetype::Syombol, marker::Symbol)
# if marker == :none || linetype in (:heatmap, :hexbin)
# return []
# end
# [Gadfly.Geom.point]
# end
# plot one data series # plot one data series
function plot!(::GadflyPackage, plt::Plot; kw...) function plot!(::GadflyPackage, plt::Plot; kw...)
d = Dict(kw) d = Dict(kw)
gfargs = [] gfargs = []
# append!(gfargs, getGeomLine(d[:linetype], d[:heatmap_n]))
# append!(gfargs, getGeomPoint(d[:marker]))
append!(gfargs, getGeoms(d[:linetype], d[:marker], d[:heatmap_n]))
append!(gfargs, getGeomLine(d[:linetype])) theme = Gadfly.Theme(default_color = d[:color],
append!(gfargs, getGeomPoint(d[:marker])) line_width = d[:width] * Gadfly.px,
default_point_size = d[:markersize] * Gadfly.px)
push!(gfargs, theme)
# todo:
# linestyle
# label
# # color
# c = d[:color]
# if isa(c, Symbol)
# c = string(c)
# end
# if isa(c, String)
# c = parse(Colorant, c)
# end
# @assert isa(c, RGB)
push!(gfargs, Gadfly.Theme(default_color = d[:color]))
# legend
# guides (x/y labels, title, background, ticks)
append!(plt.o.layers, Gadfly.layer(unique(gfargs)...; x = d[:x], y = d[:y])) append!(plt.o.layers, Gadfly.layer(unique(gfargs)...; x = d[:x], y = d[:y]))
plt plt
end end

View File

@ -3,9 +3,30 @@
immutable QwtPackage <: PlottingPackage end immutable QwtPackage <: PlottingPackage end
plot(pkg::QwtPackage; kw...) = Plot(Qwt.plot(zeros(0,0); kw...), pkg, 0) function adjustQwtKeywords(; kw...)
d = Dict(kw)
if d[:linetype] == :hexbin
d[:linetype] = :heatmap
end
d
end
function plot(pkg::QwtPackage; kw...)
kw = adjustQwtKeywords(;kw...)
plt = Plot(Qwt.plot(zeros(0,0); kw..., show=false), pkg, 0)
# d = Dict(kw)
# if haskey(d, :background_color)
# Qwt.background!(plt.o, Dict(kw)[:background_color])
# end
plt
end
function plot!(::QwtPackage, plt::Plot; kw...) function plot!(::QwtPackage, plt::Plot; kw...)
kw = adjustQwtKeywords(;kw...)
# d = Dict(kw)
# if haskey(d, :background_color)
# Qwt.background!(plt.o, Dict(kw)[:background_color])
# end
Qwt.oplot(plt.o; kw...) Qwt.oplot(plt.o; kw...)
end end

13
test/test_plottypes.jl Normal file
View File

@ -0,0 +1,13 @@
function testplot_line1()
plot(rand(100,3))
end
function testplot_fn1()
plot(0:0.01:4π, [sin,cos])
end
function testplot_guides1()
plot(rand(10); title="TITLE", xlabel="XLABEL", ylabel="YLABEL", background_color=:red)
end