DKRZ NCL example scatter plot with two attached histograms#
Example script:
;----------------------------------------------------------------------
; Procedure add_labelbar: attach a vertical labelbar to the right
; side of the plot
;----------------------------------------------------------------------
undef("add_histogram")
function add_histogram(wks, plot, data, levels, orient)
local vph, vpw, w, h
begin
print("----> add_histogramm - "+orient)
getvalues plot ;-- retrieve viewport width and height
"vpWidthF" : vpw
"vpHeightF" : vph
end getvalues
if(orient .eq."horizontal") then
w = vpw
h = 0.2*vph
else
h = vpw
w = 0.2*vph
end if
;-- set resources
hres = True
hres@gsnDraw = False
hres@gsnFrame = False
hres@vpWidthF = w
hres@vpHeightF = h
if(orient .eq. "vertical") then
hres@gsnHistogramHorizontal = True ;-- draw horizontal histogram
hres@tmXMajorGrid = True
hres@tmXMajorGridLineColor = "gray50"
hres@tmXMajorGridLineDashPattern = 2
hres@trXMinF = 0.0
hres@trXMaxF = 12.0
else
hres@tmYMajorGrid = True
hres@tmYMajorGridLineColor = "gray50"
hres@tmYMajorGridLineDashPattern = 2
hres@trYMinF = 0.0
hres@trYMaxF = 12.0
end if
hres@gsnHistogramClassIntervals = levels
hres@gsnHistogramBarColors = "gray"
hres@gsnHistogramBarWidthPercent = 100.
hres@tmXBLabelFontHeightF = 0.014
hres@tmYLLabelFontHeightF = 0.014
hres@tmXBLabelStride = 2
hres@tmXBLabelDeltaF = -0.7
hres@tmYLLabelDeltaF = -0.7
hres@tiXAxisString = ""
hres@tiYAxisString = ""
;-- create histogram
hist = gsn_histogram(wks,data,hres)
return(hist)
end
;----------------------------------------------------------------------
; Procedure add_labelbar: attach a vertical labelbar to the right
; side of the plot
;----------------------------------------------------------------------
undef("add_labelbar")
procedure add_labelbar(wks,plot,colors,levels, orient)
local vph, vpw, nboxes, lbres, lbid, amres, annoid, labels
begin
print("----> add_labelbar")
;-- retrieve viewport width and height
getvalues plot ;-- get plot size for use in
"vpHeightF" : vph ;-- creating labelbar
"vpWidthF" : vpw
end getvalues
if(orient .eq. "horizontal") then
vw = vpw
vh = 0.1*vph
ampa = -0.5
amor = 0.63
else if(orient .eq. "vertical") then
vw = 0.15*vpw
vh = 0.99*vph
ampa = 0.55
amor = 0.0
end if
end if
;-- define labels and retrieve the number of color boxes
labels = levels+"" ;-- convert to type string
nboxes = dimsizes(colors(:,0)) ;-- number of color boxes (nlevels+1)
;-- create labelbar
lbres = True ;-- labelbar only resources
lbres@vpWidthF = vw ;-- labelbar width
lbres@vpHeightF = vh ;-- labelbar height
lbres@lbAutoManage = False ;-- Necessary to control sizes
lbres@lbFillColors = colors ;-- labelbar colors
lbres@lbMonoFillPattern = True ;-- Solid fill pattern
lbres@lbLabelFontHeightF = 0.016 ;-- font height. default is small
lbres@lbLabelAlignment = "InteriorEdges" ;-- line of box
lbres@lbOrientation = orient
lbres@lbPerimOn = False
lbid = gsn_create_labelbar(wks,nboxes,labels,lbres)
;-- attach labelbar to the plot
amres = True
amres@amJust = "CenterLeft"
amres@amParallelPosF = ampa
amres@amOrthogonalPosF = amor
plot@annoid = gsn_add_annotation(plot,lbid,amres)
end
;----------------------------------------------------------------------
; Main code
;----------------------------------------------------------------------
begin
;-- set minimum, maximum and interval value to group the data to color
;-- and create the labelbar
cmin = -0.8
cmax = 0.8
cint = 0.01
nt = 100 ;-- number of data per array
;-- x-,y- data
min1d = -4.0
max1d = 6.0
hist_levels = fspan(toint(min1d),toint(max1d),21)
;-- generate random data 100 points (e.g. time steps) data for x-axis
random_setallseed(136484749,19494848)
a = random_uniform(min1d,max1d,nt)
;-- data for y-axis
random_setallseed(363738674, 918273645)
b = random_uniform(min1d,max1d,nt)
;-- data for coloring
c = random_uniform(cmin,cmax,nt)
;-- title string
title = "Scatter plot: x=a(t), y=b(t), colored by c(t)"
;-- set colormap name
colmap = "MPL_viridis" ;-- colormap blue-green,yellow
;-- define levels for labelbar and colors
levels = ispan(toint(cmin*10),toint(cmax*10),1) / 10.0 ;-- define levels
nlevels = dimsizes(levels) ;-- number of levels
;-- open workstation
wks_type = "png"
wks_type@wkWidth = 1200
wks_type@wkHeight = 1200
wks = gsn_open_wks(wks_type,"plot_scatter_attach_two_histograms")
gsn_define_colormap(wks,colmap)
;-- retrieve the colors; don't use the first dark blues
colors = gsn_retrieve_colormap(wks) ;-- retrieve color map
colind = toint(fspan(20,255,nlevels+1)) ;-- don't use first 20 colors
colors := colors(colind,:)
ncolors = dimsizes(colors)
;-- resources
res = True ;-- plot mods desired
res@gsnDraw = False ;-- don't draw plot, yet
res@gsnFrame = False ;-- don't advance frame, yet
res@trYMinF = min1d ;-- y-axis minimum to have enough space for legend
res@trYMaxF = max1d ;-- y-axis maximum
res@trXMinF = min1d ;-- y-axis minimum to have enough space for legend
res@trXMaxF = max1d ;-- y-axis maximum
res@tmLabelAutoStride = True ;-- use nice tick mark labels
res@vpWidthF = 0.63 ;-- viewport width
res@vpHeightF = 0.63 ;-- viewport height
res@vpXF = 0.12 ;-- viewport x-position
res@vpYF = 0.75 ;-- viewport y-position
;-- create blank plot
plot = gsn_blank_plot(wks, res)
;-- group data and add it as filled circle markers, slightly transparent
mres = True
mres@gsMarkerThicknessF = 2.5 ;-- marker thickness
mres@gsMarkerOpacityF = 0.8 ;-- marker opacity
do i=0,nlevels-2
ii := ind(levels(i) .le. c .and. levels(i+1) .gt. c)
mres@gsMarkerIndex = 16 ;-- filled circle marker
mres@gsMarkerSizeF = 0.01 ;-- marker size
mres@gsMarkerColor = colors(i,:) ;-- marker color
str_marker = unique_string("marker") ;-- generate unique string
plot@$str_marker$ = gsn_add_polymarker(wks,plot,a(ii),b(ii),mres) ;-- add marker
end do
;-- attach the labelbar to the plot
add_labelbar(wks,plot,colors,levels,"horizontal")
;-- attach histogram 1
hist1 = add_histogram(wks, plot, a, hist_levels, "horizontal")
;-- attach histogram to the plot
amres = True
amres@amJust = "CenterLeft"
amres@amParallelPosF = -0.5
amres@amOrthogonalPosF = -0.67
anhist = unique_string("hist")
plot@$anhist$ = gsn_add_annotation(plot,hist1,amres)
;-- attach histogram 2
hist2 = add_histogram(wks, plot, b, hist_levels, "vertical")
;-- attach labelbar to the plot
amres@amParallelPosF = 0.58
amres@amOrthogonalPosF = 0.0
anhist = unique_string("hist")
plot@$anhist$ = gsn_add_annotation(plot,hist2,amres)
;-- draw the title
txres = True
txres = True ;-- text resources title string
txres@txFontHeightF = 0.020 ;-- text font size
txres@txJust = "CenterCenter" ;-- text justification
gsn_text_ndc(wks,title,0.5,0.97,txres)
;-- draw plot and advance the frame
draw(plot)
frame(wks)
end
Result: