[ncl-talk] gsnXYFillColors with 2 Y axes

Vandhna Nair n.vandhna at gmail.com
Thu Jan 29 03:03:05 MST 2015


Hi all,

I am trying to plot 4 curves (station observations), with their model
simulated ranges (min, max) as filled areas using gsnXYFillColors.

I get the 4 curves and everything else just fine using the script below
(ignore highlighted part for now).

; ***********************************************
load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl"
load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_csm.ncl"
load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/contributed.ncl"
load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/shea_util.ncl"
; ***********************************************

p1 = asciiread("Station_Suva_pr.csv",(/12,1/),"float")
p2 = asciiread("Station_Nadi_pr.csv",(/12,1/),"float")
p3 = asciiread("Suva_mod_pr.csv",(/12,2/),"float")
p4 = asciiread("Nadi_mod_pr.csv",(/12,2/),"float")
t1 = asciiread("Station_Suva_tm.csv",(/12,1/),"float")
t2 = asciiread("Station_Nadi_tm.csv",(/12,1/),"float")
t3 = asciiread("Suva_mod_tm.csv",(/12,2/),"float")
t4 = asciiread("Nadi_mod_tm.csv",(/12,2/),"float")

lp1 = p3(:,0)
lp2 = p3(:,1)
lp3 = p4(:,0)
lp4 = p4(:,1)

lt1 = t3(:,0)
lt2 = t3(:,1)
lt3 = t4(:,0)
lt4 = t4(:,1)


; ***********************************************
; create new date array for use on the plot
; ***********************************************

  date  = ispan(0,11,1) + 1
  print(date)
  monthnames = (/"Jan", "Feb", "Mar", "Apr" \
            ,"May", "Jun", "Jul", "Aug"         \
            ,"Sep", "Oct", "Nov"      \
            ,"Dec" /)
 ;**********************************************************
; to plot multiple lines (shading), you must put them into
; a mulidimensional array
;**********************************************************

data = new((/2,12/),float)
data(0,:) = p3(:,0)
data(1,:) = p3(:,1)

data1 = new((/2,12/),float)
data1(0,:) = p4(:,0)
data1(1,:) = p4(:,1)

data2 = new((/2,12/),float)
data2(0,:) = t3(:,0)
data2(1,:) = t3(:,1)

data3 = new((/2,12/),float)
data3(0,:) = t4(:,0)
data3(1,:) = t4(:,1)

;***************************
; plot parameters
;***************************

wks = gsn_open_wks("eps","Suva_Nadi_cmp") ; Open an X11 workstation.

resL = True
resR = True

resL at gsnXYBarChart         = True            ; create bar chart
resL at gsnDraw            = False               ; don't draw
resL at gsnFrame = False                        ; don't advance frame yet

;Change aspect ratio of plot
 resL at vpHeightF= 0.38
 resL at vpWidthF = 0.7

; Set min/max values for y axes

 resL at trYMinF = 0
 resL at trYMaxF = 600
 resR at trYMinF = 16
 resR at trYMaxF = 30

 resL at vpXF     = 0.15

; Define new markers

  mstring = "y"
  fontnum = 35
  xoffset = 0.0
  yoffset = 0.0
  ratio   = 1.0
  size    = 1.0
  angle   = 0.0

  Pr_index = NhlNewMarker(wks, mstring, fontnum, xoffset, yoffset, ratio,
size, angle)

  mstring1 = "u"
  fontnum1 = 34
  xoffset1 = 0.0
  yoffset1 = 0.0
  ratio1   = 1.0
  size1    = 1.0
  angle1   = 0.0

  Tm_index = NhlNewMarker(wks, mstring1, fontnum1, xoffset1, yoffset1,
ratio1, size1, angle1)

; resources for "left" variable
  resL at xyLineColor            = "-1"
  resL at xyLineThicknesses      = 3.
  resL at tiYAxisString = "Precipitation (mm)"
  resL at tiYAxisFontHeightF = 0.0198

