From 3e66c6cce43f7ca2af6dc2253f0b815820d8f188 Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Sat, 16 Jun 2018 11:51:49 +0200 Subject: [PATCH 1/6] change DPI value back --- src/arg_desc.jl | 1 + src/args.jl | 1 + src/backends/gr.jl | 31 +++++++++++++------------------ src/backends/pyplot.jl | 6 +++--- src/output.jl | 6 +++++- 5 files changed, 23 insertions(+), 22 deletions(-) diff --git a/src/arg_desc.jl b/src/arg_desc.jl index a45ba315..d5a6436d 100644 --- a/src/arg_desc.jl +++ b/src/arg_desc.jl @@ -65,6 +65,7 @@ const _arg_desc = KW( :html_output_format => "Symbol. When writing html output, what is the format? `:png` and `:svg` are currently supported.", :inset_subplots => "nothing or vector of 2-tuple (parent,bbox). optionally pass a vector of (parent,bbox) tuples which are the parent layout and the relative bounding box of inset subplots", :dpi => "Number. Dots Per Inch of output figures", +:thickness_scaling => "Number. Scale for the thickness of all line elements like lines, borders, axes, grid lines, ... defaults to 1.", :display_type => "Symbol (`:auto`, `:gui`, or `:inline`). When supported, `display` will either open a GUI window or plot inline.", :extra_kwargs => "KW (Dict{Symbol,Any}). Pass a map of extra keyword args which may be specific to a backend.", :fontfamily => "String or Symbol. Default font family for title, legend entries, tick labels and guides", diff --git a/src/args.jl b/src/args.jl index c9800eb6..bd6670dc 100644 --- a/src/args.jl +++ b/src/args.jl @@ -301,6 +301,7 @@ const _plot_defaults = KW( :inset_subplots => nothing, # optionally pass a vector of (parent,bbox) tuples which are # the parent layout and the relative bounding box of inset subplots :dpi => DPI, # dots per inch for images, etc + :thickness_scaling => 1, :display_type => :auto, :extra_kwargs => KW(), ) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index ad235940..2ab5a633 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -383,7 +383,7 @@ end function gr_set_line(lw, style, c) #, a) GR.setlinetype(gr_linetype[style]) w, h = gr_plot_size - GR.setlinewidth(max(0, lw / ((w + h) * 0.001))) + GR.setlinewidth(_gr_dpi_factor[1] * max(0, lw / ((w + h) * 0.001))) gr_set_linecolor(c) #, a) end @@ -396,6 +396,7 @@ end # this stores the conversion from a font pointsize to "percentage of window height" (which is what GR uses) const _gr_point_mult = 0.0018 * ones(1) +const _gr_dpi_factor = ones(1) # set the font attributes... assumes _gr_point_mult has been populated already function gr_set_font(f::Font; halign = f.halign, valign = f.valign, @@ -550,25 +551,18 @@ function gr_display(plt::Plot, fmt="") # compute the viewport_canvas, normalized to the larger dimension viewport_canvas = Float64[0,1,0,1] w, h = plt[:size] - if !haskey(ENV, "PLOTS_TEST") - dpi_factor = plt[:dpi] / DPI - if fmt == "png" - dpi_factor *= 6 - end - else - dpi_factor = 1 - end + dpi_factor = plt[:dpi] / DPI * plt[:thickness_scaling] gr_plot_size[:] = [w, h] if w > h ratio = float(h) / w - msize = display_width_ratio * w * dpi_factor + msize = display_width_ratio * w GR.setwsviewport(0, msize, 0, msize * ratio) GR.setwswindow(0, 1, 0, ratio) viewport_canvas[3] *= ratio viewport_canvas[4] *= ratio else ratio = float(w) / h - msize = display_height_ratio * h * dpi_factor + msize = display_height_ratio * h GR.setwsviewport(0, msize * ratio, 0, msize) GR.setwswindow(0, ratio, 0, 1) viewport_canvas[1] *= ratio @@ -580,7 +574,8 @@ function gr_display(plt::Plot, fmt="") # update point mult px_per_pt = px / pt - _gr_point_mult[1] = 1.5 * px_per_pt / max(h,w) + _gr_point_mult[1] = 1.5 * dpi_factor * px_per_pt / max(h,w) + _gr_dpi_factor[1] = dpi_factor # subplots: for sp in plt.subplots @@ -638,13 +633,13 @@ function _update_min_padding!(sp::Subplot{GRBackend}) bottompad = 2mm + sp[:bottom_margin] # Add margin for title if sp[:title] != "" - toppad += 5mm + toppad += 5mm * _gr_dpi_factor[1] end # Add margin for x and y ticks xticks, yticks = axis_drawing_info(sp)[1:2] if !(xticks in (nothing, false, :none)) flip, mirror = gr_set_xticks_font(sp) - l = gr_get_ticks_size(xticks, 2) + l = _gr_dpi_factor[1] * gr_get_ticks_size(xticks, 2) if mirror toppad += 1mm + gr_plot_size[2] * l * px else @@ -653,7 +648,7 @@ function _update_min_padding!(sp::Subplot{GRBackend}) end if !(yticks in (nothing, false, :none)) flip, mirror = gr_set_yticks_font(sp) - l = gr_get_ticks_size(yticks, 1) + l = _gr_dpi_factor[1] * gr_get_ticks_size(yticks, 1) if mirror rightpad += 1mm + gr_plot_size[1] * l * px else @@ -662,11 +657,11 @@ function _update_min_padding!(sp::Subplot{GRBackend}) end # Add margin for x label if sp[:xaxis][:guide] != "" - bottompad += 4mm + bottompad += 4mm * _gr_dpi_factor[1] end # Add margin for y label if sp[:yaxis][:guide] != "" - leftpad += 4mm + leftpad += 4mm * _gr_dpi_factor[1] end sp.minpad = (leftpad, toppad, rightpad, bottompad) end @@ -769,7 +764,7 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) # draw the axes gr_set_font(tickfont(xaxis)) - GR.setlinewidth(1) + GR.setlinewidth(_gr_dpi_factor[1]) if is3d(sp) zmin, zmax = gr_lims(zaxis, true) diff --git a/src/backends/pyplot.jl b/src/backends/pyplot.jl index 0110d086..9b86b1dd 100644 --- a/src/backends/pyplot.jl +++ b/src/backends/pyplot.jl @@ -395,7 +395,7 @@ function py_bbox_title(ax) end function py_dpi_scale(plt::Plot{PyPlotBackend}, ptsz) - ptsz * plt[:dpi] / DPI + ptsz * plt[:thickness_scaling] end # --------------------------------------------------------------------------- @@ -955,7 +955,7 @@ function _before_layout_calcs(plt::Plot{PyPlotBackend}) w, h = plt[:size] fig = plt.o fig[:clear]() - dpi = plt[:dpi] + dpi = 100 * plt[:dpi] / DPI fig[:set_size_inches](w/dpi, h/dpi, forward = true) fig[set_facecolor_sym](py_color(plt[:background_color_outside])) fig[:set_dpi](dpi) @@ -1358,7 +1358,7 @@ for (mime, fmt) in _pyplot_mimeformats # figsize = map(px2inch, plt[:size]), facecolor = fig[:get_facecolor](), edgecolor = "none", - dpi = plt[:dpi] + dpi = 100 * plt[:dpi] / DPI ) end end diff --git a/src/output.jl b/src/output.jl index cebfe920..4d64f85d 100644 --- a/src/output.jl +++ b/src/output.jl @@ -324,13 +324,17 @@ end function Juno.render(pane::Juno.PlotPane, plt::Plot) # temporarily overwrite size to be Atom.plotsize sz = plt[:size] + dpi = plt[:dpi] jsize = Juno.plotsize() jsize[1] == 0 && (jsize[1] = 400) jsize[2] == 0 && (jsize[2] = 500) - plt[:size] = jsize + scale = minimum(jsize[i] / sz[i] for i in 1:2) + plt[:size] = (s * scale for s in sz) + plt[:dpi] *= scale Juno.render(pane, HTML(stringmime(MIME("text/html"), plt))) plt[:size] = sz + plt[:dpi] = dpi end # special handling for PlotlyJS function Juno.render(pane::Juno.PlotPane, plt::Plot{PlotlyJSBackend}) From 0f13551b6dd89e9a01709e2186b1a7327c3891df Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Sat, 16 Jun 2018 16:57:07 +0200 Subject: [PATCH 2/6] fix margins on gr --- src/backends/gr.jl | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index 2ab5a633..1a4400b5 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -543,6 +543,8 @@ end function gr_display(plt::Plot, fmt="") GR.clearws() + _gr_dpi_factor[1] = plt[:dpi] / DPI * plt[:thickness_scaling] + # collect some monitor/display sizes in meters and pixels display_width_meters, display_height_meters, display_width_px, display_height_px = GR.inqdspsize() display_width_ratio = display_width_meters / display_width_px @@ -551,7 +553,6 @@ function gr_display(plt::Plot, fmt="") # compute the viewport_canvas, normalized to the larger dimension viewport_canvas = Float64[0,1,0,1] w, h = plt[:size] - dpi_factor = plt[:dpi] / DPI * plt[:thickness_scaling] gr_plot_size[:] = [w, h] if w > h ratio = float(h) / w @@ -574,8 +575,7 @@ function gr_display(plt::Plot, fmt="") # update point mult px_per_pt = px / pt - _gr_point_mult[1] = 1.5 * dpi_factor * px_per_pt / max(h,w) - _gr_dpi_factor[1] = dpi_factor + _gr_point_mult[1] = 1.5 * _gr_dpi_factor[1] * px_per_pt / max(h,w) # subplots: for sp in plt.subplots @@ -621,6 +621,7 @@ function gr_get_ticks_size(ticks, i) end function _update_min_padding!(sp::Subplot{GRBackend}) + dpi = sp.plt[:thickness_scaling] * sp.plt[:dpi] / Plots.DPI if !haskey(ENV, "GKSwstype") if isijulia() || (isdefined(Main, :Juno) && Juno.isactive()) ENV["GKSwstype"] = "svg" @@ -633,13 +634,13 @@ function _update_min_padding!(sp::Subplot{GRBackend}) bottompad = 2mm + sp[:bottom_margin] # Add margin for title if sp[:title] != "" - toppad += 5mm * _gr_dpi_factor[1] + toppad += 5mm end # Add margin for x and y ticks xticks, yticks = axis_drawing_info(sp)[1:2] if !(xticks in (nothing, false, :none)) flip, mirror = gr_set_xticks_font(sp) - l = _gr_dpi_factor[1] * gr_get_ticks_size(xticks, 2) + l = gr_get_ticks_size(xticks, 2) if mirror toppad += 1mm + gr_plot_size[2] * l * px else @@ -648,7 +649,7 @@ function _update_min_padding!(sp::Subplot{GRBackend}) end if !(yticks in (nothing, false, :none)) flip, mirror = gr_set_yticks_font(sp) - l = _gr_dpi_factor[1] * gr_get_ticks_size(yticks, 1) + l = gr_get_ticks_size(yticks, 1) if mirror rightpad += 1mm + gr_plot_size[1] * l * px else @@ -657,13 +658,13 @@ function _update_min_padding!(sp::Subplot{GRBackend}) end # Add margin for x label if sp[:xaxis][:guide] != "" - bottompad += 4mm * _gr_dpi_factor[1] + bottompad += 4mm end # Add margin for y label if sp[:yaxis][:guide] != "" - leftpad += 4mm * _gr_dpi_factor[1] + leftpad += 4mm end - sp.minpad = (leftpad, toppad, rightpad, bottompad) + sp.minpad = Tuple(dpi * pad for pad in (leftpad, toppad, rightpad, bottompad)) end function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) @@ -764,7 +765,7 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) # draw the axes gr_set_font(tickfont(xaxis)) - GR.setlinewidth(_gr_dpi_factor[1]) + GR.setlinewidth(sp.plt[:thickness_scaling] * sp.plt[:dpi] / Plots.DPI) if is3d(sp) zmin, zmax = gr_lims(zaxis, true) From 84ec8d61aed1de5c1e80e812be6d0548c1657b92 Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Sat, 16 Jun 2018 17:14:19 +0200 Subject: [PATCH 3/6] fix thickness_scaling in pyplot --- src/backends/pyplot.jl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/backends/pyplot.jl b/src/backends/pyplot.jl index 9b86b1dd..c6341549 100644 --- a/src/backends/pyplot.jl +++ b/src/backends/pyplot.jl @@ -395,7 +395,7 @@ function py_bbox_title(ax) end function py_dpi_scale(plt::Plot{PyPlotBackend}, ptsz) - ptsz * plt[:thickness_scaling] + ptsz end # --------------------------------------------------------------------------- @@ -955,7 +955,7 @@ function _before_layout_calcs(plt::Plot{PyPlotBackend}) w, h = plt[:size] fig = plt.o fig[:clear]() - dpi = 100 * plt[:dpi] / DPI + dpi = 100 * plt[:thickness_scaling] * plt[:dpi] / DPI fig[:set_size_inches](w/dpi, h/dpi, forward = true) fig[set_facecolor_sym](py_color(plt[:background_color_outside])) fig[:set_dpi](dpi) @@ -1358,7 +1358,7 @@ for (mime, fmt) in _pyplot_mimeformats # figsize = map(px2inch, plt[:size]), facecolor = fig[:get_facecolor](), edgecolor = "none", - dpi = 100 * plt[:dpi] / DPI + dpi = 100 * plt[:thickness_scaling] * plt[:dpi] / DPI ) end end From 4847752ef45757839eb0eb826299a0eb8eaf6db1 Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Sat, 16 Jun 2018 19:24:58 +0200 Subject: [PATCH 4/6] make dpi change plot size --- src/backends/gr.jl | 15 ++++++++------- src/backends/pyplot.jl | 14 ++++++++------ src/output.jl | 5 ++++- 3 files changed, 20 insertions(+), 14 deletions(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index 1a4400b5..74a3dd62 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -543,7 +543,8 @@ end function gr_display(plt::Plot, fmt="") GR.clearws() - _gr_dpi_factor[1] = plt[:dpi] / DPI * plt[:thickness_scaling] + _gr_dpi_factor[1] = plt[:thickness_scaling] + dpi_factor = plt[:dpi] ./ Plots.DPI # collect some monitor/display sizes in meters and pixels display_width_meters, display_height_meters, display_width_px, display_height_px = GR.inqdspsize() @@ -556,14 +557,14 @@ function gr_display(plt::Plot, fmt="") gr_plot_size[:] = [w, h] if w > h ratio = float(h) / w - msize = display_width_ratio * w + msize = display_width_ratio * w * dpi_factor GR.setwsviewport(0, msize, 0, msize * ratio) GR.setwswindow(0, 1, 0, ratio) viewport_canvas[3] *= ratio viewport_canvas[4] *= ratio else ratio = float(w) / h - msize = display_height_ratio * h + msize = display_height_ratio * h * dpi_factor GR.setwsviewport(0, msize * ratio, 0, msize) GR.setwswindow(0, ratio, 0, 1) viewport_canvas[1] *= ratio @@ -621,14 +622,14 @@ function gr_get_ticks_size(ticks, i) end function _update_min_padding!(sp::Subplot{GRBackend}) - dpi = sp.plt[:thickness_scaling] * sp.plt[:dpi] / Plots.DPI + dpi = sp.plt[:thickness_scaling] if !haskey(ENV, "GKSwstype") if isijulia() || (isdefined(Main, :Juno) && Juno.isactive()) ENV["GKSwstype"] = "svg" end end # Add margin given by the user - leftpad = 2mm + sp[:left_margin] + leftpad = 4mm + sp[:left_margin] toppad = 2mm + sp[:top_margin] rightpad = 4mm + sp[:right_margin] bottompad = 2mm + sp[:bottom_margin] @@ -664,7 +665,7 @@ function _update_min_padding!(sp::Subplot{GRBackend}) if sp[:yaxis][:guide] != "" leftpad += 4mm end - sp.minpad = Tuple(dpi * pad for pad in (leftpad, toppad, rightpad, bottompad)) + sp.minpad = Tuple(dpi * [leftpad, toppad, rightpad, bottompad]) end function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) @@ -765,7 +766,7 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) # draw the axes gr_set_font(tickfont(xaxis)) - GR.setlinewidth(sp.plt[:thickness_scaling] * sp.plt[:dpi] / Plots.DPI) + GR.setlinewidth(sp.plt[:thickness_scaling]) if is3d(sp) zmin, zmax = gr_lims(zaxis, true) diff --git a/src/backends/pyplot.jl b/src/backends/pyplot.jl index c6341549..5d3e5a23 100644 --- a/src/backends/pyplot.jl +++ b/src/backends/pyplot.jl @@ -402,7 +402,7 @@ end # Create the window/figure for this backend. function _create_backend_figure(plt::Plot{PyPlotBackend}) - w,h = map(px2inch, plt[:size]) + w,h = map(px2inch, Tuple(s * plt[:dpi] / Plots.DPI for s in plt[:size])) # # reuse the current figure? fig = if plt[:overwrite_figure] @@ -955,10 +955,10 @@ function _before_layout_calcs(plt::Plot{PyPlotBackend}) w, h = plt[:size] fig = plt.o fig[:clear]() - dpi = 100 * plt[:thickness_scaling] * plt[:dpi] / DPI - fig[:set_size_inches](w/dpi, h/dpi, forward = true) + dpi = plt[:thickness_scaling] * plt[:dpi] + fig[:set_size_inches](w/DPI/plt[:thickness_scaling], h/DPI/plt[:thickness_scaling], forward = true) fig[set_facecolor_sym](py_color(plt[:background_color_outside])) - fig[:set_dpi](dpi) + fig[:set_dpi](plt[:dpi]) # resize the window PyPlot.plt[:get_current_fig_manager]()[:resize](w, h) @@ -1209,7 +1209,9 @@ function _update_min_padding!(sp::Subplot{PyPlotBackend}) rightpad += sp[:right_margin] bottompad += sp[:bottom_margin] - sp.minpad = (leftpad, toppad, rightpad, bottompad) + dpi_factor = sp.plt[:thickness_scaling] * Plots.DPI / sp.plt[:dpi] + + sp.minpad = Tuple(dpi_factor .* [leftpad, toppad, rightpad, bottompad]) end @@ -1358,7 +1360,7 @@ for (mime, fmt) in _pyplot_mimeformats # figsize = map(px2inch, plt[:size]), facecolor = fig[:get_facecolor](), edgecolor = "none", - dpi = 100 * plt[:thickness_scaling] * plt[:dpi] / DPI + dpi = plt[:dpi] * plt[:thickness_scaling] ) end end diff --git a/src/output.jl b/src/output.jl index 4d64f85d..0e17894f 100644 --- a/src/output.jl +++ b/src/output.jl @@ -325,16 +325,19 @@ end # temporarily overwrite size to be Atom.plotsize sz = plt[:size] dpi = plt[:dpi] + thickness_scaling = plt[:thickness_scaling] jsize = Juno.plotsize() jsize[1] == 0 && (jsize[1] = 400) jsize[2] == 0 && (jsize[2] = 500) scale = minimum(jsize[i] / sz[i] for i in 1:2) plt[:size] = (s * scale for s in sz) - plt[:dpi] *= scale + plt[:dpi] = 100 + plt[:thickness_scaling] *= scale Juno.render(pane, HTML(stringmime(MIME("text/html"), plt))) plt[:size] = sz plt[:dpi] = dpi + plt[:thickness_scaling] = thickness_scaling end # special handling for PlotlyJS function Juno.render(pane::Juno.PlotPane, plt::Plot{PlotlyJSBackend}) From 5ebcb77d0d17f30d73fdb9824ce507b1f0e4926f Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Sat, 16 Jun 2018 19:29:28 +0200 Subject: [PATCH 5/6] rename _gr_dpi_scale to _gr_thickness_scaling --- src/backends/gr.jl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index 74a3dd62..e6246e46 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -383,7 +383,7 @@ end function gr_set_line(lw, style, c) #, a) GR.setlinetype(gr_linetype[style]) w, h = gr_plot_size - GR.setlinewidth(_gr_dpi_factor[1] * max(0, lw / ((w + h) * 0.001))) + GR.setlinewidth(_gr_thickness_scaling[1] * max(0, lw / ((w + h) * 0.001))) gr_set_linecolor(c) #, a) end @@ -396,7 +396,7 @@ end # this stores the conversion from a font pointsize to "percentage of window height" (which is what GR uses) const _gr_point_mult = 0.0018 * ones(1) -const _gr_dpi_factor = ones(1) +const _gr_thickness_scaling = ones(1) # set the font attributes... assumes _gr_point_mult has been populated already function gr_set_font(f::Font; halign = f.halign, valign = f.valign, @@ -543,7 +543,7 @@ end function gr_display(plt::Plot, fmt="") GR.clearws() - _gr_dpi_factor[1] = plt[:thickness_scaling] + _gr_thickness_scaling[1] = plt[:thickness_scaling] dpi_factor = plt[:dpi] ./ Plots.DPI # collect some monitor/display sizes in meters and pixels @@ -576,7 +576,7 @@ function gr_display(plt::Plot, fmt="") # update point mult px_per_pt = px / pt - _gr_point_mult[1] = 1.5 * _gr_dpi_factor[1] * px_per_pt / max(h,w) + _gr_point_mult[1] = 1.5 * _gr_thickness_scaling[1] * px_per_pt / max(h,w) # subplots: for sp in plt.subplots From 76f2860c74d7c469893c168a026c895c94833884 Mon Sep 17 00:00:00 2001 From: Daniel Schwabeneder Date: Sat, 16 Jun 2018 20:38:46 +0200 Subject: [PATCH 6/6] fix gr --- src/backends/gr.jl | 2 +- src/output.jl | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backends/gr.jl b/src/backends/gr.jl index e6246e46..b12dd1c4 100644 --- a/src/backends/gr.jl +++ b/src/backends/gr.jl @@ -544,7 +544,7 @@ function gr_display(plt::Plot, fmt="") GR.clearws() _gr_thickness_scaling[1] = plt[:thickness_scaling] - dpi_factor = plt[:dpi] ./ Plots.DPI + dpi_factor = plt[:dpi] / Plots.DPI # collect some monitor/display sizes in meters and pixels display_width_meters, display_height_meters, display_width_px, display_height_px = GR.inqdspsize() diff --git a/src/output.jl b/src/output.jl index 0e17894f..1f9da687 100644 --- a/src/output.jl +++ b/src/output.jl @@ -332,7 +332,7 @@ end scale = minimum(jsize[i] / sz[i] for i in 1:2) plt[:size] = (s * scale for s in sz) - plt[:dpi] = 100 + plt[:dpi] = Plots.DPI plt[:thickness_scaling] *= scale Juno.render(pane, HTML(stringmime(MIME("text/html"), plt))) plt[:size] = sz