gr support for mirror; switch Axis.sp for sps; fixes to inset sp setup and linking

This commit is contained in:
Thomas Breloff 2016-08-19 01:55:55 -04:00
parent 55a598b796
commit 76bb6bab96
8 changed files with 49 additions and 21 deletions

View File

@ -946,7 +946,7 @@ function Base.getindex(axis::Axis, k::Symbol)
v = axis.d[k]
if v == :match
if haskey(_match_map2, k)
axis.sp[_match_map2[k]]
axis.sps[1][_match_map2[k]]
else
axis[_match_map[k]]
end

View File

@ -29,7 +29,7 @@ function Axis(sp::Subplot, letter::Symbol, args...; kw...)
d[:discrete_values] = []
# update the defaults
update!(Axis(sp, d), args...; kw...)
update!(Axis([sp], d), args...; kw...)
end
function get_axis(sp::Subplot, letter::Symbol)
@ -341,9 +341,11 @@ end
function default_should_widen(axis::Axis)
should_widen = false
if axis[:scale] == :identity
for series in series_list(axis.sp)
if series.d[:seriestype] in (:scatter,) || series.d[:markershape] != :none
should_widen = true
for sp in axis.sps
for series in series_list(sp)
if series.d[:seriestype] in (:scatter,) || series.d[:markershape] != :none
should_widen = true
end
end
end
end

View File

@ -80,6 +80,15 @@ function _update_min_padding!(sp::Subplot)
toppad = sp[:top_margin] + title_padding(sp)
rightpad = sp[:right_margin]
bottompad = tick_padding(sp[:xaxis]) + sp[:bottom_margin] + guide_padding(sp[:xaxis])
# switch them?
if sp[:xaxis][:mirror]
bottompad, toppad = toppad, bottompad
end
if sp[:yaxis][:mirror]
leftpad, rightpad = rightpad, leftpad
end
# @show (leftpad, toppad, rightpad, bottompad)
sp.minpad = (leftpad, toppad, rightpad, bottompad)
end

View File

@ -587,22 +587,26 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas)
if !(xticks in (nothing, false))
# x labels
flip = sp[:yaxis][:flip]
gr_set_font(sp[:xaxis][:tickfont], valign = :top, color = sp[:xaxis][:foreground_color_axis])
mirror = sp[:xaxis][:mirror]
gr_set_font(sp[:xaxis][:tickfont], valign = (mirror ? :bottom : :top), color = sp[:xaxis][:foreground_color_axis])
for (cv, dv) in zip(xticks...)
xi, yi = GR.wctondc(cv, flip ? ymax : ymin)
# @show cv dv ymin xi yi
gr_text(xi, yi-0.01, string(dv))
# use xor ($) to get the right y coords
xi, yi = GR.wctondc(cv, (flip $ mirror) ? ymax : ymin)
# @show cv dv ymin xi yi flip mirror (flip $ mirror)
gr_text(xi, yi + (mirror ? 1 : -1) * 0.01, string(dv))
end
end
if !(yticks in (nothing, false))
# y labels
flip = sp[:xaxis][:flip]
gr_set_font(sp[:yaxis][:tickfont], halign = :right, color = sp[:yaxis][:foreground_color_axis])
mirror = sp[:yaxis][:mirror]
gr_set_font(sp[:yaxis][:tickfont], halign = (mirror ? :left : :right), color = sp[:yaxis][:foreground_color_axis])
for (cv, dv) in zip(yticks...)
xi, yi = GR.wctondc(flip ? xmax : xmin, cv)
# use xor ($) to get the right y coords
xi, yi = GR.wctondc((flip $ mirror) ? xmax : xmin, cv)
# @show cv dv xmin xi yi
gr_text(xi-0.01, yi, string(dv))
gr_text(xi + (mirror ? 1 : -1) * 0.01, yi, string(dv))
end
end

View File

@ -876,11 +876,13 @@ end
function py_compute_axis_minval(axis::Axis)
# compute the smallest absolute value for the log scale's linear threshold
minval = 1.0
sp = axis.sp
for series in series_list(axis.sp)
v = series.d[axis[:letter]]
if !isempty(v)
minval = min(minval, minimum(abs(v)))
sps = axis.sps
for sp in sps
for series in series_list(sp)
v = series.d[axis[:letter]]
if !isempty(v)
minval = min(minval, minimum(abs(v)))
end
end
end

View File

@ -648,14 +648,23 @@ end
# -------------------------------------------------------------------------
# make all reference the same axis extrema/values
# make all reference the same axis extrema/values.
# merge subplot lists.
function link_axes!(axes::Axis...)
a1 = axes[1]
for i=2:length(axes)
a2 = axes[i]
expand_extrema!(a1, extrema(a2))
for k in (:extrema, :discrete_values, :continuous_values, :discrete_map)
a2[k] = a1[k]
end
# make a2's subplot list refer to a1's and add any missing values
sps2 = a2.sps
for sp in sps2
sp in a1.sps || push!(a1.sps, sp)
end
a2.sps = a1.sps
end
end

View File

@ -242,10 +242,10 @@ function _plot_setup(plt::Plot, d::KW, kw_list::Vector{KW})
end
sp = Subplot(backend(), parent=parent)
sp.plt = plt
sp.attr[:relative_bbox] = bb
sp.attr[:subplot_index] = length(plt.subplots)
push!(plt.subplots, sp)
push!(plt.inset_subplots, sp)
sp.attr[:relative_bbox] = bb
sp.attr[:subplot_index] = length(plt.subplots)
end
end
plt[:inset_subplots] = nothing

View File

@ -34,11 +34,13 @@ type Subplot{T<:AbstractBackend} <: AbstractLayout
plt # the enclosing Plot object (can't give it a type because of no forward declarations)
end
Base.show(io::IO, sp::Subplot) = print(io, "Subplot{$(sp[:subplot_index])}")
# -----------------------------------------------------------
# simple wrapper around a KW so we can hold all attributes pertaining to the axis in one place
type Axis
sp::Subplot
sps::Vector{Subplot}
d::KW
end