From 2a74f556c8c0d477a38999975f144f224b9c555d Mon Sep 17 00:00:00 2001 From: t-bltg Date: Fri, 25 Jun 2021 01:56:54 +0200 Subject: [PATCH] fix axis flip in 3D plots --- src/backends/gr.jl | 51 ++++++++++++++++++++++++++++++---------------- 1 file changed, 34 insertions(+), 17 deletions(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index acfc1829..f43e791c 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -1282,12 +1282,22 @@ function gr_set_window(sp, viewport_plotarea) gr_set_viewport_polar(viewport_plotarea) else xmin, xmax, ymin, ymax = gr_xy_axislims(sp) + is3d = RecipesPipeline.is3d(sp) + if is3d + zmin, zmax = gr_z_axislims(sp) + zok = zmax > zmin + else + zok = true + end + scaleop = 0 - if xmax > xmin && ymax > ymin - sp[:xaxis][:scale] == :log10 && (scaleop |= GR.OPTION_X_LOG) - sp[:yaxis][:scale] == :log10 && (scaleop |= GR.OPTION_Y_LOG) - sp[:xaxis][:flip] && (scaleop |= GR.OPTION_FLIP_X) - sp[:yaxis][:flip] && (scaleop |= GR.OPTION_FLIP_Y) + if xmax > xmin && ymax > ymin && zok + sp[:xaxis][:scale] == :log10 && (scaleop |= GR.OPTION_X_LOG) + sp[:yaxis][:scale] == :log10 && (scaleop |= GR.OPTION_Y_LOG) + is3d && sp[:zaxis][:scale] == :log10 && (scaleop |= GR.OPTION_Z_LOG) + sp[:xaxis][:flip] && (scaleop |= GR.OPTION_FLIP_X) + sp[:yaxis][:flip] && (scaleop |= GR.OPTION_FLIP_Y) + is3d && sp[:zaxis][:flip] && (scaleop |= GR.OPTION_FLIP_Z) # NOTE: setwindow sets the "data coordinate" limits of the current "viewport" GR.setwindow(xmin, xmax, ymin, ymax) GR.setscale(scaleop) @@ -1310,7 +1320,7 @@ function gr_draw_axes(sp, viewport_plotarea) if RecipesPipeline.is3d(sp) # set space xmin, xmax, ymin, ymax = gr_xy_axislims(sp) - zmin, zmax = axis_limits(sp, :z) + zmin, zmax = gr_z_axislims(sp) GR.setspace(zmin, zmax, round.(Int, sp[:camera])...) # fill the plot area @@ -1322,7 +1332,7 @@ function gr_draw_axes(sp, viewport_plotarea) GR.fillarea(x_bg, y_bg) for letter in (:x, :y, :z) - gr_draw_axis_3d(sp, letter) + gr_draw_axis_3d(sp, letter, viewport_plotarea) end elseif ispolar(sp) r = gr_set_viewport_polar(viewport_plotarea) @@ -1352,7 +1362,7 @@ function gr_draw_axis(sp, letter, viewport_plotarea) gr_label_axis(sp, letter, viewport_plotarea) end -function gr_draw_axis_3d(sp, letter) +function gr_draw_axis_3d(sp, letter, viewport_plotarea) ax = axis_drawing_info_3d(sp, letter) axis = sp[Symbol(letter, :axis)] @@ -1364,8 +1374,10 @@ function gr_draw_axis_3d(sp, letter) gr_draw_ticks(sp, axis, ax.tick_segments, gr_polyline3d) # labels + GR.setscale(0) gr_label_ticks_3d(sp, letter, ax.ticks) gr_label_axis_3d(sp, letter) + gr_set_window(sp, viewport_plotarea) end function gr_draw_grid(sp, axis, segments, func = gr_polyline) @@ -1440,13 +1452,14 @@ function gr_label_ticks(sp, letter, ticks) oamin, oamax = axis_limits(sp, oletter) gr_set_tickfont(sp, letter) out_factor = ifelse(axis[:tick_direction] === :out, 1.5, 1) - x_offset = isy ? (axis[:mirror] ? 1 : -1) * 1.5e-2 * out_factor : 0 - y_offset = isy ? 0 : (axis[:mirror] ? 1 : -1) * 8e-3 * out_factor + x_offset = isy ? -1.5e-2 * out_factor : 0 + y_offset = isy ? 0 : -8e-3 * out_factor ov = sp[:framestyle] == :origin ? 0 : xor(oaxis[:flip], axis[:mirror]) ? oamax : oamin + sgn = axis[:mirror] ? -1 : 1 for (cv, dv) in zip(ticks...) x, y = GR.wctondc(reverse_if((cv, ov), isy)...) - gr_text(x + x_offset, y + y_offset, dv) + gr_text(x + sgn * x_offset, y + sgn * y_offset, dv) end end @@ -1478,8 +1491,8 @@ function gr_label_ticks_3d(sp, letter, ticks) xax, yax, zax = getindex.(Ref(sp), asyms) gr_set_tickfont(sp, letter) - nt = sp[:framestyle] == :origin ? 0 : xor(ax[:mirror], nax[:flip]) ? n1 : n0 - ft = sp[:framestyle] == :origin ? 0 : xor(ax[:mirror], fax[:flip]) ? famax : famin + nt = sp[:framestyle] == :origin ? 0 : ax[:mirror] ? n1 : n0 + ft = sp[:framestyle] == :origin ? 0 : ax[:mirror] ? famax : famin xoffset = if letter === :x (sp[:yaxis][:mirror] ? 1 : -1) * 1e-2 * (sp[:xaxis][:tick_direction] == :out ? 1.5 : 1) @@ -1496,7 +1509,10 @@ function gr_label_ticks_3d(sp, letter, ticks) 0 end - for (cv, dv) in zip(ticks...) + cvs, dvs = ticks + ax[:flip] && reverse!(cvs) + + for (cv, dv) in zip((cvs, dvs)...) xi, yi = gr_w3tondc(sort_3d_axes(cv, nt, ft, letter)...) gr_text(xi + xoffset, yi + yoffset, dv) end @@ -1565,8 +1581,8 @@ function gr_label_axis_3d(sp, letter) # color = ax[:guidefontcolor], ) ag = (amin + amax) / 2 - ng = xor(ax[:mirror], nax[:flip]) ? n1 : n0 - fg = xor(ax[:mirror], fax[:flip]) ? famax : famin + ng = ax[:mirror] ? n1 : n0 + fg = ax[:mirror] ? famax : famin x, y = gr_w3tondc(sort_3d_axes(ag, ng, fg, letter)...) if letter in (:x, :y) h = gr_axis_height(sp, ax) @@ -1577,7 +1593,8 @@ function gr_label_axis_3d(sp, letter) y_offset = 0 end letter === :z && GR.setcharup(-1, 0) - gr_text(x + x_offset, y + y_offset, ax[:guide]) + sgn = ax[:mirror] ? -1 : 1 + gr_text(x + sgn * x_offset, y + sgn * y_offset, ax[:guide]) GR.restorestate() end end