Sie sind hier: Startseite / Services / Data Analysis and Visualization / Visualization / Software / NCL / examples / source_code / DKRZ NCL example scatter plot with two attached histograms
Info
Alle Inhalte des Nutzerportal sind nur auf Englisch verfügbar.

DKRZ NCL example scatter plot with two attached histograms

This example use random data to create a scatter plot with two attached histograms at the top and right side.

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

Artikelaktionen