 |
Groupe des utilisateurs du logiciel R Un forum francophone d'échange autour du logiciel de calcul statistique R dans le domaine de la recherche agronomique tropicale
|
| Voir le sujet précédent :: Voir le sujet suivant |
| Auteur |
Message |
Gaspard CHARRIER
Inscrit le: 21 Mai 2011 Messages: 4 Localisation: Paris
|
Posté le: Ven Mai 04, 2012 2:35 pm Sujet du message: Parametrage de fenetre graphique et production de cartes |
|
|
Bonjour,
Je cherche à produire des cartes en série avec la fonction bubble() du package "sp".
J'utilise une boucle pour créer des cartes de mes différentes variables. Et j'aimerais pouvoir sortir mes différentes cartes sous la même fenêtre graphique.
J'ai pris en exemple ici les données sur la meuse du package "sp".
| Code: | library(sp)
data(meuse)
coordinates(meuse) <- ~x+y |
Je m'intéresse uniquement aux 4 premières variables, pour lesquelles je cherche à appliquer la fonction bubble() comme suit:
| Code: | test<-meuse[,1:4]
bubble(test,zcol="cadmium",fill=TRUE,maxsize=2,do.sqrt=TRUE,col=2) |
Je crée une boucle pour appliquer cette fonction à mes différentes variables:
| Code: | for (i in 1:4)
{ carte<-bubble(test,zcol=i,fill=TRUE,maxsize=2,do.sqrt=TRUE,col=2)
print(carte)
} |
Et c'est là que je coince, je voudrais que mes différentes cartes s'affichent sur la même fenêtre graphique... J'ai tenté sans succès d'utiliser par(mfrow=c(,)) ou layout=c(,) mais j'ai l'impression que rien ne se passe.
J'ai trouvé le paramètre "split" dans print() qui permet de diviser la fenêtre graphique, mais je n'arrive pas à comprendre comme l'intégrer dans une boucle.
| Code: | a<-bubble(test,zcol="cadmium",fill=TRUE,maxsize=2,do.sqrt=TRUE,col=2)
print(a,split = c(1,1,3,2),more=TRUE)
print(a,split = c(2,1,3,2),more=TRUE)
print(a,split = c(3,1,3,2),more=TRUE)
print(a,split = c(1,2,3,2),more=FALSE) |
Je pensais créer des facteurs qui contiendraient la position des graphiques et pouvoir les utiliser dans la boucle mais je ne saisi pas bien comme faire
| Code: | x<-as.factor(c(1,2,1,2))
y<-as.factor(c(1,1,2,2))
for (i in 1:4)
{ carte<-bubble(test,zcol=i,fill=TRUE,maxsize=2,do.sqrt=TRUE,col=2)
print(carte,split = c(x,y,2,2),more=TRUE)
} |
Si vous avez une idée ou un autre moyen d'y arriver, je suis preneur. |
|
| Revenir en haut de page |
|
 |
Renaud Lancelot
Inscrit le: 16 Déc 2004 Messages: 2329 Localisation: CIRAD, Montpellier
|
Posté le: Sam Mai 05, 2012 10:04 am Sujet du message: |
|
|
Pourquoi pas:
| Code: | library(sp)
data(meuse)
coordinates(meuse) <- ~ x + y
for(i in 1:4){
nam <- paste("gr", i, sep = "")
assign(nam, bubble(meuse, zcol = 2 + i, fill = TRUE, maxsize = 2, do.sqrt = TRUE, col = 2))
}
print(gr1, split = c(1, 1, 2, 2), more = TRUE)
print(gr2, split = c(1, 2, 2, 2), more = TRUE)
print(gr3, split = c(2, 1, 2, 2), more = TRUE)
print(gr4, split = c(2, 2, 2, 2), more = FALSE) |
NB: vous ne pouvez pas (facilement) mélanger les paramètres et fonctions graphiques de base (par(...), layout...) avec celles du package lattice. _________________ Renaud |
|
| Revenir en haut de page |
|
 |
Gaspard CHARRIER
Inscrit le: 21 Mai 2011 Messages: 4 Localisation: Paris
|
Posté le: Mer Mai 09, 2012 9:46 am Sujet du message: |
|
|
Oui, mais...
Imaginons par exemple que nous ayons une quinzaine de variables:
| Code: | meuse1<-meuse[,1:6]
meuse1$ion1<-meuse1$cadmium
meuse1$ion2<-meuse1$copper
meuse1$ion3<-meuse1$lead
meuse1$ion4<-meuse1$zinc
meuse1$ion5<-meuse1$cadmium
meuse1$ion6<-meuse1$copper
meuse1$ion7<-meuse1$lead
meuse1$ion8<-meuse1$zinc
meuse1$ion9<-meuse1$cadmium
meuse1$ion10<-meuse1$copper
meuse1$ion11<-meuse1$lead
meuse1$ion12<-meuse1$zinc
coordinates(meuse1) <- ~x+y
test<-meuse1[,1:16] |
Donner la position de chacune des cartes dans split devient rapidement fastidieux. J'aimerais pouvoir intégrer les paramètres de positionnement dans la boucle pour simplifier la production/visualisation des cartes.
J'ai commencé à regarder la doc sur print.trellis, j'ai trouvé une note indiquant:
| Citation: | | Unlike S-PLUS, trying to position a multipage display (using position and/or split) will mess things up. |
Je pense que ca s'annonce un peu tendu pour ce que je cherche à faire.
Mais dans les exemples donnés dans l'aide j'ai trouvé ça:
| Code: | library(RXshrink)
data(longley2)
## repeat same plot, with different polynomial fits in each panel
xyplot(Armed.Forces ~ Year, longley, index.cond = list(rep(1, 6)),
layout = c(3, 2),
panel = function(x, y, ...)
{
panel.xyplot(x, y, ...)
fm <- lm(y ~ poly(x, panel.number()))
llines(x, predict(fm))
}) |
Je pense que panel= function (x,y,...) pourrait bien être un début de solution. Je vais essayer de l'appliquer à mes données, je vous tiens au courant de mes avancées quand j'ai quelque chose qui tient la route.
PS: j'ai vu votre post sur les Graphiques Trellis, je vais également regarder tout ça avec attention. |
|
| Revenir en haut de page |
|
 |
