[ncl-talk] why the landcover index cannot display to match the colorbar?
dyjbean soybean
dyjbean at gmail.com
Thu Sep 24 19:57:24 MDT 2015
thanks for your advices,following your suggestion, i changed the
res at cnLevels=res at cnLevels =
tobyte((/2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,31,32,33/))
i think the index in this attribute is corresponding to the number in data.
2015-09-24 23:50 GMT+08:00 Mary Haley <haley at ucar.edu>:
>
> First: you want to make sure gsnSpreadColors is *not* set at all. When
> you use cnFillPalette, you shouldn't need the gsnSpreadXXXX
> resources.You've already made sure you have the exact number of colors that
> you need for your contour levels, so you're good there.
>
> The issue is that NCL always contours the data based on values that fall
> between the given levels, and not exactly at the given levels. So, for
> example, if you have data values that fall exactly at values 1, 2, 3, 4, 5,
> then to create contours at these values, you need to use values that fall
> between them:
>
> res at cnLevels = (/1.5, 2.5, 3.5, 4.5 /)
>
> With four contour levels, you will get five colors in your labelbar:
>
> - the first color in your labelbar represents all values <1.5 (hence
> covering the value 1)
> - the second color will represent all values >= 1.5 and < 2.5 (hence
> covering the value 2)
> . . .
> - the last (fifth) color will represent all values > 4.5
>
> If you look at the original vegland_1.ncl script, it is setting the levels
> to go from 2 to 18 in steps of 1, but the actual label strings go from 1 to
> 18 in steps of one. This works because then the first color then
> represents all values < 2 (thus catching the values equal to 1), and so on.
> I just like to use values like 1.5, 2.5, etc, to make it more clear, but
> the end result is the same.
>
> I think the rest of your resources for setting up centered-labels and
> setting the label strings themselves looks good.
>
> One final comment: gsn_panel only rearranges the existing plots and adds a
> labelbar, if requested. It does *not* change the existing plots. Thus, the
> "cnLevel" resource will not be recognized by gsn_panel.
>
> Also, to make sure you get every box labeled, make sure you set:
>
> pres at lbLabelStride = 1
> pres at lbLabelAutoStride = False
>
> --Mary
>
>
> On Wed, Sep 23, 2015 at 8:43 PM, dyjbean soybean <dyjbean at gmail.com>
> wrote:
>
>> hi,
>> i have made a landcover map, which includes indices from 1 to 19 and
>> 31-32 , all is 22 categories.
>>
>> but after i ploted them, only the 1 to 19 and 33 category appearing in
>> figure, but the 31-32 these two category cannot be shown in figure.
>>
>> those below is my NCL script:
>>
>>
>> ++++++++++++++++++++++++++++++++++
>>
>> 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"
>> load "./shapefile_mask_data.ncl"
>>
>> begin
>> forgname="globecover_hubei_liuhuan_usgs_ronghe_snow-ice1.txt"
>> fconname="globecover_huabei_liuhuan_usgs_new_allocate1.txt"
>>
>> onlat=5403
>> omlon=5403
>>
>> nnlat=1801
>> nmlon=1801
>>
>> odat=new((/onlat,omlon/),"integer","No_FillValue")
>> ndat=new((/nnlat,nmlon/),"integer","No_FillValue")
>>
>> odat=readAsciiTable(forgname,omlon,"integer",5)
>> ndat=asciiread(fconname,(/nnlat,nmlon/),"integer")
>> delete(odat at _FillValue)
>> delete(ndat at _FillValue)
>>
>> ;; confused lc
>> olat=new((/onlat/),"float","No_FillValue")
>> olon=new((/omlon/),"float","No_FillValue")
>>
>> do i=0,onlat-1
>> olat(i)=45.00413067-i*0.0027778
>> end do
>>
>>
>> do j=0,omlon-1
>> olon(j)=109.99606533+j*0.0027778
>> end do
>>
>> olat!0="lat"
>> olat at units="degrees_north"
>> olat at long_name="latitude"
>>
>> olon!0="lon"
>> olon at units="degrees_east"
>> olon at long_name="longitude"
>>
>> odat!0="lat"
>> odat!1="lon"
>> odat&lat=olat
>> odat&lon=olon
>> odat at units=""
>> odat at long_name="land cover confused with globaland30 and globercover"
>> odat at _FillValue = -999
>>
>> ;; new classified lc
>> nlat=new((/nnlat/),"float","No_FillValue")
>> nlon=new((/nmlon/),"float","No_FillValue")
>>
>> do i=0,nnlat-1
>> nlat(i)=45.00413067-i*0.0083334
>> end do
>>
>>
>> do j=0,nmlon-1
>> nlon(j)=109.99606533+j*0.0083334
>> end do
>>
>> nlat!0="lat"
>> nlat at units="degrees_north"
>> nlat at long_name="latitude"
>>
>> nlon!0="lon"
>> nlon at units="degrees_east"
>> nlon at long_name="longitude"
>>
>> ndat!0="lat"
>> ndat!1="lon"
>> ndat&lat=nlat
>> ndat&lon=nlon
>> ndat at units=""
>> ndat at long_name="land cover new categories after confused"
>> ndat at _FillValue = -999
>>
>> print(odat(onlat-1,omlon-1))
>>
>> ;
>> ; If you already have the mask NetCDF file, set this to False.
>> ; Creating the mask can be slow!
>> ;
>> CREATE_MASK = True
>>
>> ;---Whether to draw lat/lon points and shapefile outlines
>> ADD_LATLON_POINTS = False
>> ADD_SHAPEFILE_OUTLINES = True
>>
>> ;---Name of shapefile containing USA outlines
>> shp_fname = "huan_6.shp"
>>
>> ;---Name of file to write mask to or to read mask from.
>> mask_oname = "liuhuan_mask_300m.nc"
>> mask_nname = "liuhuan_mask_1km.nc"
>>
>> ;---Rough area we are interested in. Everything outside this will be
>> masked.
>> minlon = 116.0
>> maxlon = 116.8
>> minlat = 39.6
>> maxlat = 40.2
>>
>> ;; odat
>> if(CREATE_MASK) then
>> print("Creating the mask file...")
>>
>> ;---Create a new mask using a shapefile of USA
>> odims = dimsizes(odat)
>> opto = True
>> opto at return_mask = True
>> ; opto at debug = True
>> opto at minlon = minlon ; Makes the shapefile masking
>> opto at maxlon = maxlon ; go faster.
>> opto at minlat = minlat
>> opto at maxlat = maxlat
>> odat_mask = shapefile_mask_data(odat,shp_fname,opto)
>>
>> ;---Write new mask to file
>> system("rm -f " + mask_oname)
>> oout = addfile(mask_oname,"c")
>> oout->odat_mask = odat_mask
>> else
>> print("Reading mask off file.")
>>
>> ;---Read the new mask from the NetCDF file
>> omask = addfile(mask_oname,"r")
>> odat_mask = omask->odat_mask
>> end if
>>
>> ;; ndat
>> if(CREATE_MASK) then
>> print("Creating the mask file...")
>>
>> ;---Create a new mask using a shapefile of USA
>> ndims = dimsizes(ndat)
>> optn = True
>> optn at return_mask = True
>> ; optn at debug = True
>> optn at minlon = minlon ; Makes the shapefile masking
>> optn at maxlon = maxlon ; go faster.
>> optn at minlat = minlat
>> optn at maxlat = maxlat
>> ndat_mask = shapefile_mask_data(ndat,shp_fname,optn)
>>
>> ;---Write new mask to file
>> system("rm -f " + mask_nname)
>> nout = addfile(mask_nname,"c")
>> nout->ndat_mask = ndat_mask
>> else
>> print("Reading mask off file.")
>>
>> ;---Read the new mask from the NetCDF file
>> nmask = addfile(mask_nname,"r")
>> ndat_mask = nmask->ndat_mask
>> end if
>>
>> ;---Create masked data array
>> omask = where(odat_mask.eq.1,odat,odat at _FillValue)
>> copy_VarMeta(odat,omask)
>>
>> ;---Create masked data array
>> nmask = where(ndat_mask.eq.1,ndat,ndat at _FillValue)
>> copy_VarMeta(ndat,nmask)
>>
>>
>> ;ind32=ind(ndtooned(nmask).eq.32)
>> ;print(ind32)
>>
>> dimsnmk=dimsizes(nmask)
>> do i=0,dimsnmk(0)-1
>> do j=0,dimsnmk(1)-1
>> if(any(ndat(i,j).eq.32)) then
>> print(i+" "+j+" "+" "+ndat(i,j))
>> end if
>> end do
>> end do
>>
>> ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
>> ;; create plot
>> ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
>> plot=new(2,"graphic")
>> info=(/ \
>> "1 urban_and_built-in" ,\
>> "2 dryland_cropland" ,\
>> "3 irrigated_cropland" ,\
>> "4 mixed_dry_cropland" ,\
>> "5 cropland_grassland" ,\
>> "6 cropland_woodland" ,\
>> "7 grassland" ,\
>> "8 shrubland" ,\
>> "9 mixed_shrub_grassland",\
>> "10 savanna" ,\
>> "11 deciduous_broadleaf" ,\
>> "12 deciduous_needleleaf" ,\
>> "13 evergreen_broadleaf" ,\
>> "14 evergreen_needleleaf" ,\
>> "15 mixed_forest" ,\
>> "16 water" ,\
>> "17 herbaceous_wetland" ,\
>> "18 wooded_wetland" ,\
>> "19 barren_or_sparse" ,\
>> "31 low_intensity_res" ,\
>> "32 mid_intensity_res" ,\
>> "33 high_intensity_res"/)
>>
>> ninfo=dimsizes(info)
>>
>> ninfo = dimsizes(info) ; # of classifications
>>
>>
>> ;************************************************
>> ; create plot
>> ;************************************************
>> pltType = "png" ; ps, pdf, png, x11, eps
>>
>>
>>
>> colorscheme =(/"red","lawngreen","mediumseagreen","springgreen",\
>> "limegreen","darkolivegreen3","green","lightsalmon","green3",\
>> "gold","palegreen","olivedrab3","chartreuse3","chartreuse",
>> \
>> "darkgreen","blue","hotpink2","hotpink","light cyan", \
>> "khaki1","violetred1","purple3"/)
>>
>> ncolors = dimsizes(colorscheme)
>> if (ninfo.ne.ncolors) then ; make sure # of colors match
>> categories (classes)
>> print("size mismatch: ninfo="+ninfo+" ncolors="+ncolors)
>> exit
>> end if
>>
>> wks = gsn_open_wks(pltType,"plot_origin_new_lc_test")
>> plot=new(2,graphic)
>> res = True ; plot mods desired
>> res at gsnDraw = False
>> res at gsnFrame = False
>> ;res at gsnMaximize = True ; ps, pdf
>> res at gsnAddCyclic = False
>>
>> ;res at mpMinLatF = min(odat&lat)
>> ;res at mpMaxLatF = max(odat&lat)
>> ;res at mpMinLonF = min(odat&lon)
>> ;res at mpMaxLonF = max(odat&lon)
>>
>> res at cnFillOn = True ; color Fill
>> res at cnFillMode = "RasterFill"
>> res at cnLinesOn = False ; Turn off contour lines
>> res at cnLineLabelsOn = False
>> res at cnLevelSelectionMode = "ExplicitLevels" ; set explict contour
>> levels
>> res at cnLevels = tobyte(ispan(1,ninfo-1,1)+1)
>> res at cnFillPalette = colorscheme ; distinct colors for
>> categories
>> res at gsnSpreadColors = False ; use each color sequentially
>> res at cnInfoLabelOn = False
>>
>>
>> res at mpFillOn = False
>>
>>
>> res at gsnAddCyclic = False ; regional data
>> ;res at trGridType = "TriangularMesh"
>> res at tmXBLabelFontHeightF = 0.01 ; Make lon & lat text smaller
>> res at tmYLLabelFontHeightF = res at tmXBLabelFontHeightF
>>
>> res at gsnLeftString = ""
>> res at gsnRightString = ""
>>
>> res1 = True
>> res1 = res
>> res1 at mpMinLatF = minlat
>> res1 at mpMaxLatF = maxlat
>> res1 at mpMinLonF = minlon
>> res1 at mpMaxLonF = maxlon
>>
>> res1 at tmXBMode = "Explicit"
>> res1 at tmXBValues =
>> (/116.0,116.1,116.2,116.3,116.4,116.5,116.6,116.7,116.8/)
>> res1 at tmXBLabels =
>> (/"116.0~S~o~N~E","116.1~S~o~N~E","116.2~S~o~N~E","116.3~S~o~N~E","116.4~S~o~N~E","116.5.0~S~o~N~E",\
>> "116.6~S~o~N~E","116.7~S~o~N~E","116.8~S~o~N~E"/)
>>
>> res1 at tmYLMode = "Explicit"
>> res1 at tmYLValues = (/39.6,39.7,39.8,39.9,40.0,40.1,40.2/)
>> res1 at tmYLLabels =
>> (/"39.6~S~o~N~N","39.7~S~o~N~N","39.8~S~o~N~N","39.9~S~o~N~N","40.0~S~o~N~N","40.1~S~o~N~N","41.2~S~o~N~N"/)
>>
>> res1 at tiMainString = "confused LC"
>> res1 at lbLabelBarOn = False
>> plot(0) = gsn_csm_contour_map_ce(wks, omask, res1) ; create plot
>>
>> res2 = True
>> res2=res
>> res2 at mpMinLatF = minlat
>> res2 at mpMaxLatF = maxlat
>> res2 at mpMinLonF = minlon
>> res2 at mpMaxLonF = maxlon
>> res2 at lbLabelBarOn = False
>>
>> res2 at tmXBMode = "Explicit"
>> res2 at tmXBValues =
>> (/116.0,116.1,116.2,116.3,116.4,116.5,116.6,116.7,116.8/)
>> res2 at tmXBLabels =
>> (/"116.0~S~o~N~E","116.1~S~o~N~E","116.2~S~o~N~E","116.3~S~o~N~E","116.4~S~o~N~E","116.5.0~S~o~N~E",\
>> "116.6~S~o~N~E","116.7~S~o~N~E","116.8~S~o~N~E"/)
>>
>> res2 at tmYLMode = "Explicit"
>> res2 at tmYLValues = (/39.6,39.7,39.8,39.9,40.0,40.1,40.2/)
>> res2 at tmYLLabels =
>> (/"39.6~S~o~N~N","39.7~S~o~N~N","39.8~S~o~N~N","39.9~S~o~N~N","40.0~S~o~N~N","40.1~S~o~N~N","41.2~S~o~N~N"/)
>>
>> res2 at tiMainString = "reclassified LC"
>> plot(1) = gsn_csm_contour_map_ce(wks,nmask,res2)
>>
>> pres = True
>> pres at gsnFrame = False
>> pres at gsnPanelLabelBar = True
>> pres at lbLabelFontHeightF = 0.01
>> pres at gsnPanelBottom = 0.05
>> pres at lbLabelPosition = "Center" ; label position
>> pres at lbLabelAlignment = "BoxCenters" ; label orientation
>> pres at cnLevels = (/1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,\
>> 31,32,33/)
>> pres at lbLabelStrings = (/"1","2","3","4","5","6","7","8","9","10",\
>> "11","12","13","14","15","16","17","18","19",\
>> "31","32","33"/)
>> ;pres at lbLabelStrings = ispan(0,ninfo,1)
>> ;pres at lbLabelStride = 1
>> pres at lbLabelAutoStride = True
>>
>> gsn_panel(wks,plot,(/1,2/),pres)
>>
>> rtxt = True
>> rtxt at txJust = "TopLeft"
>> rtxt at txFontHeightF = 0.0125
>>
>> ; Add text: rows x columns of text (arbitrary)
>> ; Usually must play with xx, yy and txFontHeightF
>>
>> nrow = 5 ; # rows
>> ncol = 6 ; # columns
>>
>> n = -1
>> xx = 0.015 ; arbitrary
>> do nc=0,ncol-1
>> yy = 0.20
>> do nr=0,nrow-1
>> n = n+1
>> if (n.le.(ninfo-1)) then
>> gsn_text_ndc (wks,info(n),xx,yy,rtxt)
>> yy = yy - 2*rtxt at txFontHeightF
>> end if
>> end do
>> xx = xx + 0.20
>> end do
>>
>> ;draw(plot)
>> frame(wks)
>>
>> end
>>
>>
>>
>> ++++++++++++++++++++++++++++++++++
>>
>> i don't know if the nested pic can show, so i attach it
>>
>> i change the urban (denote with red color in left panel) into impervious
>> category (31,32,33,show in right panel), but eventually only 33 appeared,
>> 31 and 32 disappeared.
>> the 31-32 exists in data.
>>
>> can the ncl script match the landcover index automatically?
>>
>>
>> would you please give me some advices for this problem which i have been
>> confused some days?
>>
>> thanks
>>
>> _______________________________________________
>> ncl-talk mailing list
>> ncl-talk at ucar.edu
>> List instructions, subscriber options, unsubscribe:
>> http://mailman.ucar.edu/mailman/listinfo/ncl-talk
>>
>>
>
--
通讯地址:北京市朝阳区大屯路9718信箱
中国科学院遥感应用研究所
邮编:100101
电话:010-64860422
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mailman.ucar.edu/pipermail/ncl-talk/attachments/20150925/55876d73/attachment.html
More information about the ncl-talk
mailing list