#
# start to make general function
#
sendplot <- function(mat, plot.calls, x,y, mai.mat=NA, mai.prc=FALSE,
xlim=NA, ylim=NA,z=NA,
z.value="value",type="scatterplot", plt.extras = NA,
x.lbls=NA, y.lbls=NA,
xy.lbls=NA,
x.links=NA, y.links=NA,
xy.links=NA,asLinks=NA,
bound.pt = FALSE, source.plot=NA,
resize="800x1100",
ps.paper="letter",ps.width=8,ps.height=11,
fname.root="test",dir="./", header="v2",
paint=FALSE, img.prog = NA, up.left=c(288,203),low.right=c(620,940),
spot.radius=5, automap=FALSE, automap.method="mode"
){
cat("NOTE: sendplot function is deprecated\n Please see makeSplot \n\n\n")
# figure out operating system
platform = .Platform$OS.type
# if source.plot is not specified default to appropriate file
# source plot can only by png or ps
if(is.na(source.plot) | !(source.plot=="ps" | source.plot=="png")){
if(platform == "unix") source.plot = "ps"
if(platform == "windows" | platform == "mac") source.plot = "png"
}
# set up file names
fname.ps=paste(fname.root,".ps",sep="")
fname.png=paste(fname.root,".png",sep="")
fname.tif=paste(fname.root,".tif",sep="")
fname.Dot.ps=paste(fname.root,"Dot.ps",sep="")
fname.Dot.png=paste(fname.root,"Dot.png",sep="")
fname.Dot.tif=paste(fname.root,"Dot.tif",sep="")
if(!automap){
# begin png file if flagged
if(source.plot=="png"){
wi = strsplit(resize, "x")[[1]][1]
hi = strsplit(resize, "x")[[1]][2]
png(filename=fname.png, width=as.double(wi), height=as.double(hi))
}
# begin postscript file if flagged
if(source.plot=="ps"){
postscript(file=paste(dir,fname.ps,sep=""),paper=ps.paper,width=ps.width,height=ps.height,horizontal=FALSE)
}
# initiate layout
# lcm(c())
if(max(as.vector(mat),na.rm=TRUE)>1) nf = layout(mat, respect=TRUE)
if(mai.prc) mai.def=par("mai")
# loop over plot calls to place plots in order or 1:n in layout
for(i in 1:length(plot.calls)){
if(length(mai.mat)>1){
# set up plot margins
cat("setting margins \n")
if(!mai.prc) par(mai=mai.mat[i,])
if(mai.prc) par(mai=mai.mat[i,]*mai.def)
}
# add xlim and ylim arguments to first plot if plot is scatterplot
if(i==1 & type!="image"){
plt.call = plot.calls[i]
xg = grep(pattern="xlim",plt.call)
yg = grep(pattern="ylim",plt.call)
if(length(xg)!=0 | length(yg)!=0){
stop("xlim and ylim should not be specified in plot call for first graph. Please remove these arguments from the plot call and enter as function arguments.")
}else{
if(type!="image"){
if(!exists("xlim")) xlim = range(x, na.rm=TRUE)
if(!exists("ylim")) ylim = range(y, na.rm=TRUE)
ln = nchar(plt.call)
plot.calls[i] = paste(substr(plt.call,1,ln-1),", xlim=c(",xlim[1],",",xlim[2],"), ylim=c(",ylim[1],",",ylim[2],"))",sep="")
}
}
}# end if i == 1
# plot
# evaluate plot call
plt = eval.js(plot.calls[i])
# add points to measure bounds
if(i==1 & type=="scatterplot" & bound.pt){
points(xlim[1],ylim[2], pch=22,bg="red",col="red", cex=3)
points(xlim[2],ylim[1], pch=22,bg="red",col="red", cex=3)
}
if(i==1 & type=="image" & bound.pt){
nx=length(x)
xmin=x[1]-(x[2]-x[1])/2
xmax=x[nx]+(x[nx]-x[nx-1])/2
ny=length(y)
ymin=y[1]-(y[2]-y[1])/2
ymax=y[ny]+(y[ny]-y[ny-1])/2
# changed to blue since default image colors are red and orange
points(xmin,ymax, pch=22,bg="blue",col="blue", cex=3)
points(xmax,ymin, pch=22,bg="blue",col="blue", cex=3)
}
# evaluate other plotting call if necessary
# if plt.extras is NA no plotting for all plots
if(length(plt.extras)==1){
if(is.na(plt.extras)) plt.extras = rep(NA, length(plot.calls))
}
# if there are more plots than plot extras
# specify no plotting for remaining plots
if(i>length(plt.extras)) plt.extras = rep(NA, length(plt.extras))
# cycle through all additional plot calls for current plot
sub.np = length(plt.extras[[i]])
for(sp in 1:sub.np){
if(!is.na(plt.extras[[i]][[sp]]))
eval.js(plt.extras[[i]][[sp]])
}
}# end for loop over plot calls
# turn off postscript device
dev.off()
# convert ps to png if ps was made and on unix OS
if(source.plot=="ps" & platform=="unix"){
system(paste("convert ",dir,fname.ps," -size 800x1100 -resize ",resize," ",dir,fname.png,sep=""))
}
# if flagged system call to open paint
# if first time running program to find upper left and lower right corners of main plot
if(paint){
if(is.na(img.prog)){
if(platform=="unix") system(paste("kolourpaint ", dir,fname.png," &", sep=""))
if(platform=="windows") system(paste("mspaint ", dir,fname.png," &", sep=""))
if(platform=="mac") cat("automatic open is not supported in this version for MAC OS \n")
}else{
# some other program has been specified to open png image
system(paste(img.prog, " ", dir, fname.png, " &", sep=""))
}
}
} # end if !automap
if(automap){
bound.pt = FALSE
#
# first make file with additional markers at bounding box
#
# begin png file if flagged
if(source.plot=="png"){
wi = strsplit(resize, "x")[[1]][1]
hi = strsplit(resize, "x")[[1]][2]
png(filename=fname.Dot.png, width=as.double(wi), height=as.double(hi))
}
# begin postscript file if flagged
if(source.plot=="ps"){
postscript(file=paste(dir,fname.Dot.ps,sep=""),paper=ps.paper,width=ps.width,height=ps.height,horizontal=FALSE)
}
# initiate layout
# lcm(c())
if(max(as.vector(mat),na.rm=TRUE)>1) nf = layout(mat, respect=TRUE)
if(mai.prc) mai.def=par("mai")
orig.plots = plot.calls
# loop over plot calls to place plots in order or 1:n in layout
for(i in 1:length(plot.calls)){
if(length(mai.mat)>1){
# set up plot margins
cat("setting margins \n")
if(!mai.prc) par(mai=mai.mat[i,])
if(mai.prc) par(mai=mai.mat[i,]*mai.def)
}
# add xlim and ylim arguments to first plot if plot is scatterplot
if(i==1 & type!="image"){
plt.call = plot.calls[i]
xg = grep(pattern="xlim",plt.call)
yg = grep(pattern="ylim",plt.call)
if(length(xg)!=0 | length(yg)!=0){
stop("xlim and ylim should not be specified in plot call for first graph. Please remove these arguments from the plot call and enter as function arguments.")
}else{
if(type!="image"){
if(!exists("xlim")) xlim = range(x, na.rm=TRUE)
if(!exists("ylim")) ylim = range(y, na.rm=TRUE)
ln = nchar(plt.call)
plot.calls[i] = paste(substr(plt.call,1,ln-1),", xlim=c(",xlim[1],",",xlim[2],"), ylim=c(",ylim[1],",",ylim[2],"))",sep="")
}
}
}# end if i == 1
# plot
# evaluate plot call
plt = eval.js(plot.calls[i])
# add points to measure bounds
if(i==1 & type=="scatterplot"){
points(xlim[1],ylim[2], pch=21,bg="red",col="red", cex=3)
points(xlim[2],ylim[1], pch=21,bg="red",col="red", cex=3)
}
if(i==1 & type=="image"){
nx=length(x)
xmin=x[1]-(x[2]-x[1])/2
xmax=x[nx]+(x[nx]-x[nx-1])/2
ny=length(y)
ymin=y[1]-(y[2]-y[1])/2
ymax=y[ny]+(y[ny]-y[ny-1])/2
# changed to blue since default image colors are red and orange
points(xmin,ymax, pch=21,bg="blue",col="blue", cex=3)
points(xmax,ymin, pch=21,bg="blue",col="blue", cex=3)
}
# evaluate other plotting call if necessary
# if plt.extras is NA no plotting for all plots
if(length(plt.extras)==1){
if(is.na(plt.extras)) plt.extras = rep(NA, length(plot.calls))
}
# if there are more plots than plot extras
# specify no plotting for remaining plots
if(i>length(plt.extras)) plt.extras = rep(NA, length(plt.extras))
# cycle through all additional plot calls for current plot
sub.np = length(plt.extras[[i]])
for(sp in 1:sub.np){
if(!is.na(plt.extras[[i]][[sp]]))
eval.js(plt.extras[[i]][[sp]])
}
}# end for loop over plot calls
# turn off postscript device
dev.off()
# convert ps to png if ps was made and on unix OS
if(source.plot=="ps" & platform=="unix"){
system(paste("convert ",dir,fname.Dot.ps," -size 800x1100 -resize ",resize," ",dir,fname.Dot.png,sep=""))
system(paste("convert ",dir,fname.Dot.png, " ", dir,fname.Dot.tif,sep=""))
}
# if flagged system call to open paint
# if first time running program to find upper left and lower right corners of main plot
if(paint){
if(is.na(img.prog)){
if(platform=="unix") system(paste("kolourpaint ", dir,fname.Dot.png," &", sep=""))
if(platform=="windows") system(paste("mspaint ", dir,fname.Dot.png," &", sep=""))
if(platform=="mac") cat("automatic open is not supported in this version for MAC OS \n")
}else{
# some other program has been specified to open png image
system(paste(img.prog, " ", dir, fname.Dot.png, " &", sep=""))
}
}
#
# now make file without additional markers
#
# reset plot calls (without xlim,ylim)
plot.calls = orig.plots
# begin png file if flagged
if(source.plot=="png"){
wi = strsplit(resize, "x")[[1]][1]
hi = strsplit(resize, "x")[[1]][2]
png(filename=fname.png, width=as.double(wi), height=as.double(hi))
}
# begin postscript file if flagged
if(source.plot=="ps"){
postscript(file=paste(dir,fname.ps,sep=""),paper=ps.paper,width=ps.width,height=ps.height,horizontal=FALSE)
}
# initiate layout
# lcm(c())
if(max(as.vector(mat),na.rm=TRUE)>1) nf = layout(mat, respect=TRUE)
if(mai.prc) mai.def=par("mai")
# loop over plot calls to place plots in order or 1:n in layout
for(i in 1:length(plot.calls)){
if(length(mai.mat)>1){
# set up plot margins
cat("setting margins \n")
if(!mai.prc) par(mai=mai.mat[i,])
if(mai.prc) par(mai=mai.mat[i,]*mai.def)
}
# add xlim and ylim arguments to first plot if plot is scatterplot
if(i==1 & type!="image"){
plt.call = plot.calls[i]
xg = grep(pattern="xlim",plt.call)
yg = grep(pattern="ylim",plt.call)
if(length(xg)!=0 | length(yg)!=0){
stop("xlim and ylim should not be specified in plot call for first graph. Please remove these arguments from the plot call and enter as function arguments.")
}else{
if(type!="image"){
if(!exists("xlim")) xlim = range(x, na.rm=TRUE)
if(!exists("ylim")) ylim = range(y, na.rm=TRUE)
ln = nchar(plt.call)
plot.calls[i] = paste(substr(plt.call,1,ln-1),", xlim=c(",xlim[1],",",xlim[2],"), ylim=c(",ylim[1],",",ylim[2],"))",sep="")
}
}
}# end if i == 1
# plot
# evaluate plot call
plt = eval.js(plot.calls[i])
# evaluate other plotting call if necessary
# if plt.extras is NA no plotting for all plots
if(length(plt.extras)==1){
if(is.na(plt.extras)) plt.extras = rep(NA, length(plot.calls))
}
# if there are more plots than plot extras
# specify no plotting for remaining plots
if(i>length(plt.extras)) plt.extras = rep(NA, length(plt.extras))
# cycle through all additional plot calls for current plot
sub.np = length(plt.extras[[i]])
for(sp in 1:sub.np){
if(!is.na(plt.extras[[i]][[sp]]))
eval.js(plt.extras[[i]][[sp]])
}
}# end for loop over plot calls
# turn off postscript device
dev.off()
# convert ps to png if ps was made and on unix OS
if(source.plot=="ps" & platform=="unix"){
system(paste("convert ",dir,fname.ps," -size 800x1100 -resize ",resize," ",dir,fname.png,sep=""))
system(paste("convert ",dir,fname.png, " ", dir,fname.tif,sep=""))
}
# if flagged system call to open paint
# if first time running program to find upper left and lower right corners of main plot
if(paint){
if(is.na(img.prog)){
if(platform=="unix") system(paste("kolourpaint ", dir,fname.png," &", sep=""))
if(platform=="windows") system(paste("mspaint ", dir,fname.png," &", sep=""))
if(platform=="mac") cat("automatic open is not supported in this version for MAC OS \n")
}else{
# some other program has been specified to open png image
system(paste(img.prog, " ", dir, fname.png, " &", sep=""))
}
}
#
# Now begin automatic detection of points if tif files are found
#
d = dir(dir)
dot.loc = which(d == fname.Dot.tif)
fin.loc = which(d == fname.tif)
# needs tif files for rtiff
if( (length(dot.loc) != 0) | (length(fin.loc) != 0) ){
require("rtiff")
# reads tiff files
tif.dot = readTiff(paste(dir, fname.Dot.tif,sep=""))
tif.fin = readTiff(paste(dir, fname.tif,sep=""))
# find where tifs differ
temp.loc = which(tif.dot@blue != tif.fin@blue)
temp = matrix(NA, nrow = dim(tif.dot@blue)[1], ncol =dim(tif.dot@blue)[2] )
# convert to numeric matrix
temp[which(tif.dot@blue == tif.fin@blue)] = 0
temp[which(tif.dot@blue != tif.fin@blue)] = 1
# determin column locations of where tifs differ
row.count = rowSums(temp, na.rm=TRUE)
col.loc = which(row.count>0)
# store largest break between locations to seperate lower and upper bound
len = length((col.loc[1]):(col.loc[2]))
brk = 1
for(i in 2:(length(col.loc)-1)){
l = length((col.loc[i]):(col.loc[i+1]))
if(l > len){
brk = i + 1
len = l
}
}
# start regions (columns) of potential lower and upper bound
s.reg.1 = col.loc[1]
s.reg.2 = col.loc[brk]
# full region of upper and lower bound (columns)
col.reg.1 = (col.loc[1]):(col.loc[(brk-1)])
col.reg.2 = (col.loc[brk]):(col.loc[(length(col.loc))])
#
# currently can find locations by median or mode
#
# if find by median
if(automap.method == "median"){
#
# find upper bound
#
#dx1 = floor(length(col.reg.1)/2)
#dx2 = floor(length(col.reg.2)/2)
#r1.col = col.reg.1[dx1]
# column loc is median
r1.col = floor(median(col.reg.1))
# row location is length of different in determine column
r1.row = which(temp[r1.col,]>0)[1]
add.r = floor((row.count[r1.col])/2)
up.left.row = r1.row + add.r
# add additional to compensate for row
add.c = floor((length(which(row.count[col.reg.1] == row.count[r1.col])))/2)
up.left.col = r1.col + add.c
#
# find lower bound
#
#r2.col = col.reg.2[dx2]
# column loc is median
r2.col = floor(median(col.reg.2))
# row location is length of different in determine column
r2.row = which(temp[r2.col,]>0)[1]
add2.r = floor((row.count[r2.col])/2)
low.right.row = r2.row + add2.r
# add additional to compensate for row
add2.c = floor((length(which(row.count[col.reg.2] == row.count[r2.col])))/2)
low.right.col = r2.col + add2.c
} # end if median
# if find by mode (default)
if(automap.method == "mode"){
#
# find upper bound
#
# finds which length repeats most often
vec = row.count[col.reg.1]
u = unique(vec)
fr = u[1]
len = length(which(vec == fr))
for(i in u[-1]){
c = length(which(vec == i))
if(c > len){
fr = i
len = c
}
}
# column is which repeats most often
r1.col = which(row.count == fr)[1]
# row location is length of different in determine column
r1.row = which(temp[r1.col,]>0)[1]
add.r = floor(fr/2)
up.left.row = r1.row + add.r
# add additional to compensate for row
add.c = floor((len/2))
up.left.col = r1.col + add.c
# if no row repeats, uses median method
if(len == 1){
#dx1 = floor(length(col.reg.1)/2)
#r1.col = col.reg.1[dx1]
# column loc is median
r1.col = floor(median(col.reg.1))
# row location is length of different in determine column
r1.row = which(temp[r1.col,]>0)[1]
add.r = floor((row.count[r1.col])/2)
up.left.row = r1.row + add.r
# add additional to compensate for row
add.c = floor((length(which(row.count[col.reg.1] == row.count[r1.col])))/2)
up.left.col = r1.col + add.c
}
#
# lower bound
#
# finds which length repeats most often
vec2 = row.count[col.reg.2]
u2 = unique(vec2)
fr2 = u2[1]
len2 = length(which(vec2 == fr2))
for(i2 in u2[-1]){
c2 = length(which(vec2 == i2))
if(c2 > len2){
fr2 = i2
len2 = c2
}
}
# column is which repeats most often
r2.col = which(row.count == fr2)
r2.col = r2.col[which(r2.col > (s.reg.1 + length(col.reg.1)))][1]
# row location is length of different in determine column
r2.row = which(temp[r2.col,]>0)[1]
add2.r = floor(fr2/2)
low.right.row = r2.row + add2.r
# add additional to compensate for row
add2.c = floor((len2/2))
low.right.col = r2.col + add2.c
# if no row repeats, uses median method
if(len2 == 1){
#dx2 = floor(length(col.reg.2)/2)
#r2.col = col.reg.2[dx2]
# column loc is median
r2.col = floor(median(col.reg.2))
# row location is length of different in determine column
r2.row = which(temp[r2.col,]>0)[1]
add2.r = floor((row.count[r2.col])/2)
low.right.row = r2.row + add2.r
# add additional to compensate for row
add2.c = floor((length(which(row.count[col.reg.2] == row.count[r2.col])))/2)
low.right.col = r2.col + add2.c
}
} # end if mode
# set bound points
up.left=c(up.left.row,up.left.col)
low.right=c(low.right.row,low.right.col)
cat(paste("The bounding locations are:\n up.left: ", up.left.row, ", ", up.left.col,"\n
low.right: ", low.right.row, ", ", low.right.col, "\n"))
}else{ # ends if tif files found
#
# Currently needs tif files for automatic recognition
# Linux can convert
# Windows cannot convert automatically needs user to convert PNG to tif
# else run manual detection of bounds
#
bound.pt = TRUE
cat("automatic points only fully functional on unix machines \n")
cat("one of the required tif files is not found \n")
cat("Two options: \n")
cat(" 1. convert \n")
cat(paste(" ", dir,fname.png," to ", dir,fname.tif,"\n",sep=""))
cat(" AND \n")
cat(paste(" ", dir,fname.Dot.png, " to ", dir,fname.Dot.tif,"\n",sep=""))
cat(" and run function again \n")
cat(" OR \n")
cat(" 2. find bounding points manually. See vignette for help \n")
} # ends if tif files not found
} # end automap
# if flagged make interactive html
if(!bound.pt){
# set up data frame of information
# information in this data frame will be displayed for points in interactive window
if(type=="scatterplot"){
# estimate pixil location
x.new = round(up.left[1] + ((x-xlim[1])/(xlim[2]-xlim[1]))*(low.right[1]-up.left[1]))
y.new = round(up.left[2] + ((ylim[2]-y)/(ylim[2]-ylim[1]))*(low.right[2]-up.left[2]))
# initiate data frame
dat = data.frame(
# pixil locations
pix.x = x.new,
pix.y =y.new
)
dat2 = data.frame(rep(NA, (dim(dat)[1])))
names(dat2) = "tempNA"
# x specific data
contx = TRUE
x.lbls = as.data.frame(x.lbls)
if( (dim(x.lbls)[1]==1) & (dim(x.lbls)[2]==1)){
if(is.na(x.lbls[1,1])) contx = FALSE
}
# dimension check
if(contx){
if((dim(x.lbls)[1] != length(x)) & contx){
contx = FALSE
cat(paste("Warning: x.lbls does not have correct dimensions \n number of rows should equal length(x):",length(x), "\n Continuing with x.lbls = NA", sep=""))
x.lbls = NA
}
}
# if x.lbls is not NA continue
if(contx){
for(i in 1:dim(x.lbls)[2]){
if(i == 1) z.value = names(x.lbls)[i]
eval.js(paste("dat$",names(x.lbls)[i], "=as.vector(x.lbls[,i])", sep=""))
}
}
# y specific data
conty = TRUE
y.lbls = as.data.frame(y.lbls)
if( (dim(y.lbls)[1]==1) & (dim(y.lbls)[2]==1)){
if(is.na(y.lbls[1,1])) conty = FALSE
}
# dimension check
if((dim(y.lbls)[1] != length(y)) & conty){
conty = FALSE
cat(paste("Warning: y.lbls does not have correct dimensions \n number of rows should equal length(y):",length(y), "\n Continuing with y.lbls = NA", sep=""))
y.lbls = NA
}
# if y.lbls is not NA continue
if(conty){
for(i in 1:dim(y.lbls)[2]){
if((i == 1) & !contx) z.value = names(y.lbls)[i]
eval.js(paste("dat$",names(y.lbls)[i], "=as.vector(y.lbls[,i])", sep=""))
}
}
# xy -- assumes in this case that columns are different data vectors of row == nsmpls
contxy = TRUE
xy.lbls = as.data.frame(xy.lbls)
if( (dim(xy.lbls)[1]==1) & (dim(xy.lbls)[2]==1)){
if(is.na(xy.lbls[1,1])) contxy = FALSE
}
# dimension check
if(((dim(xy.lbls)[1] != length(y)) | (dim(xy.lbls)[1] != length(x))) & contxy){
contxy = FALSE
cat(paste("Warning: xy.lbls does not have correct dimensions \n number of rows should equal length(y):",length(y), " or length(x):", length(x), "\n Continuing with xy.lbls = NA", sep=""))
xy.lbls = NA
}
# if xy.lbls is not NA continue
if(contxy){
for(i in 1:dim(xy.lbls)[2]){
if((i == 1) & !contx & !conty) z.value = names(xy.lbls)[i]
eval.js(paste("dat$",names(xy.lbls)[i], "=as.vector(xy.lbls[,i])", sep=""))
}
}
# if all: x.lbls, y.lbls, and xy.lbls were NA no data to display
# set up dummy vector with blanks
if(!contx & !conty & !contxy){
eval.js(paste("dat$", z.value, "=rep('',dim(dat)[2])",sep=""))
}
# if x specific hyperlinks
cont = TRUE
x.links = as.data.frame(x.links)
if( (dim(x.links)[1]==1) & (dim(x.links)[2]==1)){
if(is.na(x.links[1,1])) cont = FALSE
}
# dimension check
if(cont){
if(dim(x.links)[1] != length(x)){
cont = FALSE
cat(paste("Warning: x.lbls.link does not have correct dimensions \n number of rows should equal length(x):",length(x), "\n Continuing with x.links = NA", sep=""))
x.links = NA
}
}
# if x.links is not NA
if(cont){
# for each column get links
for(i in 1:dim(x.links)[2]){
eval.js("temp=as.vector(x.links[,i])")
# for each points link
for(j in 1:length(temp)){
tmp = temp[j]
# if not NA
if(is.na(tmp)){
temp[j] = NA
# split multiple links...assumed seperated by a comma
}else{
links = strsplit(tmp, split=",")[[1]]
new.t = " "
for(l in 1:length(links)){
new.t = paste(new.t, paste("<a href=\\'", gsub(links[l], pattern=" ", replacement=""), "\\'> ", paste((names(x.links)[i]),l, sep="."), " </a>", sep=""), sep=",")
}
new.t = gsub(new.t, pattern=" ,", replacement="")
temp[j] = new.t
}
}
# put link in correct syntax into character matrix
eval.js(paste("dat2$", names(x.links)[i], "=temp", sep=""))
}
}
# if y specific hyperlinks
cont = TRUE
y.links = as.data.frame(y.links)
if( (dim(y.links)[1]==1) & (dim(y.links)[2]==1)){
if(is.na(y.links[1,1])) cont = FALSE
}
# dimension check
if(cont){
if(dim(y.links)[1] != length(y)){
cont = FALSE
cat(paste("Warning: y.lbls.link does not have correct dimensions \n number of rows should equal length(y):",length(y), "\n Continuing with y.links = NA", sep=""))
y.links = NA
}
}
# if y.links is not NA
if(cont){
# for each column get links
for(i in 1:dim(y.links)[2]){
eval.js("temp=as.vector(y.links[,i])")
# for each points link
for(j in 1:length(temp)){
tmp = temp[j]
# if not NA
if(is.na(tmp)){
temp[j] = NA
# split multiple links...assumed seperated by a comma
}else{
links = strsplit(tmp, split=",")[[1]]
new.t = " "
for(l in 1:length(links)){
new.t = paste(new.t, paste("<a href=\\'", gsub(links[l], pattern=" ", replacement=""), "\\'> ", paste((names(y.links)[i]),l, sep="."), " </a>", sep=""), sep=",")
}
new.t = gsub(new.t, pattern=" ,", replacement="")
temp[j] = new.t
}
}
# put link in correct syntax into character matrix
eval.js(paste("dat2$", names(y.links)[i], "=temp", sep=""))
}
}
# if xy specific hyperlinks
cont = TRUE
xy.links = as.data.frame(xy.links)
if( (dim(xy.links)[1]==1) & (dim(xy.links)[2]==1)){
if(is.na(xy.links[1,1])) cont = FALSE
}
# dimension check
if(((dim(xy.links)[1] != length(y)) | (dim(xy.links)[1] != length(x))) & cont){
cont = FALSE
cat(paste("Warning: xy.links does not have correct dimensions \n number of rows should equal length(y):",length(y), " or length(x):", length(x), "\n Continuing with xy.links = NA", sep=""))
xy.links = NA
}
# if xy.links is not NA
if(cont){
# for each column get links
for(i in 1:length(xy.links)){
eval.js("temp=as.vector(xy.links[,i])")
# for each points link
for(j in 1:length(temp)){
tmp = temp[j]
# if not NA
if(is.na(tmp)){
temp[j] = NA
# split multiple links...assumed seperated by a comma
}else{
links = strsplit(tmp, split=",")[[1]]
new.t = " "
for(l in 1:length(links)){
new.t = paste(new.t, paste("<a href=\\'", gsub(links[l], pattern=" ", replacement=""), "\\'> ", paste((names(xy.links)[i]),l, sep="."), " </a>", sep=""), sep=",")
}
new.t = gsub(new.t, pattern=" ,", replacement="")
temp[j] = new.t
}
}
# put link in correct syntax into character matrix
eval.js(paste("dat2$", names(xy.links)[i], "=temp", sep=""))
}
}
# get points as Links information
contLinks = TRUE
# if data frame convert to matrix
if(class(asLinks) == "data.frame") asLinks = as.matrix(asLinks)
# if matrix convert to vector
if(class(asLinks) == "matrix") asLinks = as.vector(asLinks)
# if single entry assume same for all points
if((length(asLinks) == 1) & !is.na(asLinks[1])) asLinks = rep(asLinks, length(x))
# convert to character vector
asLinks = as.character(asLinks)
# check dimensions
if((length(asLinks) != length(x)) & !is.na(asLinks[1])){
cat("Warning: cannot create points as links \n length must be equal to x or y \n")
contLinks = FALSE
}
}# end if scatterplot
if(type=="image"){
# calculate width and height of active image
wdth=low.right[1]-up.left[1]
hght=low.right[2]-up.left[2]
# get min and max x values for image
nx=length(x)
xmin=x[1]-(x[2]-x[1])/2
xmax=x[nx]+(x[nx]-x[nx-1])/2
# calculate cuts and center of x values on image
bndrs=c(xmin,(x[1:(nx-1)]+x[2:nx])/2,xmax)
cntrs=(bndrs[1:(length(bndrs)-1)]+bndrs[2:length(bndrs)])/2
# adjust
unit.int.wdth=cntrs-xmin
unit.int.wdth=unit.int.wdth/(xmax-xmin)
# calculate pixil positions
x.image=round(unit.int.wdth*wdth+up.left[1])
# get min and max y values for image
ny=length(y)
ymin=y[1]-(y[2]-y[1])/2
ymax=y[ny]+(y[ny]-y[ny-1])/2
# calculate cuts and centers of y values on image
bndrs=c(ymin,(y[1:(ny-1)]+y[2:ny])/2,ymax)
cntrs=(bndrs[1:(length(bndrs)-1)]+bndrs[2:length(bndrs)])/2
# adjust
unit.int.hght=cntrs-ymin
unit.int.hght=unit.int.hght/(ymax-ymin)
# calculate pixil positions
y.image= round((1-unit.int.hght)*hght+up.left[2])
# initiate data frame of info
dat = data.frame(
# pixil locations
pix.x = as.vector(mapply(rep,x=x.image,MoreArgs=list(times=length(y.image)))),
pix.y = rep(y.image, length(x.image))
)
dat2 = data.frame(rep(NA, (length(y.image)*length(x.image))))
names(dat2) = "tempNA"
# xy specific data
eval.js(paste("dat$",z.value,"=as.vector(z)",sep=""))
# x specific data
cont = TRUE
x.lbls = as.data.frame(x.lbls)
if( (dim(x.lbls)[1]==1) & (dim(x.lbls)[2]==1)){
if(is.na(x.lbls[1,1])) cont = FALSE
}
# dimension check
if(cont){
if(dim(x.lbls)[1] != length(x)){
cont = FALSE
cat(paste("Warning: x.lbls does not have correct dimensions \n number of rows should equal length(x):",length(x), "\n Continuing with x.lbls = NA", sep=""))
x.lbls = NA
}
}
# if x.lbls is not NA continue
if(cont){
for(i in 1:dim(x.lbls)[2]){
eval.js(paste("dat$",names(x.lbls)[i], "=as.vector(mapply(rep,x=x.lbls[,i], MoreArgs=list(times=length(y.image))))", sep=""))
}
}
# y specific data
cont = TRUE
y.lbls = as.data.frame(y.lbls)
if( (dim(y.lbls)[1]==1) & (dim(y.lbls)[2]==1)){
if(is.na(y.lbls[1,1])) cont = FALSE
}
# dimension check
if(cont){
if(dim(y.lbls)[1] != length(y)){
cont = FALSE
cat(paste("Warning: y.lbls does not have correct dimensions \n number of rows should equal length(y):",length(y), "\n Continuing with y.lbls = NA", sep=""))
y.lbls = NA
}
}
# if y.lbls is not NA continue
if(cont){
for(i in 1:dim(y.lbls)[2]){
eval.js(paste("dat$",names(y.lbls)[i], "=rep(y.lbls[,i],length(x.image))", sep=""))
}
}
cont = TRUE
if(is.na(xy.lbls[1])) cont = FALSE
# if xy.lbls is not NA continue
if(cont){
for(i in 1:length(xy.lbls)){
# check dimension
if((dim(xy.lbls[[i]])[2] == length(x)) & (dim(xy.lbls[[i]])[1] == length(y))){
eval.js(paste("dat$",names(xy.lbls)[i],"=as.vector(xy.lbls[[i]])", sep=""))
}else{
cat(paste("Warning: at least one of the xy.lbls matricies are not of the correct dimension. \n All should be of the dimension ",length(x), " by ", length(y), "\n", sep=""))
}
}
}
# x specific hyperlinks
cont = TRUE
x.links = as.data.frame(x.links)
if( (dim(x.links)[1]==1) & (dim(x.links)[2]==1)){
if(is.na(x.links[1,1])) cont = FALSE
}
# dimension check
if(cont){
if(dim(x.links)[1] != length(x)){
cont = FALSE
cat(paste("Warning: x.links does not have correct dimensions \n number of rows should equal length(x):",length(x), "\n Continuing with x.links = NA", sep=""))
x.links = NA
}
}
# if x.links is not NA
if(cont){
# for each column get links
for(i in 1:dim(x.links)[2]){
eval.js("temp=as.vector(mapply(rep,x=x.links[,i], MoreArgs=list(times=length(y.image))))")
# for each points link
for(j in 1:length(temp)){
tmp = temp[j]
# if not NA
if(is.na(tmp)){
temp[j] = NA
# split multiple links...assumed seperated by a comma
}else{
links = strsplit(tmp, split=",")[[1]]
new.t = " "
for(l in 1:length(links)){
new.t = paste(new.t, paste("<a href=\\'", gsub(links[l], pattern=" ", replacement=""), "\\'> ", paste((names(x.links)[i]),l, sep="."), " </a>", sep=""), sep=",")
}
new.t = gsub(new.t, pattern=" ,", replacement="")
temp[j] = new.t
}
}
# put correctly syntaxed link in matrix
eval.js(paste("dat2$", names(x.links)[i], "=temp", sep=""))
}
}
# y specific hyperlinks
cont = TRUE
y.links = as.data.frame(y.links)
if( (dim(y.links)[1]==1) & (dim(y.links)[2]==1)){
if(is.na(y.links[1,1])) cont = FALSE
}
# dimension check
if(cont){
if(dim(y.links)[1] != length(y)){
cont = FALSE
cat(paste("Warning: y.links does not have correct dimensions \n number of rows should equal length(y):",length(y), "\n Continuing with y.links = NA", sep=""))
y.links = NA
}
}
# if y.links is not NA
if(cont){
# for each column get links
for(i in 1:dim(y.links)[2]){
eval.js("temp=as.vector(rep(y.links[,i],length(x.image)))")
# for each points link
for(j in 1:length(temp)){
tmp = temp[j]
# if not NA
if(is.na(tmp)){
temp[j] = NA
# split multiple links...assumed seperated by a comma
}else{
links = strsplit(tmp, split=",")[[1]]
new.t = " "
for(l in 1:length(links)){
new.t = paste(new.t, paste("<a href=\\'", gsub(links[l], pattern=" ", replacement=""), "\\'> ", paste((names(y.links)[i]),l, sep="."), " </a>", sep=""), sep=",")
}
new.t = gsub(new.t, pattern=" ,", replacement="")
temp[j] = new.t
}
}
# put correctly syntaxed link in matrix
eval.js(paste("dat2$", names(y.links)[i], "=temp", sep=""))
}
}
# xy specific hyperlinks
cont = TRUE
if(is.na(xy.links[1])) cont = FALSE
# if xy.links is not NA
if(cont){
# for each matrix of links
for(i in 1:length(xy.links)){
eval.js("temp=xy.links[[i]]")
# check dimensions
if((dim(temp)[2] == length(x)) & (dim(temp)[1] == length(y))){
temp = as.vector(temp)
# for each points link
for(j in 1:length(temp)){
tmp = temp[j]
# if not NA
if(is.na(tmp)){
temp[j] = NA
# split multiple links...assumed seperated by a comma
}else{
links = strsplit(tmp, split=",")[[1]]
new.t = " "
for(l in 1:length(links)){
new.t = paste(new.t, paste("<a href=\\'", gsub(links[l], pattern=" ", replacement=""), "\\'> ", paste((names(xy.links)[i]),l, sep="."), " </a>", sep=""), sep=",")
}
new.t = gsub(new.t, pattern=" ,", replacement="")
temp[j] = new.t
}
}
# put correctly syntaxed link in matrix
eval.js(paste("dat2$", names(xy.links)[i], "=temp", sep=""))
}else{
cat(paste("Warning: at least one of the xy.links matricies are not of the correct dimension. \n All should be of the dimension ",length(x), " by ", length(y), "\n", sep=""))
}
}
}
# get points as Links information
contLinks = TRUE
# if data frame convert to matrix
if(class(asLinks) == "data.frame") asLinks = as.matrix(asLinks)
# if matrix convert to vector
if(class(asLinks) == "matrix") asLinks = as.vector(asLinks)
# repeat values if necessary
if(length(asLinks) == length(x)) asLinks = rep(asLinks, each=length(y))
if(length(asLinks) == length(y)) asLinks = rep(asLinks, length(x))
if((length(asLinks) == 1) & !is.na(asLinks[1])) asLinks = rep(asLinks, (length(x)*length(y)))
# convert to character vector for easy access
asLinks = as.character(asLinks)
# check dimension
if((length(asLinks) != (length(x)*length(y))) & !is.na(asLinks[1])){
cat("Warning: cannot create points as links \n length must be equal to x or y or dimensions equal to x*y \n")
contLinks = FALSE
}
}#end if image
if(header!="v1" & header!="v2" ) header="v2"
# mapfile header info
if(header=="v2") sp.header=sp.header2 #data(v2.header)
if(header=="v1") sp.header=sp.header1 #data(v1.header)
sp.header=sp.header
# update dat into character array to make writing more efficient
cdat=array(" ",dim=dim(dat))
ndat=rep(" ",dim(dat)[2])
for(j in 1:(dim(dat)[2])){
cdat[,j]=as.character(dat[,j])
ndat[j]=names(dat)[j]
}
if(header == "v1"){
cat("Note: hyperlinks only work with header=v2 \n")
}else{
cdat2=array(" ",dim=dim(dat2))
ndat2=rep(" ",dim(dat2)[2])
for(j in 1:(dim(dat2)[2])){
cdat2[,j]=as.character(dat2[,j])
ndat2[j]=names(dat2)[j]
}
# combined information data frame and hyper link data frame
if(dim(cdat2)[2] > 1){
cdat = cbind(cdat, cdat2[,2:dim(cdat2)[2]])
ndat = c(ndat, ndat2[2:length(ndat2)])
}
links.st = (dim(dat)[2])+1
}
# begin html file
sink(paste(dir,fname.root,".html",sep=""))
# add header information
for(i in 1:length(sp.header)) cat(sp.header[i],fill=TRUE)
# add data point info
for(i in 1:(dim(dat)[1])){
if(header=="v1"){
ctmp=paste("<area shape=\"circle\" coords=\"",cdat[i,1],",",cdat[i,2],
",",spot.radius,"\" onmouseover=\"setData(\'",z.value," : ",
cdat[i,3],sep="")
if(dim(dat)[2]>3){
for(j in 4:(dim(dat)[2])){
ctmp = paste(ctmp, "<br> ",ndat[j],"&nbsp;&nbsp;:&nbsp;",
cdat[i,j],sep="")
}
}
ctmp = paste(ctmp, "\')\" onMouseOut=\"clearData();\" />",sep="")
}# end if header==v1
if(header=="v2"){
ctmp=paste("<area shape=\"circle\" coords=\"",cdat[i,1],",",cdat[i,2],
",",spot.radius,"\" onmouseover=\"Tip(\'",z.value," : ",
cdat[i,3],sep="")
if(dim(cdat)[2]>3){
if(dim(dat)[2]>3){
for(j in 4:(links.st-1)){
ctmp = paste(ctmp, "<br> ",ndat[j],"&nbsp;&nbsp;:&nbsp;",
cdat[i,j],sep="")
}
}
linkFlag = FALSE
if(dim(dat2)[2] > 1){
for(j in links.st:(dim(cdat)[2])){
if(!is.na(cdat[i,j])){
linkFlag = TRUE
ctmp = paste(ctmp, "<br> ",ndat[j],":", cdat[i,j],sep="")
}
}
}
}else{
linkFlag = FALSE
}
if(linkFlag) ctmp = paste(ctmp, "\', STICKY,true,CLICKCLOSE,true,CLOSEBTN,false)\" ",sep="")
if(!linkFlag) ctmp = paste(ctmp, "\')\" ",sep="")
if(contLinks){
link = asLinks[i]
if(!is.na(link)){
ctmp = paste(ctmp, " href=\" ", link, "\" target=\"blank\" ", sep="")
}
}
ctmp = paste(ctmp, " />", sep="")
}# end if header==v2
cat(ctmp,fill=TRUE)
}
cat("</map>",fill=TRUE)
cat("<div class=\"plot\">",fill=TRUE)
if(header=="v1")cat("<img border=\"0\" src=\"",fname.png,"\" usemap=\"img-map\" />",sep="",fill=TRUE)
if(header=="v2")cat("<img border=\"0\" src=\"",fname.png,"\" usemap=\"#img-map\" />",sep="",fill=TRUE)
cat("</div>",fill=TRUE)
cat("</body>",fill=TRUE)
cat("</html>",fill=TRUE)
sink()
}# end if bound.pt
}# end sendHeat function
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.