Renaud Lancelot
Inscrit le: 16 Déc 2004 Messages: 2329 Localisation: CIRAD, Montpellier
|
Posté le: Mer Mai 09, 2012 11:41 am Sujet du message: |
|
|
Sans doute: bubble est construit sur xyplot.
| Code: | > library(sp)
> bubble
function (obj, zcol = 1, ..., fill = TRUE, maxsize = 3, do.sqrt = TRUE,
pch, col = c(2, 3), key.entries = quantile(data[, zcol]),
main = ifelse(is.numeric(zcol), names(data)[zcol], zcol),
identify = FALSE, labels = row.names(data.frame(obj)), key.space = "right",
scales = list(draw = FALSE), xlab = NULL, ylab = NULL, panel = panel.bubble,
sp.layout = NULL)
{
obj = as(obj, "SpatialPointsDataFrame")
data = as.data.frame(obj)
cc = coordinates(obj)
x = cc[, 1]
y = cc[, 2]
if (NCOL(data) == 1)
z = data
else if (NCOL(data) == 0)
z = rep(1, NROW(cc))
else z = data[, zcol]
if (missing(pch))
pch = ifelse(fill, 16, 1)
if (length(col) == 1)
col = rep(col, 2)
z.col = as.vector(ifelse(z < 0, col[1], col[2]))
q = key.entries
q.pch = rep(pch, length(q))
q.text = as.character(round(q, 3))
q.col = as.vector(ifelse(q < 0, col[1], col[2]))
az = abs(z)
q = abs(q)
if (do.sqrt) {
az = sqrt(az)
q = sqrt(q)
}
cex = as.vector(maxsize * az/max(az, q))
q.cex = as.vector(maxsize * q/max(az, q))
if (identify) {
plot(x, y, asp = 1, cex = cex, main = main, ...)
return(identify(x, y, labels))
}
else {
key = list(space = key.space, points = list(pch = q.pch,
col = q.col, cex = q.cex), text = list(q.text))
xyplot(y ~ x, col = z.col, cex = cex, pch = pch, asp = mapasp(obj),
key = key, main = main, scales = scales, xlab = xlab,
ylab = ylab, panel = panel, sp.layout = sp.layout,
...)
}
}
<environment: namespace:sp>
>
|
_________________ Renaud |
|
| Revenir en haut de page |
|
 |
Gaspard CHARRIER
Inscrit le: 21 Mai 2011 Messages: 4 Localisation: Paris
|
Posté le: Jeu Mai 10, 2012 8:09 am Sujet du message: |
|
|
Bonjour,
Je n'arrive pas à sortir quoique ce soit d'intéressant avec panel. J'ai essayer des choses comme:
| Code: | for (i in 1:4)
{ carte<-bubble(test,zcol=i,fill=TRUE,maxsize=2,do.sqrt=TRUE,col=2)
}
print(carte, index.cond = list(rep(1,4)),
layout = c(2, 2),
panel = function(x, y, ...)
{
bubble.plot(x,y,...)
}) |
Mais j'ai des messages d'erreur du type:
| Citation: | Error in plot.trellis(carte, index.cond = list(rep(1, 4)), layout = c(2, :
argument 4 matches multiple formal arguments |
Il y a quelque chose qui m'échappe, mais je n'arrive pas à comprendre quoi... |
|
| Revenir en haut de page |
|
 |
Renaud Lancelot
Inscrit le: 16 Déc 2004 Messages: 2329 Localisation: CIRAD, Montpellier
|
Posté le: Jeu Mai 10, 2012 1:24 pm Sujet du message: |
|
|
Il faut repartir directement de xyplot, et définir une fct panel correspondant à vos besoins. Vous devriez lire la doc et regarder les liens indiqués dans http://forums.cirad.fr/logiciel-R/viewtopic.php?t=440 _________________ Renaud |
|
| Revenir en haut de page |
|
 |
|
|
Vous ne pouvez pas poster de nouveaux sujets dans ce forum Vous ne pouvez pas répondre aux sujets dans ce forum Vous pouvez éditer vos messages dans ce forum Vous ne pouvez pas supprimer vos messages dans ce forum Vous ne pouvez pas voter dans les sondages de ce forum
|
 Inscriptions bloqués / messages: 48021 / 588
|