2016-06-28 1 views
4

Je me demande comment ajouter une flèche pour pointer directement sur une certaine valeur sur une échelle à côté d'un tracé.Ajout d'une flèche pour pointer une valeur sur une échelle dans R

Disons que j'ai une valeur différente selon les années. Je veux savoir quelle est la valeur d'une année donnée en l'indiquant directement à l'échelle. Par exemple, je veux savoir quelle est la valeur en 2010. Ensuite, l'échelle pointerait comme dans l'image ci-dessous:

Dans cette image, la flèche a été ajoutée. Ce que j'apprécierais vraiment (et je ne sais pas comment le faire), c'est d'imprimer uniquement l'échelle avec la flèche sans le graphe pour que je puisse mettre l'échelle où je veux sur un autre graphe. Un peu comme ceci: enter image description here

Voici le code pour reproduire l'image, sans la flèche (fortement influencé par this code to produce a scale).

effort = structure(c(-1.2696471203597, 0.176082447349155, 1.17697214807067, 
          -0.101942469517932, -1.04722718686603, -0.99162220349261, 0.0648724806023204, 
          2.40028178228585, 0.00926749722890297, -0.101942469517932, 0.00926749722890297, 
          -0.324362403011601), .Dim = c(12L, 1L), "`scaled:center`" = 127.333333333333, "`scaled:scale`" = 71.9359984902405, decostand = "standardize", .Dimnames = list(
          c("2003", "2004", "2005", "2006", "2007", "2008", "2009", 
           "2010", "2011", "2012", "2013", "2014"), NULL)) 
plot(effort, type = "n") 

image.scale <- function(z, zlim, col = heat.colors(12), 
         breaks, horiz=TRUE, ylim=NULL, xlim=NULL, ...){ 
    if(!missing(breaks)){ 
    if(length(breaks) != (length(col)+1)){stop("must have one more break than colour")} 
    } 
    if(missing(breaks) & !missing(zlim)){ 
    breaks <- seq(zlim[1], zlim[2], length.out=(length(col)+1)) 
    } 
    if(missing(breaks) & missing(zlim)){ 
    zlim <- range(z, na.rm=TRUE) 
    zlim[2] <- zlim[2]+c(zlim[2]-zlim[1])*(1E-3)#adds a bit to the range in both directions 
    zlim[1] <- zlim[1]-c(zlim[2]-zlim[1])*(1E-3) 
    breaks <- seq(zlim[1], zlim[2], length.out=(length(col)+1)) 
    } 
    poly <- vector(mode="list", length(col)) 
    for(i in seq(poly)){ 
    poly[[i]] <- c(breaks[i], breaks[i+1], breaks[i+1], breaks[i]) 
    } 
    xaxt <- ifelse(horiz, "s", "n") 
    yaxt <- ifelse(horiz, "n", "s") 
    if(horiz){YLIM<-c(0,1); XLIM<-range(breaks)} 
    if(!horiz){YLIM<-range(breaks); XLIM<-c(0,1)} 
    if(missing(xlim)) xlim=XLIM 
    if(missing(ylim)) ylim=YLIM 
    plot(1,1,t="n",ylim=ylim, xlim=xlim, xaxt=xaxt, yaxt=yaxt, xaxs="i", yaxs="i", ...) 
    for(i in seq(poly)){ 
    if(horiz){ 
     polygon(poly[[i]], c(0,0,1,1), col=col[i], border=NA) 
    } 
    if(!horiz){ 
     polygon(c(0,0,1,1), poly[[i]], col=col[i], border=NA) 
    } 
    } 
} 

# source("image.scale.R") 

layout(matrix(c(1,2,3,0,4,0), nrow=1, ncol=2), widths=c(4,4,1), heights=c(4,1)) 
layout.show(4) 

pal.1=colorRampPalette(c("red", "orange", "yellow"), space="rgb") 
breaks <- seq(min(effort),max(effort),length.out = 10) 
par(mar=c(1,1,1,8)) 
image(effort,col=pal.1(length(breaks)-1), breaks=breaks, xaxt="n", ylab="", xlab="") 
#Add additional graphics 
points(x = 1:12, y = effort , 
     pch=1, lwd=2, cex=1,col="black") 

#Add scale 
par(mar=c(1,1,1,3)) 
image.scale(effort, col=pal.1(length(breaks)-1), breaks=breaks, horiz=FALSE, yaxt="n") 
axis(4,at=breaks, las=2) 

Répondre

1

Vous pouvez ajouter les valeurs de l'année en utilisant la fonction text et des flèches correspondant en utilisant la fonction arrows. Dans chaque cas effort fournit les valeurs y pour le placement vertical. Ajoutez xpd=TRUE pour que les textes/flèches en dehors de la zone de tracé ne soient pas écrêtés. Notez que j'ai également changé la marge de gauche pour donner plus de place au texte et aux flèches.

par(mar=c(1,4,1,4)) 
image.scale(effort, col=pal.1(length(breaks)-1), breaks=breaks, horiz=FALSE, 
      yaxt="n", ylab="") 
axis(4,at=breaks, las=2) 
text(-0.11, effort, rownames(effort), cex=0.8, col="red", xpd=TRUE) 
arrows(-0.07, effort, x1=-0.01, length=0.1, col="red", xpd=TRUE) 

Dans le graphique ci-dessous, notez que certaines des années se chevauchent, de sorte que vous devrez peut-être changer le texte et les flèches pour les valeurs qui se chevauchent.

enter image description here


Wouldn'ta scatterplot (année sur l'axe des x, l'effort sur l'axe y) faire un meilleur travail de clarification de la relation? L'échelle des couleurs semble être excessive à moins que vos données réelles soient multivariées et ceci est juste un exemple de jouet.

+0

Merci beaucoup! C'est parce que je suis en train de tracer un graphique avec plein de trucs dedans. Mais je veux montrer que le graphique a été tracé sous une certaine condition d'effort. J'ai donc trouvé que l'ajout d'une échelle comme celle-ci pourrait être un bon moyen visuel d'indiquer ce qui se passe avec l'autre paramètre (effort). Je dois juste trouver un moyen d'ajouter cette échelle à mon graphique –