; resources for "right" variable
  resR at xyLineColor            = "limegreen"
  resR at xyLineThicknesses      = 3.
  resR at tiYAxisString = "Temperature (~S~o~N~C)"
  resR at tiYAxisFontHeightF = 0.0198

  resL at tiMainString    = "Suva and Nadi Climatologies~C~Precipitation and
Temperature"
  resL at tiMainOffsetYF  = 0.01
  resL at tiMainFontHeightF = 0.0240
  resL at tiMainFontThicknessF = 3.0

; Marker resources
  mres = True
  mres at gsMarkerIndex = Tm_index
  mres at gsMarkerSizeF = 18.0
  mres at gsMarkerColor = (/"limegreen"/)

  mres1 = True
  mres1 at gsMarkerIndex = Tm_index
  mres1 at gsMarkerSizeF = 18.0
  mres1 at gsMarkerColor = (/"tomato2"/)

  mres2 = True
  mres2 at gsMarkerIndex = Pr_index
  mres2 at gsMarkerSizeF = 10.0
  mres2 at gsMarkerColor = (/"limegreen"/)

  mres3 = True
  mres3 at gsMarkerIndex = Pr_index
  mres3 at gsMarkerSizeF = 10.0
  mres3 at gsMarkerColor = (/"tomato2"/)

; Polyline resources

  pres                  = True
  pres at gsLineThicknessF = 3.0
  pres at gsLineColor = "limegreen"

  pres1                  = True
  pres1 at gsLineThicknessF = 3.0
  pres1 at gsLineColor = "tomato2"

 ;Formatting axis labels

  resR at tmYRFormat = "f"                           ; remove decimal values
from right Y-axis label

  resR at tmXBMode        = "Explicit"
  resR at tmXBValues      = (/16,18,20,22,24,26,28,30/)

  resL at tmXBMode          = "Explicit"              ; explicit labels
  resL at tmXBValues        = date                    ; location of labels
  resL at tmXBLabels        = monthnames              ; labels themselves

  resL at gsnYRefLine           = 0.0               ; create a reference line


  plot = gsn_csm_xy2(wks,date,p1(:,0),t1(:,0),resL,resR)

  gsn_polymarker(wks,plot at xy2,date,t1(:,0),mres)
  gsn_polyline(wks,plot at xy2,date,t2(:,0),pres1)
  gsn_polymarker(wks,plot at xy2,date,t2(:,0),mres1)
  gsn_polyline(wks,plot,date,p1(:,0),pres)
  gsn_polymarker(wks,plot,date,p1(:,0),mres2)
  gsn_polyline(wks,plot,date,p2(:,0),pres1)
  gsn_polymarker(wks,plot,date,p2(:,0),mres3)

