Merge pull request #1083 from daschw/gr-marker_z
Fix GR marker_z and clims (fix #1063)
This commit is contained in:
commit
da5a538f89
@ -264,17 +264,18 @@ function gr_fill_viewport(vp::AVec{Float64}, c)
|
|||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
normalize_zvals(zv::Void) = zv
|
normalize_zvals(args...) = nothing
|
||||||
function normalize_zvals(zv::AVec)
|
function normalize_zvals(zv::AVec, clims::NTuple{2, <:Real})
|
||||||
vmin, vmax = ignorenan_extrema(zv)
|
vmin, vmax = ignorenan_extrema(zv)
|
||||||
|
isfinite(clims[1]) && (vmin = clims[1])
|
||||||
|
isfinite(clims[2]) && (vmax = clims[2])
|
||||||
if vmin == vmax
|
if vmin == vmax
|
||||||
zeros(length(zv))
|
zeros(length(zv))
|
||||||
else
|
else
|
||||||
(zv - vmin) ./ (vmax - vmin)
|
clamp.((zv - vmin) ./ (vmax - vmin), 0, 1)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
gr_alpha(α::Void) = 1
|
gr_alpha(α::Void) = 1
|
||||||
gr_alpha(α::Real) = α
|
gr_alpha(α::Real) = α
|
||||||
|
|
||||||
@ -335,14 +336,14 @@ function gr_draw_markers(series::Series, x, y, msize, mz)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function gr_draw_markers(series::Series, x, y)
|
function gr_draw_markers(series::Series, x, y, clims)
|
||||||
isempty(x) && return
|
isempty(x) && return
|
||||||
mz = normalize_zvals(series[:marker_z])
|
mz = normalize_zvals(series[:marker_z], clims)
|
||||||
GR.setfillintstyle(GR.INTSTYLE_SOLID)
|
GR.setfillintstyle(GR.INTSTYLE_SOLID)
|
||||||
gr_draw_markers(series, x, y, series[:markersize], mz)
|
gr_draw_markers(series, x, y, series[:markersize], mz)
|
||||||
if mz != nothing
|
if mz != nothing
|
||||||
GR.setscale(0)
|
GR.setscale(0)
|
||||||
gr_colorbar(series[:subplot])
|
gr_colorbar(series[:subplot], clims)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -453,6 +454,20 @@ function gr_colorbar(sp::Subplot)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function gr_colorbar(sp::Subplot, clims)
|
||||||
|
if sp[:colorbar] != :none
|
||||||
|
xmin, xmax = gr_xy_axislims(sp)[1:2]
|
||||||
|
gr_set_viewport_cmap(sp)
|
||||||
|
l = zeros(Int32, 1, 256)
|
||||||
|
l[1,:] = Int[round(Int, _i) for _i in linspace(1000, 1255, 256)]
|
||||||
|
GR.setwindow(xmin, xmax, clims[1], clims[2])
|
||||||
|
GR.cellarray(xmin, xmax, clims[2], clims[1], 1, length(l), l)
|
||||||
|
ztick = 0.5 * GR.tick(clims[1], clims[2])
|
||||||
|
GR.axes(0, ztick, xmax, clims[1], 0, 1, 0.005)
|
||||||
|
gr_set_viewport_plotarea()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
gr_view_xcenter() = 0.5 * (viewport_plotarea[1] + viewport_plotarea[2])
|
gr_view_xcenter() = 0.5 * (viewport_plotarea[1] + viewport_plotarea[2])
|
||||||
gr_view_ycenter() = 0.5 * (viewport_plotarea[3] + viewport_plotarea[4])
|
gr_view_ycenter() = 0.5 * (viewport_plotarea[3] + viewport_plotarea[4])
|
||||||
|
|
||||||
@ -877,6 +892,9 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas)
|
|||||||
# this needs to be here to point the colormap to the right indices
|
# this needs to be here to point the colormap to the right indices
|
||||||
GR.setcolormap(1000 + GR.COLORMAP_COOLWARM)
|
GR.setcolormap(1000 + GR.COLORMAP_COOLWARM)
|
||||||
|
|
||||||
|
# calculate the colorbar limits once for a subplot
|
||||||
|
clims = get_clims(sp)
|
||||||
|
|
||||||
for (idx, series) in enumerate(series_list(sp))
|
for (idx, series) in enumerate(series_list(sp))
|
||||||
st = series[:seriestype]
|
st = series[:seriestype]
|
||||||
|
|
||||||
@ -947,16 +965,11 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas)
|
|||||||
zmin, zmax = extrema(series[:marker_z])
|
zmin, zmax = extrema(series[:marker_z])
|
||||||
GR.setspace(zmin, zmax, 0, 90)
|
GR.setspace(zmin, zmax, 0, 90)
|
||||||
end
|
end
|
||||||
gr_draw_markers(series, x, y)
|
gr_draw_markers(series, x, y, clims)
|
||||||
end
|
end
|
||||||
|
|
||||||
elseif st == :contour
|
elseif st == :contour
|
||||||
zmin, zmax = gr_lims(zaxis, false)
|
zmin, zmax = clims
|
||||||
clims = sp[:clims]
|
|
||||||
if is_2tuple(clims)
|
|
||||||
isfinite(clims[1]) && (zmin = clims[1])
|
|
||||||
isfinite(clims[2]) && (zmax = clims[2])
|
|
||||||
end
|
|
||||||
GR.setspace(zmin, zmax, 0, 90)
|
GR.setspace(zmin, zmax, 0, 90)
|
||||||
if typeof(series[:levels]) <: Array
|
if typeof(series[:levels]) <: Array
|
||||||
h = series[:levels]
|
h = series[:levels]
|
||||||
@ -995,12 +1008,7 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas)
|
|||||||
|
|
||||||
elseif st == :heatmap
|
elseif st == :heatmap
|
||||||
xmin, xmax, ymin, ymax = xy_lims
|
xmin, xmax, ymin, ymax = xy_lims
|
||||||
zmin, zmax = gr_lims(zaxis, true)
|
zmin, zmax = clims
|
||||||
clims = sp[:clims]
|
|
||||||
if is_2tuple(clims)
|
|
||||||
isfinite(clims[1]) && (zmin = clims[1])
|
|
||||||
isfinite(clims[2]) && (zmax = clims[2])
|
|
||||||
end
|
|
||||||
GR.setspace(zmin, zmax, 0, 90)
|
GR.setspace(zmin, zmax, 0, 90)
|
||||||
grad = isa(series[:fillcolor], ColorGradient) ? series[:fillcolor] : cgrad()
|
grad = isa(series[:fillcolor], ColorGradient) ? series[:fillcolor] : cgrad()
|
||||||
colors = [grad[clamp((zi-zmin) / (zmax-zmin), 0, 1)] for zi=z]
|
colors = [grad[clamp((zi-zmin) / (zmax-zmin), 0, 1)] for zi=z]
|
||||||
@ -1010,7 +1018,7 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas)
|
|||||||
round(Int, red(c) * 255) ), colors)
|
round(Int, red(c) * 255) ), colors)
|
||||||
w, h = length(x), length(y)
|
w, h = length(x), length(y)
|
||||||
GR.drawimage(xmin, xmax, ymax, ymin, w, h, rgba)
|
GR.drawimage(xmin, xmax, ymax, ymin, w, h, rgba)
|
||||||
cmap && gr_colorbar(sp)
|
cmap && gr_colorbar(sp, clims)
|
||||||
|
|
||||||
elseif st in (:path3d, :scatter3d)
|
elseif st in (:path3d, :scatter3d)
|
||||||
# draw path
|
# draw path
|
||||||
@ -1024,7 +1032,7 @@ function gr_display(sp::Subplot{GRBackend}, w, h, viewport_canvas)
|
|||||||
# draw markers
|
# draw markers
|
||||||
if st == :scatter3d || series[:markershape] != :none
|
if st == :scatter3d || series[:markershape] != :none
|
||||||
x2, y2 = unzip(map(GR.wc3towc, x, y, z))
|
x2, y2 = unzip(map(GR.wc3towc, x, y, z))
|
||||||
gr_draw_markers(series, x2, y2)
|
gr_draw_markers(series, x2, y2, clims)
|
||||||
end
|
end
|
||||||
|
|
||||||
# TODO: replace with pie recipe
|
# TODO: replace with pie recipe
|
||||||
|
|||||||
22
src/utils.jl
22
src/utils.jl
@ -539,6 +539,28 @@ xlims(sp_idx::Int = 1) = xlims(current(), sp_idx)
|
|||||||
ylims(sp_idx::Int = 1) = ylims(current(), sp_idx)
|
ylims(sp_idx::Int = 1) = ylims(current(), sp_idx)
|
||||||
zlims(sp_idx::Int = 1) = zlims(current(), sp_idx)
|
zlims(sp_idx::Int = 1) = zlims(current(), sp_idx)
|
||||||
|
|
||||||
|
|
||||||
|
function get_clims(sp::Subplot)
|
||||||
|
zmin, zmax = Inf, -Inf
|
||||||
|
for series in series_list(sp)
|
||||||
|
for vals in (series[:z], series[:line_z], series[:marker_z])
|
||||||
|
if (typeof(vals) <: AbstractSurface) && (eltype(vals.surf) <: Real)
|
||||||
|
zmin, zmax = _update_clims(zmin, zmax, ignorenan_extrema(vals.surf)...)
|
||||||
|
elseif (vals != nothing) && (eltype(vals) <: Real)
|
||||||
|
zmin, zmax = _update_clims(zmin, zmax, ignorenan_extrema(vals)...)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
clims = sp[:clims]
|
||||||
|
if is_2tuple(clims)
|
||||||
|
isfinite(clims[1]) && (zmin = clims[1])
|
||||||
|
isfinite(clims[2]) && (zmax = clims[2])
|
||||||
|
end
|
||||||
|
return zmin < zmax ? (zmin, zmax) : (0.0, 0.0)
|
||||||
|
end
|
||||||
|
|
||||||
|
_update_clims(zmin, zmax, emin, emax) = min(zmin, emin), max(zmax, emax)
|
||||||
|
|
||||||
# ---------------------------------------------------------------
|
# ---------------------------------------------------------------
|
||||||
|
|
||||||
makekw(; kw...) = KW(kw)
|
makekw(; kw...) = KW(kw)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user