Climate Charts & Graphs Cleanup Progressing

Just a quick not to my blog visitors that I have been working to update my blog to show current climate data charts and to address missing charts and files.

I’ve been keeping many of my source data files, R scripts and images on another web site. this has made the routine maintenance more cumbersome than necessary.

My plan is to have all of my climate chart material self contained in one blog rather than store it on another web site. The transfer process will be causing some hiccups along the way.

I have removed a few older posts to simplify my blog maintenance. I still have some links to blank pages that I will try to cleanup in the next few weeks. If you find a missing data file or plot, let me know and I’ll try to get it restored.

Arctic Amplification – November, 2013: Updated 12/20/13

Updated (bold italic) 12/20/13 to reflect comments from David. 

NASA’s GISS temperature anomaly map (link) for November, 2013 is reproduced  below. It uses a 2×2 degree grid cell for the globe. 

GISS_anom_map_11_13

The November, 2013 GISS temperature anomaly shows the critical global pattern that is important to recognize because it is fundamental to understanding why global warming is so dangerous.

First, the overall global anomaly for November, 2013 was 0.77 degrees C.  The 2 degree latitude zone mean anomaly varied from a low of 0.068 to a high of 2.33. So the mean global anomaly does not tell the full story, we need to look at the geographical distribution to really understand the global warming pattern.

As we examine the geographical distribution of the November, 2013 anomalies, we see that they tend to increase as we move from the equator toward the poles.  This pattern,  called polar amplification, means that the polar regions, particularly the Arctic region, warms much more rapidly than the overall global mean.

I developed this chart in R to display the mean zonal anomalies by 2 degree latitude zones to help me visualize the November, 2013 anomaly patterns.

art_amp

Here is the R Script that I used to produce the chart.
#### GISS Temperature Anomaly - Zonal mean by 2 degree latitude
##K O'Day, Dec. 18, 2013
##############################################################################################################################
 link <- c("http://data.giss.nasa.gov/tmp/gistemp/NMAPS/tmp_GHCN_GISS_ERSST_1200km_Anom11_2013_2013_1951_1980/nmaps_zonal.txt")
 mon <- "November, 2013"
 title <- paste("Mean Temperature Anomaly by 2 Degree Latitude Zones\n", mon, sep="" )
 note_1 <- "GISS Temperature Anomaly\n (1951-1980 base period)"
 df <- read.table(link, skip=4)
 par(las=1, oma=c(3,1,1,1), mar=c(5,5,3,1), ps=11)
 names(df)<- c("Zone", "Anom")
 #png(file="C://R_Home//Charts & Graphs Blog//RClimateTools//a_Revised_Blog//art_amp.png", bg="white")

 plot(df$Anom, df$Zone, xlim=c(0,3), ylim=c(-90,90), type="l", axes=F, xlab="Mean Anomaly for Zone - C",
      ylab = "Latitude",  xaxs="i", yaxs = "i", main=title)
   axis(1, at=NULL)
   axis(2, at=c(-90,-60,-30,0,30,60,90))
   abline(h=40, col="green")
   abline(h=0, col="darkgrey")
   abline(v=0.77,col = "black" )
   abline(h=64, col="blue")
   text(2.5, 43.5, "Philadelphia, Pa.", cex=0.7)
   text(2.7, 67, "Reykjavík, Iceland", cex=0.7)
   text(2.25, -20, note_1, cex=0.75, adj=0)
   rect(0.6,-65,0.85 , -50, col = "white", border = "white")
   text(0.77, -60, "Global Mean @ \n0.77 C", cex=0.7)
 mtext("D Kelly O'Day - http://chartsgraphs.wordpress.com", 1,1, adj = 0, cex = 0.8, outer=T)
 mtext(format(Sys.time(), "%m/%d/ %Y"), 1, 1, adj = 1, cex = 0.8, outer=T)
# dev.off()

Pardon My Absence

I’ve been busy on other projects and have not been maintaining this blog.  For the past 2 years I’ve been working on local (Philadelphia) environmental issues and simply did not have the time to keep up with my climate charts.

I am reactivating this blog with a renewed sense of purpose. I will be cleaning up the blog, prioritizing and streamlining the site. Please bear with this clean-up effort.

Romney’s Views on Coal: Bad for Americans’ Health, the Enviroment and the Climate

Let’s look at a recent Romney campaign ad to get a sense for his views: Continue reading

Global Warming and 2012 Presidential Election

Mitt Romney and Barak Obama’s views on global warming, in their own words. Continue reading

Animated Images of Arctic Sea Ice Extent Decline

This post shows how to download and animate a series of Arctic Sea Ice Extent images using R and the animation package.

Continue reading

R Script to Build Animation of Arctic Sea Ice Extent – Update 12/20/13

In my previous post I showed an animation of Arctic Sea Ice Extent from the 1980’s through August, 2012 (link).  In this post, I show how to build this Arctic Sea ice Extent  animated chart.

Source Data

The Arctic Ice Sea Monitor (link)   updates their daily csv file with the latest satellite based arctic sea ice measurements.  Here is the daily csv file link.

R script

