rplotncdf4

Plotting x and y values using data from two separate netCDF files in R


I am currently trying to plot, using a line-related plot, precipitation data (y-axis values) with cumulative emissions data (x-axis) using R. Both of these data are found on two separate netCDF files that I have already read into R. Ultimately, What I would like to do is plot precipitation as a function of cumulative emissions for a selected location (as shown below in the following code). I have, so far, used the following code (with # to highlight each step):

library(raster)
library(ncdf4)
library(maps)
library(maptools)
library(rasterVis)
library(ggplot2)
library(rgdal)
library(sp)

#Geting cumulative emissions data for x-axis

ncfname <- "cumulative_emissions_1pctCO2.nc"
Model1 <- nc_open(ncfname)
print(Model1)
get <- ncvar_get(Model1, "cum_co2_emi-CanESM2") #units of terratones ofcarbon (TtC) for x-axis
print(get)
Year <- ncvar_get(Model1, "time") #140 years


#Getting Model data for extreme precipitation (units of millimeters/day)for y-axis

ncfname1 <- "MaxPrecCCCMACanESM21pctCO2.nc"
Model2 <- nc_open(ncfname1)
print(Model2)
get1 <- ncvar_get(Model2, "onedaymax") #units of millimeters/day
print(get1)
#Reading in latitude, longitude and time from this file:
latitude <- ncvar_get(Model2, "lat") #64 degrees latitude
longitude <- ncvar_get(Model2, "lon") #128 degrees longitude
Year1 <- ncvar_get(Model2, "Year") #140 years

#Plotting attempt

r_brick <- brick(get, xmn=min(latitude), xmx=max(latitude),  
ymn=min(longitude), ymx=max(longitude), crs=CRS("+proj=longlat +ellps=WGS84  
+datum=WGS84 +no_defs+ towgs84=0,0,0"))
randompointlon <- 30 #selecting a longitude
randompointlat <- -5 #selecting a latitude
Hope <- extract(r_brick, 
SpatialPoints(cbind(randompointlon,randompointlat)),method = 'simple')
df <- data.frame(cumulativeemissions=seq(from = 1, to = 140, by = 1),   
Precipitation=t(Hope))
ggplot(data = df, aes(x = get, y = Precipitation, 
group=1))+geom_line()+ggtitle("One-day maximum precipitation (mm/day)   
for random location for CanESM2 1pctCO2 as a function of cumulative 
emissions")

print(Model1) yields the following (I read in variable #2 to work with for now):

File cumulative_emissions_1pctCO2.nc (NC_FORMAT_NETCDF4):

 14 variables (excluding dimension variables):
    float cum_co2_emi-BNU-ESM[time]   (Contiguous storage)  
        long_name: Cumulative carbon emissions for BNU-ESM
        units: Tt C
    float cum_co2_emi-CanESM2[time]   (Contiguous storage)  
        long_name: Cumulative carbon emissions for CanESM2
        units: Tt C
    float cum_co2_emi-CESM1-BGC[time]   (Contiguous storage)  
        long_name: Cumulative carbon emissions for CESM1-BGC
        units: Tt C
    float cum_co2_emi-HadGEM2-ES[time]   (Contiguous storage)  
        long_name: Cumulative carbon emissions for HadGEM2-ES
        units: Tt C
    float cum_co2_emi-inmcm4[time]   (Contiguous storage)  
        long_name: Cumulative carbon emissions for inmcm4
        units: Tt C
    float cum_co2_emi-IPSL-CM5A-LR[time]   (Contiguous storage)  
        long_name: Cumulative carbon emissions for IPSL-CM5A-LR
        units: Tt C
    float cum_co2_emi-IPSL-CM5A-MR[time]   (Contiguous storage)  
        long_name: Cumulative carbon emissions for IPSL-CM5A-MR
        units: Tt C
    float cum_co2_emi-IPSL-CM5B-LR[time]   (Contiguous storage)  
        long_name: Cumulative carbon emissions for IPSL-CM5B-LR
        units: Tt C
    float cum_co2_emi-MIROC-ESM[time]   (Contiguous storage)  
        long_name: Cumulative carbon emissions for MIROC-ESM
        units: Tt C
    float cum_co2_emi-MPI-ESM-LR[time]   (Contiguous storage)  
        long_name: Cumulative carbon emissions for MPI-ESM-LR
        units: Tt C
    float cum_co2_emi-MPI-ESM-MR[time]   (Contiguous storage)  
        long_name: Cumulative carbon emissions for MPI-ESM-MR
        units: Tt C
    float cum_co2_emi-NorESM1-ME[time]   (Contiguous storage)  
        long_name: Cumulative carbon emissions for NorESM1-ME
        units: Tt C
    float cum_co2_emi-GFDL-ESM2G[time]   (Contiguous storage)  
        long_name: Cumulative carbon emissions for GFDL-ESM2G
        units: Tt C
    float cum_co2_emi-GFDL-ESM2M[time]   (Contiguous storage)  
        long_name: Cumulative carbon emissions for GFDL-ESM2M
        units: Tt C

 1 dimensions:
    time  Size:140
        units: years since 0-1-1 0:0:0
        long_name: time
        standard_name: time
        calender: noleap

4 global attributes:
    description: Cumulative carbon emissions for the 1pctCO2 scenario from the CMIP5 dataset.
    history: Created Fri Jul 21 14:50:39 2017
    source: CMIP5 archieve

print(Model2) yields the following:

File MaxPrecCCCMACanESM21pctCO2.nc (NC_FORMAT_NETCDF4):

 3 variables (excluding dimension variables):
    double onedaymax[lon,lat,time]   (Contiguous storage)  
        units: mm/day
    double fivedaymax[lon,lat,time]   (Contiguous storage)  
        units: mm/day
    short Year[time]   (Contiguous storage)  

 3 dimensions:
    time  Size:140
    lat  Size:64
        units: degree North
    lon  Size:128
        units: degree East

3 global attributes:
    description: Annual global maximum precipitation from the CanESM2 1pctCO2 scenario
    history: Created Mon Jun  4 11:24:02 2018
    contact: rain1290@aim.com

So, in general, this is what I am trying to achieve, but I am not sure if what I am doing in the ggplot function is the right approach.

Any assistance with this would be greatly appreciated!

Thanks


Solution

  • It is not clear what you are really asking help for. If it has to do with getting data from the ncdf files, that focus on that. If it is about ggplot, that provide some simple data and leave out all the ncdf stuff. Also, I do not know what a "line-related plot" is (perhaps a ggplot thing?). Do you mean a scatter plot?

    To get ncdf data, you can do:

    library(raster)
    Model1 <- brick("cumulative_emissions_1pctCO2.nc", var="cum_co2_emi-CanESM2")
    Model2 <- brick("MaxPrecCCCMACanESM21pctCO2.nc", var="onedaymax") 
    latlon <- cbind(30, -5) 
    Hope1 <- extract(Model1, lonlat)
    Hope2 <- extract(Model2, lonlat)
    

    And now, perhaps:

    plot(Hope1, Hope2)