pyplot colorbar fixes (#2722)
* pyplot colorbar fixes * pyplot colorbar fixes * pyplot: sligtly reworked colorbars * pyplot 3d color bar fixes * pyplot 3d color bar fixes
This commit is contained in:
parent
8859518f2d
commit
7bbb2070a7
@ -583,6 +583,7 @@ add_aliases(:fill_z, :fillz, :fz, :surfacecolor, :surfacecolour, :sc, :surfcolor
|
|||||||
add_aliases(:legend, :leg, :key)
|
add_aliases(:legend, :leg, :key)
|
||||||
add_aliases(:legendtitle, :legend_title, :labeltitle, :label_title, :leg_title, :key_title)
|
add_aliases(:legendtitle, :legend_title, :labeltitle, :label_title, :leg_title, :key_title)
|
||||||
add_aliases(:colorbar, :cb, :cbar, :colorkey)
|
add_aliases(:colorbar, :cb, :cbar, :colorkey)
|
||||||
|
add_aliases(:colorbar_title, :colorbartitle, :cb_title, :cbtitle, :cbartitle, :cbar_title, :colorkeytitle, :colorkey_title)
|
||||||
add_aliases(:clims, :clim, :cbarlims, :cbar_lims, :climits, :color_limits)
|
add_aliases(:clims, :clim, :cbarlims, :cbar_lims, :climits, :color_limits)
|
||||||
add_aliases(:smooth, :regression, :reg)
|
add_aliases(:smooth, :regression, :reg)
|
||||||
add_aliases(:levels, :nlevels, :nlev, :levs)
|
add_aliases(:levels, :nlevels, :nlev, :levs)
|
||||||
|
|||||||
@ -13,6 +13,7 @@ append!(Base.Multimedia.displays, otherdisplays)
|
|||||||
pycolors = PyPlot.pyimport("matplotlib.colors")
|
pycolors = PyPlot.pyimport("matplotlib.colors")
|
||||||
pypath = PyPlot.pyimport("matplotlib.path")
|
pypath = PyPlot.pyimport("matplotlib.path")
|
||||||
mplot3d = PyPlot.pyimport("mpl_toolkits.mplot3d")
|
mplot3d = PyPlot.pyimport("mpl_toolkits.mplot3d")
|
||||||
|
axes_grid1 = PyPlot.pyimport("mpl_toolkits.axes_grid1")
|
||||||
pypatches = PyPlot.pyimport("matplotlib.patches")
|
pypatches = PyPlot.pyimport("matplotlib.patches")
|
||||||
pyfont = PyPlot.pyimport("matplotlib.font_manager")
|
pyfont = PyPlot.pyimport("matplotlib.font_manager")
|
||||||
pyticker = PyPlot.pyimport("matplotlib.ticker")
|
pyticker = PyPlot.pyimport("matplotlib.ticker")
|
||||||
@ -1003,12 +1004,27 @@ function _before_layout_calcs(plt::Plot{PyPlotBackend})
|
|||||||
end
|
end
|
||||||
kw[:spacing] = "proportional"
|
kw[:spacing] = "proportional"
|
||||||
|
|
||||||
# create and store the colorbar object (handle) and the axis that it is drawn on.
|
|
||||||
# note: the colorbar axis is positioned independently from the subplot axis
|
|
||||||
fig = plt.o
|
fig = plt.o
|
||||||
cbax = fig."add_axes"([0.8,0.1,0.03,0.8], label = string(gensym()))
|
|
||||||
cb = fig."colorbar"(handle; cax = cbax, kw...)
|
if RecipesPipeline.is3d(sp)
|
||||||
|
cbax = fig."add_axes"([0.9, 0.1, 0.03, 0.8])
|
||||||
|
cb = fig."colorbar"(handle; cax=cbax, kw...)
|
||||||
|
else
|
||||||
|
# divider approach works only with 2d plots
|
||||||
|
divider = axes_grid1.make_axes_locatable(ax)
|
||||||
|
# width = axes_grid1.axes_size.AxesY(ax, aspect=1.0 / 3.5)
|
||||||
|
# pad = axes_grid1.axes_size.Fraction(0.5, width) # Colorbar is spaced 0.5 of its size away from the ax
|
||||||
|
# cbax = divider.append_axes("right", size=width, pad=pad) # This approach does not work well in subplots
|
||||||
|
cbax = divider.append_axes("right", size="5%", pad="2.5%") # Reasonable value works most of the usecases
|
||||||
|
cb = fig."colorbar"(handle; cax=cbax, kw...)
|
||||||
|
end
|
||||||
|
|
||||||
cb."set_label"(sp[:colorbar_title],size=py_thickness_scale(plt, sp[:yaxis][:guidefontsize]),family=sp[:yaxis][:guidefontfamily], color = py_color(sp[:yaxis][:guidefontcolor]))
|
cb."set_label"(sp[:colorbar_title],size=py_thickness_scale(plt, sp[:yaxis][:guidefontsize]),family=sp[:yaxis][:guidefontfamily], color = py_color(sp[:yaxis][:guidefontcolor]))
|
||||||
|
|
||||||
|
# cb."formatter".set_useOffset(false) # This for some reason does not work, must be a pyplot bug, instead this is a workaround:
|
||||||
|
cb."formatter".set_powerlimits((-Inf, Inf))
|
||||||
|
cb."update_ticks"()
|
||||||
|
|
||||||
for lab in cb."ax"."yaxis"."get_ticklabels"()
|
for lab in cb."ax"."yaxis"."get_ticklabels"()
|
||||||
lab."set_fontsize"(py_thickness_scale(plt, sp[:yaxis][:tickfontsize]))
|
lab."set_fontsize"(py_thickness_scale(plt, sp[:yaxis][:tickfontsize]))
|
||||||
lab."set_family"(sp[:yaxis][:tickfontfamily])
|
lab."set_family"(sp[:yaxis][:tickfontfamily])
|
||||||
@ -1220,7 +1236,7 @@ function _update_min_padding!(sp::Subplot{PyPlotBackend})
|
|||||||
# optionally add the width of colorbar labels and colorbar to rightpad
|
# optionally add the width of colorbar labels and colorbar to rightpad
|
||||||
if haskey(sp.attr, :cbar_ax)
|
if haskey(sp.attr, :cbar_ax)
|
||||||
bb = py_bbox(sp.attr[:cbar_handle]."ax"."get_yticklabels"())
|
bb = py_bbox(sp.attr[:cbar_handle]."ax"."get_yticklabels"())
|
||||||
sp.attr[:cbar_width] = _cbar_width + width(bb) + 2.3mm + (sp[:colorbar_title] == "" ? 0px : 30px)
|
sp.attr[:cbar_width] = _cbar_width + width(bb) + (sp[:colorbar_title] == "" ? 0px : 30px)
|
||||||
rightpad = rightpad + sp.attr[:cbar_width]
|
rightpad = rightpad + sp.attr[:cbar_width]
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -1381,13 +1397,10 @@ function _update_plot_object(plt::Plot{PyPlotBackend})
|
|||||||
pcts = bbox_to_pcts(sp.plotarea, figw, figh)
|
pcts = bbox_to_pcts(sp.plotarea, figw, figh)
|
||||||
ax."set_position"(pcts)
|
ax."set_position"(pcts)
|
||||||
|
|
||||||
# set the cbar position if there is one
|
if haskey(sp.attr, :cbar_ax) && RecipesPipeline.is3d(sp) # 2D plots are completely handled by axis dividers
|
||||||
if haskey(sp.attr, :cbar_ax)
|
|
||||||
cbw = sp.attr[:cbar_width]
|
cbw = sp.attr[:cbar_width]
|
||||||
# this is the bounding box of just the colors of the colorbar (not labels)
|
# this is the bounding box of just the colors of the colorbar (not labels)
|
||||||
ex = sp[:zaxis][:extrema]
|
cb_bbox = BoundingBox(right(sp.bbox)-cbw - 2mm, top(sp.bbox) + 2mm, _cbar_width-1mm, height(sp.bbox) - 4mm)
|
||||||
has_toplabel = !(1e-7 < max(abs(ex.emax), abs(ex.emin)) < 1e7)
|
|
||||||
cb_bbox = BoundingBox(right(sp.bbox)-cbw+1mm, top(sp.bbox) + (has_toplabel ? 4mm : 2mm), _cbar_width-1mm, height(sp.bbox) - (has_toplabel ? 6mm : 4mm))
|
|
||||||
pcts = bbox_to_pcts(cb_bbox, figw, figh)
|
pcts = bbox_to_pcts(cb_bbox, figw, figh)
|
||||||
sp.attr[:cbar_ax]."set_position"(pcts)
|
sp.attr[:cbar_ax]."set_position"(pcts)
|
||||||
end
|
end
|
||||||
|
|||||||
@ -988,7 +988,7 @@ px2inch(px::Real) = float(px / PX_PER_INCH)
|
|||||||
inch2mm(inches::Real) = float(inches * MM_PER_INCH)
|
inch2mm(inches::Real) = float(inches * MM_PER_INCH)
|
||||||
mm2inch(mm::Real) = float(mm / MM_PER_INCH)
|
mm2inch(mm::Real) = float(mm / MM_PER_INCH)
|
||||||
px2mm(px::Real) = float(px * MM_PER_PX)
|
px2mm(px::Real) = float(px * MM_PER_PX)
|
||||||
mm2px(mm::Real) = float(px / MM_PER_PX)
|
mm2px(mm::Real) = float(mm / MM_PER_PX)
|
||||||
|
|
||||||
|
|
||||||
"Smallest x in plot"
|
"Smallest x in plot"
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user