4

私は、さまざまな場所にいる複数の個人の観測頻度 (パーセンテージ) を示すバブル プロットをいくつか作成しようとしています。一部の個体は同じサイトで見つかりましたが、すべてではありませんでした。また、各サイト内の場所の数は個人によって異なる場合があります。私の主な問題は、私が 3 人以上の個人と 3 つ以上のサイトを持っていることです。そのため、このタイプのバブル プロット/凡例を作成するための優れた/迅速な方法を考え出そうとしています。新しいプロットを作成するときに凡例を同じ場所に配置する関数が必要なため、凡例にも問題があります。凡例では、周波数ごとに異なるバブル サイズを表示したいと考えています (可能であれば、バブルの横に値を示します)。

これが私のスクリプトの例です。これを行う方法に関する提案やアイデアは非常に役立ちます。

# require libraries
library(maptools)
library(sp)

data<-read.table(text="ind  lat   long    site    freq    perc
             A  -18.62303   147.29207   A   449 9.148329258
             A  -18.6195    147.29492   A   725 14.77180114
             A  -18.62512   147.3018    A   3589    73.12550937
             A  -18.62953   147.29422   A   145 2.954360228
             B  -18.75383   147.25405   B   2   0.364963504
             B  -18.73393   147.28162   B   1   0.182481752
             B  -18.62303   147.29207   A   3   0.547445255
             B  -18.6195    147.29492   A   78  14.23357664
             B  -18.62512   147.3018    A   451 82.29927007
             B  -18.62953   147.29422   A   13  2.372262774
             C  -18.51862   147.39717   C   179 0.863857922
             C  -18.53281   147.39052   C   20505   98.95757927
             C  -18.52847   147.40167   C   37  0.178562811",header=TRUE)

# Split data frame for each tag
ind<-data$ind
M<-split(data,ind)
l<-length(M)

### Detection Plots ###

pdf("Plots.pdf",width=11,height=8,paper="a4r")
par(mfrow=c(1,1))

for(j in 1:l){

   # locations

   new.data<-M[[j]]
   site<-as.character(unique(new.data$site))

   fname<-paste(new.data$ind[1],sep="")
   loc<-new.data[,c("long","lat")]
   names(loc)<-c("X", "Y")
   coord<-SpatialPoints(loc)
   coord1<-SpatialPointsDataFrame(coord,new.data)

   # draw some circles with specify radius size

   x<-new.data$long
   y<-new.data$lat
   freq<-new.data$perc
   rad<-freq
   rad1<-round(rad,1)

   title<-paste("Ind","-",fname," / ","Site","-",new.data$site[1],sep="")  

   # create bubble plot  
   symbols(x,y,circles=rad1,inches=0.4,fg="black",bg="red",xlab="",ylab="")
   points(x,y,pch=1,col="black",cex=0.4)

   par(new=T)

   # map scale  
   maps::map.scale(grconvertX(0.4,"npc"),grconvertY(0.1, "npc"),
     ratio=FALSE,relwidth=0.2,cex=0.6)

   # specifying coordinates for legend  
   legX<-grconvertX(0.8,"npc")
   legY1<-grconvertY(0.9,"npc")
   legY2<-legY1-0.001
   legY3<-legY2-0.0006
   legY4<-legY3-0.0003

   # creating the legend
   leg<-data.frame(X=c(legX,legX,legX,legX),Y=c(legY1,legY2,legY3,legY4),
     rad=c(1000,500,100,25))
   symbols(leg$X,leg$Y,circles=leg$rad,inches=0.3,add=TRUE,fg="black",bg="white")

   mtext(title,3,line=1,cex=1.2)
   mtext("Latitude",2,line=3,padj=1,cex=1)
   mtext("Longitude",1,line=2.5,padj=0,cex=1)

   box()


}

dev.off()

最初のプロットは実際には問題なく、lengend バブルの隣に頻度/パーセンテージの値があれば十分です。しかし、それは実際には他のものとはうまくいきません...

4

1 に答える 1

2

凡例の位置をハードコーディングしています-相対的にします...

legX<-grconvertX(0.8,"npc")
legY1<-grconvertY(0.9,"npc")

# Get the size of the plotting area (measured on the y axis)
ysize <- par()$usr[4]-par()$usr[3]

# Use that to calculate the new positions
legY2<-legY1 - (0.1* ysize)
legY3<-legY1 - (0.2* ysize)
legY4<-legY1 - (0.3* ysize)

これにより、すべてのプロットの同じ場所にバブルが配置されます (プロット領域の 10% のステップで)。

于 2013-04-11T11:54:56.503 に答える