; Create a plot with the area between min and max simulations filled in
pink/blue

 print(data)
 print(data1)
 print(data2)
 print(data3)

 ; 1st shading
  delete(resL at xyLineColors)
  resL at gsnXYFillColors = "lightpink"
  resL at xyLineColor = "-1"
  plot1  = gsn_csm_xy(wks,date,data,resL)

 ; 2nd shading
 resL at gsnXYFillColors = "lightskyblue"
 resL at xyLineColor = "-1"
 plot2  = gsn_csm_xy(wks,date,data1,resL)

 ; 3rd shading
 delete(resR at xyLineColors)
 resR at gsnXYFillColors = "lightpink"
 resR at xyLineColor = "-1"
 plot3  = gsn_csm_xy(wks,date,data2,resR)

 ; 4th shading
 resR at gsnXYFillColors = "lightskyblue"
 resR at xyLineColor = "-1"
 plot4  = gsn_csm_xy(wks,date,data3,resR)

 overlay(plot,plot1)
 overlay(plot,plot2)
 overlay(plot,plot3)
 overlay(plot,plot4)

 ;***********************
 ; Manually add legend
 ;***********************

 ; Polylines and polymarkers

  gsres             = True
  gsres at gsLineColor = "limegreen"
  gsres at gsLineThicknessF = 3.0
  gsres at gsMarkerIndex = Pr_index
  gsres at gsMarkerColor = "limegreen"
  gsres at gsMarkerSizeF = 10

  gsn_polyline_ndc(wks,(/0.2,0.3/),(/0.31,0.31/),gsres)
  gsn_polymarker_ndc(wks,0.25,0.31,gsres)

  gsres1             = True
  gsres1 at gsLineColor = "limegreen"
  gsres1 at gsLineThicknessF = 3.0
  gsres1 at gsMarkerIndex = Tm_index
  gsres1 at gsMarkerColor = "limegreen"
  gsres1 at gsMarkerSizeF = 18

  gsn_polyline_ndc(wks,(/0.2,0.3/),(/0.28,0.28/),gsres1)
  gsn_polymarker_ndc(wks,0.25,0.28,gsres1)

  gsres2             = True
  gsres2 at gsLineColor = "tomato2"
  gsres2 at gsLineThicknessF = 3.0
  gsres2 at gsMarkerIndex = Pr_index
  gsres2 at gsMarkerColor = "tomato2"
  gsres2 at gsMarkerSizeF = 10

  gsn_polyline_ndc(wks,(/0.55,0.65/),(/0.31,0.31/),gsres2)
  gsn_polymarker_ndc(wks,0.60,0.31,gsres2)

  gsres3             = True
  gsres3 at gsLineColor = "tomato2"
  gsres3 at gsLineThicknessF = 3.0
  gsres3 at gsMarkerIndex = Tm_index
  gsres3 at gsMarkerColor = "tomato2"
  gsres3 at gsMarkerSizeF = 18

  gsn_polyline_ndc(wks,(/0.55,0.65/),(/0.28,0.28/),gsres3)
  gsn_polymarker_ndc(wks,0.60,0.28,gsres3)

 ; Text

  txres = True
  txres at txFontHeightF = 0.017

  gsn_text_ndc(wks,"Suva precipitation",0.41,0.31,txres)
  gsn_text_ndc(wks,"Suva temperature",0.41,0.28,txres)
  gsn_text_ndc(wks,"Nadi precipitation",0.76,0.31,txres)
  gsn_text_ndc(wks,"Nadi temperature",0.76,0.28,txres)

  draw(plot)                                     ; now draw
  frame(wks)                                   ; now advance frame

;end


However, when I add the highlighted part to my script, I get "fill_bw_xy:
Error: If filling between two curves, one set must be 2D, and the other
1D". Also, the plot generated looks very strange - completely destroys my
existing plot. Perhaps I am making some trivial mistake as I am using
overlay and gsnXYFillColors with 2Y axes for the first time.

Any help would be highly appreciated.

Attached are:
1. Working plot, without gsnXYFillColors - Suva_Nadi_cmp.eps
2. Plot after adding the highlighted bit - Suva_Nadi_cmp2.eps
3. One of the 4 data files used in gsnXYFillColors, just incase it's needed
- Suva_mod_pr.csv

Thanks,
Vandhna.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mailman.ucar.edu/pipermail/ncl-talk/attachments/20150129/1d3eb215/attachment-0001.html 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: Suva_Nadi_cmp.eps
Type: application/postscript
Size: 289859 bytes
Desc: not available
Url : http://mailman.ucar.edu/pipermail/ncl-talk/attachments/20150129/1d3eb215/attachment-0002.eps 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: Suva_Nadi_cmp2.eps
Type: application/postscript
Size: 428923 bytes
Desc: not available
Url : http://mailman.ucar.edu/pipermail/ncl-talk/attachments/20150129/1d3eb215/attachment-0003.eps 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: Suva_mod_pr.csv
Type: text/csv
Size: 158 bytes
Desc: not available
Url : http://mailman.ucar.edu/pipermail/ncl-talk/attachments/20150129/1d3eb215/attachment-0001.bin 


More information about the ncl-talk mailing list