To develop my animation of the daily Arctic Sea Ice extent, I decided to produce a plot for each year that showed the current year in red and the previous years in grey.  I go this idea from Tamino at Open Mind.

Here is my R script:
Be sure to set your working directory to appropriate location!!

library(animation)
  ani.options(convert=shQuote('C:\\Program Files (x86)\\ImageMagick-6.7.9-Q16\\convert.exe'))
## Use setwd() to specify directory where you want png images to be saved
  setwd("<strong>C:\\R_Home\\Charts & Graphs Blog\\RClimateTools\\Arctic_sea-ice_extent</strong><em>")
# use png_yn to toggle between plot output to png file or screen
  png_yn <- "y"
# Establish chart series patterns and colors to be able to distinguish current yr from previous years in plot
  pattern <- c(rep("dashed", 5), rep("solid", 12))
  ser_col <- c(rep("black",5),rep("grey",12))
# Establish chart annotations for date, chart title,
  what_date <- format(Sys.Date(), "%b %d, %Y")  # with month as a word
  title <- paste("IARC-JAXA Daily Arctic Sea Ice Extent*\n", what_date)
  note_1 <- "*Extent - Area of Ocean with at least 15% Sea Ice"
  par(oma=c(2,1,1,1)); par(mar=c(2,4,2,1))
#  Day of year axis setup
## Set up basic day of year vectors (mon_names, 1st day of mon)
  mon_names <- c("Jan", "Feb", "Mar", "April", "May", "June", "July", "Aug", "Sept", "Oct","Nov","Dec")
  mon_doy <- c(1,32,60,91,121,151,182,213,244,274,305,335,366)
  mon_pos <- c(16, 46, 75, 106,135, 165, 200, 228, 255, 289, 320, 355)
# Read JAXA Arctic Sea ice Extent csv file
# Data File: Month,Day,1980's Avg,1990's Avg,2000's Average,2002:2012
  link <- "http://www.ijis.iarc.uaf.edu/seaice/extent/plot.csv"
  j_data <- read.csv(link, header = F, skip=1, na.strings = c(-9999))
 series_id <-  c("mo", "day", "1980s", "1990s", "2000s","2002", "2003", "2004", "2005", "2006", "2007", "2008", "2009",
                "2010", "2011", "2012", "2013")
 colnames(j_data) <- series_id
# File has data for each day in 366 day year
# Establish Day of year
  for (i in 1:366)   j_data$yr_frac[i] <- i
    #convert ASIE to millions Km^2
   j_data[,c(3:17)] <- j_data[,c(3:17)]/1000000
# Loop through years
   for (j in 3:17)
  {
     png_name <- paste("asie",series_id[j],".png",sep="")
      if (png_yn =="y") png(filename=png_name)
      which_yr <- j
      no_yrs <- j
  # Calc min asie for year
    min_asie <- min(j_data[,j], na.rm = T)  # must remove na's to get valid answer
    lab_asie <- round(min_asie,3)
    min_r <- which(j_data[,j] == min_asie)
    min_d <- j_data[min_r,2]
    min_m <- j_data[min_r,1]
    min_date <- paste(min_m,"/",min_d,"/",series_id[j], sep="")
    plot(j_data[,17],  type="n", col = "grey",axes=F, xlab="",
       ylab="Arctic Sea Ice Extent - Millions Sq KM",
       ylim=c(0,15),xaxs="i", yaxs = "i",
       main=title)
    text(20, 1.5, note_1, cex = 0.8, adj=0, col = "black")
    text(20,1,"Data Source: http://www.ijis.iarc.uaf.edu/seaice/extent/plot.csv", cex = 0.8, adj=0,col = "black")
    mtext("D Kelly O'Day - http://chartsgraphs.wordpress.com", 1,0.5, adj = 0, cex = 0.8, outer=T)
  # custom x & y axes
    axis(side = 1, at=mon_doy, labels=F, xaxs="i")
    axis(side=1, at= mon_pos, labels=mon_names, tick=F, line=F, xaxs="i")
    axis(side=2,  yaxs="i", las=1)
    points(70, min_asie, col = "red",pch=19, cex = 2)
  # Add each previous yr data series as light grey line
  for (n in 3:no_yrs)
  {
    points(j_data[,18], j_data[,n], type="l",lwd=1,lty=pattern[j], col=ser_col[j])
    text(182,14,series_id[j], col = "red", cex = 1.1)
  }
  points(j_data[,18], j_data[,j], col="red", type="l",lwd=2.5)
  text(182,14,series_id[j], col = "red", cex = 1.1)
  text(120,min_asie+0.5, min_date, col="red", cex=0.9)
  text(120,min_asie, lab_asie, col="red", cex=0.9)
  if(png_yn == "y") dev.off()
}
## copy last png file 3 times to provide pause in animation
if(png_yn== "y")
{
  for (c in 1:2)
  {
    file_name <- paste("asie2012",c, ".png",sep="")
    file.copy(from= "asie2012.png", to = file_name, overwrite=T)
  }
  ani.options(outdir = getwd())    # direct gif output file to working dir
  ani.options(interval= 0.80)
  im.convert("asie*.png", "last_animation.gif")
}