make dpi change plot size

This commit is contained in:
Daniel Schwabeneder 2018-06-16 19:24:58 +02:00
parent 84ec8d61ae
commit 4847752ef4
3 changed files with 20 additions and 14 deletions

View File

@ -543,7 +543,8 @@ end
function gr_display(plt::Plot, fmt="") function gr_display(plt::Plot, fmt="")
GR.clearws() 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 # 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_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] gr_plot_size[:] = [w, h]
if w > h if w > h
ratio = float(h) / w ratio = float(h) / w
msize = display_width_ratio * w msize = display_width_ratio * w * dpi_factor
GR.setwsviewport(0, msize, 0, msize * ratio) GR.setwsviewport(0, msize, 0, msize * ratio)
GR.setwswindow(0, 1, 0, ratio) GR.setwswindow(0, 1, 0, ratio)
viewport_canvas[3] *= ratio viewport_canvas[3] *= ratio
viewport_canvas[4] *= ratio viewport_canvas[4] *= ratio
else else
ratio = float(w) / h ratio = float(w) / h
msize = display_height_ratio * h msize = display_height_ratio * h * dpi_factor
GR.setwsviewport(0, msize * ratio, 0, msize) GR.setwsviewport(0, msize * ratio, 0, msize)
GR.setwswindow(0, ratio, 0, 1) GR.setwswindow(0, ratio, 0, 1)
viewport_canvas[1] *= ratio viewport_canvas[1] *= ratio
@ -621,14 +622,14 @@ function gr_get_ticks_size(ticks, i)
end end
function _update_min_padding!(sp::Subplot{GRBackend}) 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 !haskey(ENV, "GKSwstype")
if isijulia() || (isdefined(Main, :Juno) && Juno.isactive()) if isijulia() || (isdefined(Main, :Juno) && Juno.isactive())
ENV["GKSwstype"] = "svg" ENV["GKSwstype"] = "svg"
end end
end end
# Add margin given by the user # Add margin given by the user
leftpad = 2mm + sp[:left_margin] leftpad = 4mm + sp[:left_margin]
toppad = 2mm + sp[:top_margin] toppad = 2mm + sp[:top_margin]
rightpad = 4mm + sp[:right_margin] rightpad = 4mm + sp[:right_margin]
bottompad = 2mm + sp[:bottom_margin] bottompad = 2mm + sp[:bottom_margin]
@ -664,7 +665,7 @@ function _update_min_padding!(sp::Subplot{GRBackend})
if sp[:yaxis][:guide] != "" if sp[:yaxis][:guide] != ""
leftpad += 4mm leftpad += 4mm
end end
sp.minpad = Tuple(dpi * pad for pad in (leftpad, toppad, rightpad, bottompad)) sp.minpad = Tuple(dpi * [leftpad, toppad, rightpad, bottompad])
end end
function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas) 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 # draw the axes
gr_set_font(tickfont(xaxis)) 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) if is3d(sp)
zmin, zmax = gr_lims(zaxis, true) zmin, zmax = gr_lims(zaxis, true)

View File

@ -402,7 +402,7 @@ end
# Create the window/figure for this backend. # Create the window/figure for this backend.
function _create_backend_figure(plt::Plot{PyPlotBackend}) 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? # # reuse the current figure?
fig = if plt[:overwrite_figure] fig = if plt[:overwrite_figure]
@ -955,10 +955,10 @@ function _before_layout_calcs(plt::Plot{PyPlotBackend})
w, h = plt[:size] w, h = plt[:size]
fig = plt.o fig = plt.o
fig[:clear]() fig[:clear]()
dpi = 100 * plt[:thickness_scaling] * plt[:dpi] / DPI dpi = plt[:thickness_scaling] * plt[:dpi]
fig[:set_size_inches](w/dpi, h/dpi, forward = true) 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_facecolor_sym](py_color(plt[:background_color_outside]))
fig[:set_dpi](dpi) fig[:set_dpi](plt[:dpi])
# resize the window # resize the window
PyPlot.plt[:get_current_fig_manager]()[:resize](w, h) PyPlot.plt[:get_current_fig_manager]()[:resize](w, h)
@ -1209,7 +1209,9 @@ function _update_min_padding!(sp::Subplot{PyPlotBackend})
rightpad += sp[:right_margin] rightpad += sp[:right_margin]
bottompad += sp[:bottom_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 end
@ -1358,7 +1360,7 @@ for (mime, fmt) in _pyplot_mimeformats
# figsize = map(px2inch, plt[:size]), # figsize = map(px2inch, plt[:size]),
facecolor = fig[:get_facecolor](), facecolor = fig[:get_facecolor](),
edgecolor = "none", edgecolor = "none",
dpi = 100 * plt[:thickness_scaling] * plt[:dpi] / DPI dpi = plt[:dpi] * plt[:thickness_scaling]
) )
end end
end end

View File

@ -325,16 +325,19 @@ end
# temporarily overwrite size to be Atom.plotsize # temporarily overwrite size to be Atom.plotsize
sz = plt[:size] sz = plt[:size]
dpi = plt[:dpi] dpi = plt[:dpi]
thickness_scaling = plt[:thickness_scaling]
jsize = Juno.plotsize() jsize = Juno.plotsize()
jsize[1] == 0 && (jsize[1] = 400) jsize[1] == 0 && (jsize[1] = 400)
jsize[2] == 0 && (jsize[2] = 500) jsize[2] == 0 && (jsize[2] = 500)
scale = minimum(jsize[i] / sz[i] for i in 1:2) scale = minimum(jsize[i] / sz[i] for i in 1:2)
plt[:size] = (s * scale for s in sz) 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))) Juno.render(pane, HTML(stringmime(MIME("text/html"), plt)))
plt[:size] = sz plt[:size] = sz
plt[:dpi] = dpi plt[:dpi] = dpi
plt[:thickness_scaling] = thickness_scaling
end end
# special handling for PlotlyJS # special handling for PlotlyJS
function Juno.render(pane::Juno.PlotPane, plt::Plot{PlotlyJSBackend}) function Juno.render(pane::Juno.PlotPane, plt::Plot{PlotlyJSBackend})