[ncl-talk] mpProjection in gsn_csm_contour
Kreienkamp Frank
Frank.Kreienkamp at dwd.de
Mon May 11 18:26:17 MDT 2015
Hello David,
thanks a lot for this solution. If have missed the fact that ‘AreaFill’ is smoothing the data. A non-smoothed version of AreaFill would be perfect.
Thanks
Frank
Von: ncl-talk-bounces at ucar.edu [mailto:ncl-talk-bounces at ucar.edu] Im Auftrag von David Brown
Gesendet: Montag, 30. März 2015 23:31
An: Kreienkamp Frank
Cc: ncl-talk at ucar.edu
Betreff: Re: [ncl-talk] mpProjection in gsn_csm_contour
Hi Frank,
It turns out the problem you were having has nothing to do with the map projection. The stippled overlay plot is properly projected into the same data space as the underlying plot.
Instead, the issue is with the fact that you are using AreaFill, which inherently generates a smoothed type of contour fill, along with the fact that a big portion of the overlaid data is missing. Also the individual cells are quite large, or in other words the visible part of the data set is very low resolution.
A quirk, or perhaps a feature, of the AreaFill method is that the cells immediately adjoining an area of missing values are also treated as missing. In your example plot this reduces the stippled area to a fraction of what one might reasonably suppose it should be.
One way to work around this is to eliminate the missing values. The idea is to set the missing values to a value outside the good value range, to a value that creates a plausible gradient from the nearest good value. Then set up the levels and level colors such that the formerly missing values will be drawn as a transparent color. I am attaching a code that does this (Test.ncl) along with a plot that illustrates the result. As you can see, the valid cells are mostly covered, but the outline is curved, as it should be for a smoothed contour edge.
If you want the cells to be shaped the same as the underlying non-smoothed raster plot, then you would need to do it using polygons. I have attached another script (Test-1.ncl) that does this. You need to get the corners of each cell by interpolating from the centers of adjoining cells. I used 45 degree hatched lines rather than dots here, because the hatched lines tracks the edges of the cells better -- thus allowing you to see that the overlay does indeed line up precisely with the underlying plot.
It would be nice if we could implement a non-smoothed version of AreaFill. Or perhaps implement some capability for pattern fill in the cell fill method. That would give a built-in way to generate the second plot. Anyway, I hope this helps.
-dave
On Fri, Mar 27, 2015 at 12:44 AM, Kreienkamp Frank <Frank.Kreienkamp at dwd.de<mailto:Frank.Kreienkamp at dwd.de>> wrote:
Hello,
both used fields have the same dimensions, and both grids are located at the same grid points. In the following an ncdump –h of one input file:
dimensions:
lat = 32 ;
lon = 22 ;
NoCharRunInfo = 152 ;
variables:
char Run1Info(NoCharRunInfo) ;
char Run2Info(NoCharRunInfo) ;
float lat(lat, lon) ;
lat:units = "degrees_north" ;
lat:long_name = "Latitude" ;
lat:_FillValue = -999.f ;
lat:missing_value = -999.f ;
lat:axis = "Y" ;
float lon(lat, lon) ;
lon:units = "degrees_east" ;
lon:long_name = "Longitude" ;
lon:_FillValue = -999.f ;
lon:missing_value = -999.f ;
lon:axis = "X" ;
float field(lat, lon) ;
field:long_name = "field" ;
field:short_name = "field" ;
field:_FillValue = -999.f ;
field:missing_value = -999.f ;
field:axis = "field" ;
Using printVarSummary I get the following results:
Variable: u
Type: float
Total Size: 2816 bytes
704 values
Number of Dimensions: 2
Dimensions and sizes: [lat | 32] x [lon | 22]
Coordinates:
Number Of Attributes: 7
lon2d : <ARRAY of 704 elements>
lat2d : <ARRAY of 704 elements>
long_name : field
short_name : field
_FillValue : -999
missing_value : -999
axis : field
Variable: u1
Type: float
Total Size: 2816 bytes
704 values
Number of Dimensions: 2
Dimensions and sizes: [lat | 32] x [lon | 22]
Coordinates:
Number Of Attributes: 7
lon2d : <ARRAY of 704 elements>
lat2d : <ARRAY of 704 elements>
long_name : sig
short_name : sig
_FillValue : -999
missing_value : -999
axis : field
In the given example I could reduce the lon / lon information to an 1D array. But the used ncl-script will also be used for RCM-results based on a rotated grid. This means 2D lat / lon information is needed.
But as you can see in the following picture the grids are shifted.
[cid:image001.png at 01D0614F.B2E6B880]
I have added the ncl-file and both used data files. I am using ncl 6.2.1 on a linux system.
Thanks for help in advance
Frank
Von: ncl-talk-bounces at ucar.edu<mailto:ncl-talk-bounces at ucar.edu> [mailto:ncl-talk-bounces at ucar.edu<mailto:ncl-talk-bounces at ucar.edu>] Im Auftrag von David Brown
Gesendet: Montag, 23. März 2015 21:44
An: Kreienkamp Frank
Cc: ncl-talk at ucar.edu<mailto:ncl-talk at ucar.edu>
Betreff: Re: [ncl-talk] mpProjection in gsn_csm_contour
Hi Frank,
Sorry for the delay in answering. Only map plots themselves have the concept of a projection. When you overlay a contour plot on a map plot the contour data locations are transformed into the current map projection. That is, as long as the contour data has the appropriate coordinate arrays attached. If the u1 data has 1d coordinates that are defined in the file using the usual NetCDF-style conventions, then the coordinates will be automatically known to the gsn routines and the data will be mapped correctly into the current map projection.
In this case, a printVarSummary of the u1 variable should show something like:
Variable: u1
Type: float
Total Size: 32768 bytes
8192 values
Number of Dimensions: 2
Dimensions and sizes: [lat | 64] x [lon | 128]
Coordinates:
lat: [-87.8638..87.8638]
lon: [-180..177.1875]
Number Of Attributes: 5
time : 1
_FillValue : -999
long_name : Zonal Wind
short_name : U
units : m/s
which indicates that there are 1D variables in the file named lat and lon that have the same dimensions as the two dimensions of the u1 variable.
The names of these don't matter but in order to overlay properly these variables need a compatible 'units' attribute, usually 'degrees_east' for longitude and 'degrees_north' for latitude.
If u1 is on some sort of pre-projected grid, then an overlay into a arbitrary map projection requires that that a set of 2D coordinate variables that define the individual position of each grid point be passed along with the contour data. There are two ways to do this:
1) define the special attributes lon2d and lat2d for the u1 variable:
u1 at lat2d = <2d lat coordinates>
u1 at lon2d = <2d lon coordinates>
2) define the resources sfXArray and sfYArray with these same coordinates:
resNatVar at sfXArray = <2d lon coordinates>
resNatVar at sfYArray = <2d lat coordinates>
If these 2D coordinates are not available in the file, then you will need to use an external program such as PROJ4 to calculate them based on the projection used for the u1 data.
If this does not answer your questions, then we will need sample data files plus a complete runnable script in order to help further.
-dave
On Wed, Mar 18, 2015 at 1:08 AM, Kreienkamp Frank <Frank.Kreienkamp at dwd.de<mailto:Frank.Kreienkamp at dwd.de>> wrote:
Hello,
i want to plot a grid based plot, including an contour overlay. The grid based plot is drawn in Stereographic projection using mpProjection = "Stereographic" and plot = gsn_csm_map(wks,res). On top of this map I want to add a contour-plot showing if changes are significant or not.
Unfortunately both plots do not use the same projection.
But if I use resNatVar at mpProjection = "Stereographic" I get the information: warning:mpProjection is not a valid resource in ..
I have added the source-code part and an example plot.
What can I do?
Thanks in advance
Frank
;************************************************
; create plot
wtype = "png"
wtype at wkWidth = 970 ; Set the pixel size of image.
wtype at wkHeight = 1000 ; Set the pixel size of image.
wks = gsn_open_wks(wtype,"test")
;************************************************
res = True
res at gsnMaximize = True
res at gsnDraw = False
res at gsnFrame = False
res at mpProjection = "Stereographic"
res at mpCenterLatF = 50 ; Centered over Germany
res at mpCenterLonF = 10 ; Centered over Germany
res at mpLimitMode = "Corners" ; choose range of map
res at mpLeftCornerLatF = 55.8
res at mpLeftCornerLonF = 2.6
res at mpRightCornerLatF = 45.1
res at mpRightCornerLonF = 19.5
res at mpGridLatSpacingF = 2
res at mpGridLonSpacingF = 2
res at mpOutlineDrawOrder = "PostDraw" ; draw continental outline last
res at mpFillDrawOrder = "PreDraw"
res at mpDataBaseVersion = "HighRes" ; use finer database
res at mpOutlineBoundarySets = "National"
res at mpFillOn = False ; turns off continent gray
res at mpLeftAngleF = 7
res at mpRightAngleF = 8
res at mpBottomAngleF = 6
res at mpTopAngleF = 8
res at mpMinLatF = 10.0
res at pmTickMarkDisplayMode = "Always" ; Nicer tickmark labels
res at mpGridAndLimbOn = True ; Turn on lat/lon grid
res at mpGridLineDashPattern = 2 ; Dashed lines
res at tmXTOn = False ; turn tickmarks of
res at tmXBOn = False ; turn tickmarks of
res at tmYLOn = False ; turn tickmarks of
res at tmYROn = False ; turn tickmarks of
res at gsnLeftString = ""
;************************************************
; Plot will just be created, and not drawn yet.
plot = gsn_csm_map(wks,res) ; Create plot
;************************************************
; adding color definition
cmap = RGBtoCmap("/kp/kp06/VisTool/data/konstdat/Farben_rgb_temp.dat")
gsn_define_colormap(wks,cmap)
;************************************************
; adding map
res at cnFillOn = True ; color Fill
res at cnFillMode = "RasterFill" ; Raster Mode
res at cnLinesOn = False ; Turn off contour lines
res at cnLevelSelectionMode = "ManualLevels"
res at cnMinLevelValF = -90.0 ; min contour level
res at cnMaxLevelValF = 90.0 ; max contour level
res at cnLevelSpacingF = 20.0 ; contour spacing
res at cnLabelBarEndStyle = "ExcludeOuterBoxes" ; no additional ColorBoxes
res at gsnAddCyclic = False ; regional data: not cyclic
;************************************************
; Plot will just be created, and not drawn yet.
plot = gsn_csm_contour_map(wks,u,res)
;************************************************
; add Info robust signal
resNatVar = True
resNatVar at gsnMaximize = True
resNatVar at gsnDraw = False
resNatVar at gsnFrame = False
resNatVar at gsnLeftString = ""
resNatVar at lbLabelBarOn = False
resNatVar at cnFillOn = True ; color Fill
resNatVar at cnLinesOn = False ; Turn off contour lines
resNatVar at cnLevelSelectionMode = "AutomaticLevels"
resNatVar at cnFillMode = "AreaFill" ; Raster Mode
resNatVar at cnFillPattern = 17
resNatVar at cnFillBackgroundColor = -1
resNatVar at cnInfoLabelOn = False
resNatVar at cnLineLabelsOn = False
resNatVar at cnMonoFillColor = True
resNatVar at cnConstFEnableFill = True
resNatVar at cnConstFLabelOn = False
resNatVar at cnFillColor = "black"
;************************************************
; Plot will just be created, and not drawn yet.
plot1 = gsn_csm_contour(wks,u1,resNatVar)
overlay(plot,plot1)
[cid:image001.png at 01D0768E.F0DE04A0]
_______________________________________________
ncl-talk mailing list
List instructions, subscriber options, unsubscribe:
http://mailman.ucar.edu/mailman/listinfo/ncl-talk
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mailman.ucar.edu/pipermail/ncl-talk/attachments/20150512/d585f078/attachment.html
-------------- next part --------------
A non-text attachment was scrubbed...
Name: image001.png
Type: image/png
Size: 145280 bytes
Desc: image001.png
Url : http://mailman.ucar.edu/pipermail/ncl-talk/attachments/20150512/d585f078/attachment.png
More information about the ncl-talk
mailing list