;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Description: Create a legend using calls to gsn_add_polyline/gsn_add_text. ;; Resources are used to set the position of upper-left corner of the legend, ;; the legend labels, the spacing of the legend items, and the appearance of ;; the lines and labels. ;; Adam Phillips ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; undef("simple_legend") function simple_legend(wksp:graphic,xyplot:graphic,genres:logical,lineres:logical,labelres:logical) local wksp,xyplot,genres,lineres,labelres,XPos,YPos,numitems,xrange,yrange,incr,y_pos,x_line_start,\ x_line_end,x_text_start,x_text_end begin getvalues xyplot "trYMinF" : ymin "trYMaxF" : ymax "trXMinF" : xmin "trXMaxF" : xmax end getvalues yrange = ymax - ymin xrange = xmax - xmin if (.not.isatt(genres,"ItemSpacePercent")) then genres@ItemSpacePercent = 5. end if incr = (genres@ItemSpacePercent/100.)*yrange*-1. if (.not.isatt(genres,"Position")) then ; set default genres@Position = "Top" end if if (isatt(labelres,"lgLabels")) then numItems = dimsizes(labelres@lgLabels) else print("simple_legend: Fatal: Legend labels must be set using lgLabels. If empty labels are required set lgLabels resource to an empty string array dimenensioned equal to the number of legend lines.") exit end if if (isatt(genres,"XPosPercent")) then XPos = genres@XPosPercent/100. else XPos = 0.05 ; set default end if if (isatt(genres,"YPosPercent")) then YPos = genres@YPosPercent/100. if (genres@Position.eq."Bottom") then ; modify YPosPercent when doing bottom label so that first label is on top YPos = YPos+((numItems-1)*(genres@ItemSpacePercent/100.)) end if else if (genres@Position.eq."Bottom") then YPos = 0.05 ; set default else YPos = 0.95 ; set default end if end if txres = True txres@txJust = "CenterLeft" txres@txFontHeightF = 0.015 zres = True polyres = True do gg = 0,numItems-1 if (gg.eq.0) then y_pos = (YPos*yrange)+ymin else y_pos = y_pos+incr end if x_line_start = xmin+(XPos*xrange) ; position of start of legend line if (isatt(lineres,"LineLengthPercent")) then x_line_end = x_line_start+(xrange*(lineres@LineLengthPercent/100.)) else x_line_end = x_line_start+(xrange*.07) ; set default end if if (isatt(genres,"LineLabelWhiteSpacePercent")) then x_text_start = x_line_end+(xrange*(genres@LineLabelWhiteSpacePercent/100.)) else x_text_start = x_line_end+(xrange*0.03) ; set default end if if (isatt(lineres,"lgLineColors")) then if (dimsizes(lineres@lgLineColors).eq.1.or.dimsizes(lineres@lgLineColors).ne.dimsizes(labelres@lgLabels)) then zres@gsLineColor = lineres@lgLineColors(0) else zres@gsLineColor = lineres@lgLineColors(gg) end if end if if (isatt(lineres,"lgLineOpacity")) then if (dimsizes(lineres@lgLineOpacity).eq.1.or.dimsizes(lineres@lgLineOpacity).ne.dimsizes(labelres@lgLabels)) then zres@gsLineOpacityF = lineres@lgLineOpacity(0) else zres@gsLineOpacityF = lineres@lgLineOpacity(gg) end if end if if (isatt(lineres,"lgLineThicknesses")) then if (dimsizes(lineres@lgLineThicknesses).eq.1.or.dimsizes(lineres@lgLineThicknesses).ne.dimsizes(labelres@lgLabels)) then zres@gsLineThicknessF = lineres@lgLineThicknesses(0) else zres@gsLineThicknessF = lineres@lgLineThicknesses(gg) end if end if if (isatt(lineres,"lgDashIndexes")) then if (dimsizes(lineres@lgDashIndexes).eq.1.or.dimsizes(lineres@lgDashIndexes).ne.dimsizes(labelres@lgLabels)) then zres@gsLineDashPattern = lineres@lgDashIndexes(0) else zres@gsLineDashPattern = lineres@lgDashIndexes(gg) end if else zres@gsLineDashPattern = 0 end if xyplot@$unique_string("lg")$ = gsn_add_polyline(wksp,xyplot,(/x_line_start,x_line_end/),(/y_pos,y_pos/),zres) if (isatt(labelres,"lgLabelFontHeights")) then if (dimsizes(labelres@lgLabelFontHeights).eq.1.or.dimsizes(labelres@lgLabelFontHeights).ne.dimsizes(labelres@lgLabels)) then txres@txFontHeightF = labelres@lgLabelFontHeights(0) else txres@txFontHeightF = labelres@lgLabelFontHeights(gg) end if end if if (isatt(labelres,"lgLabelColors")) then if (dimsizes(labelres@lgLabelColors).eq.1.or.dimsizes(labelres@lgLabelColors).ne.dimsizes(labelres@lgLabels)) then txres@txFontColor = labelres@lgLabelColors(0) else txres@txFontColor = labelres@lgLabelColors(gg) end if end if if (isatt(labelres,"lgLabelOpacity")) then if (dimsizes(labelres@lgLabelOpacity).eq.1.or.dimsizes(labelres@lgLabelOpacity).ne.dimsizes(labelres@lgLabels)) then txres@txFontOpacityF = labelres@lgLabelOpacity(0) else txres@txFontOpacityF = labelres@lgLabelOpacity(gg) end if end if xyplot@$unique_string("lg")$ = gsn_add_text(wksp,xyplot,labelres@lgLabels(gg),x_text_start,y_pos,txres) end do return(xyplot) end