Re: carte spectrale sur fond de carte [Résolu]

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Eric Wajnberg
Messages : 776
Enregistré le : 11 Aoû 2008, 15:37
Contact :

Re: carte spectrale sur fond de carte [Résolu]

Messagepar Eric Wajnberg » 23 Jan 2019, 15:16

Bonjour à tous,

Je suis confronté à un problème que je n'ai pas l'habitude de résoudre. Et mes recherches sur ce forum ne m'ont pas vraiment apporté de solutions.

Je possède la chronique de nombreuses coordonnées de points (en 2D). Et je veux représenter une carte spectrale d'occupation de la surface totale, le tout sur un fond de carte. J'ai ce fond de carte en png.

J'ai commencé à creuser ça et ai notamment commencé à "jouer" avec le package png. J'arrive bien à ajouter des points sur le fond de carte, en jonglant même sur la transparence des points, etc. Ceci est donc prometteur.

Le problème est à présent de générer - à chaque pas de temps - la carte spectrale d'occupation, et je pensais utiliser filled.contour() (what else?), mais je veux afficher - avec un certain niveau de transparence - ceci sur le fond de carte (ensuite je construirai le déroulé cinématique pas de temps après pas de temps, mais c'est une autre histoire).

Impossible de faire un filled.contour() par dessus le fond de carte, et ce pour plusieurs raisons :

D'abord, impossible d'avoir le filled.contour() dessiné par dessus autre chose. J'ai bien essayé de faire un par(new=TRUE), mais il y a un problème de coordonnées (voir ci-dessous) et rien n'est résolu.

Un graphe produit par filled.contour() est construit en fait sur deux système de coordonnées, l'un pour le graphe lui-même, l'autre pour la légende. Comment je fais pour caler le bon avec le fond de carte ? L'utilisation de l'argument plot.axes (avec lequel j'ai fait de nombreux essais) n'apporte rien, ou bien j'ai loupé quelque chose.

Il y a bien une fonction .filled.coutour() (avec le "." devant) qui existe et qui est présentée avec une seule ligne laconique dans R :

.filled.contour is a ‘bare bones’ interface to add just the contour plot to an already-set-up plot region. It is is intended for programmatic use, and the programmer is responsible for checking the conditions on the arguments.


Oui, mais encore ? Si c'est la solution qui conviendrait, comment la mettre en oeuvre ?

Bref, toute aide ou idée sur ce point serait la bienvenue.

D'avance merci, Eric.

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: carte spectrale sur fond de carte

Messagepar Mickael Canouil » 23 Jan 2019, 16:39

Bonjour,

pour tout à fait autre chose, je cherchais à utiliser une image en fond avec du ggplot2 et j'étais tombé sur ce post: https://stackoverflow.com/questions/497 ... ith-ggplot

Cordialement,
Mickaël
mickael.canouil.fr | rlille.fr

Eric Wajnberg
Messages : 776
Enregistré le : 11 Aoû 2008, 15:37
Contact :

Re: carte spectrale sur fond de carte

Messagepar Eric Wajnberg » 23 Jan 2019, 16:42

Merci, mais ceci ne répond pas à la question, je le crains.

En fait, il y a pas mal de personnes qui posent des questions similaires sur le web, mais aucune réponse satisfaisante n'apparait. Le comble est que j'arrive bien à rajouter des courbes de niveau avec contour(), mais impossible avec filled.contour() qui semble créer et manipuler un objet graphique de manière très particulière.

D'autres idées ?

Eric.

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: carte spectrale sur fond de carte

Messagepar Mickael Canouil » 23 Jan 2019, 17:17

D'où ma suggestion de détourner le problème en passant par ggplot2 et le geom_* (layers).

en regardant rapidement le code de la fonction, on peut voir l'appel à plot.new(), d'où le comportement observé.
.filled.contour(x, y, z, levels, col) est la fonction qui vient tracer par dessus le plot initialisé auparavant dans la fonction filled.contour().

Donc soit, créer une version modifié, soit utiliser directement la vraie fonction (.filled.contour) qui génère les courbes.

Code : Tout sélectionner

> filled.contour <- function (x = seq(0, 1, length.out = nrow(z)), y = seq(0, 1,
    length.out = ncol(z)), z, xlim = range(x, finite = TRUE),
    ylim = range(y, finite = TRUE), zlim = range(z, finite = TRUE),
    levels = pretty(zlim, nlevels), nlevels = 20, color.palette = cm.colors,
    col = color.palette(length(levels) - 1), plot.title, plot.axes,
    key.title, key.axes, asp = NA, xaxs = "i", yaxs = "i", las = 1,
    axes = TRUE, frame.plot = axes, ...)
{
    if (missing(z)) {
        if (!missing(x)) {
            if (is.list(x)) {
                z <- x$z
                y <- x$y
                x <- x$x
            }
            else {
                z <- x
                x <- seq.int(0, 1, length.out = nrow(z))
            }
        }
        else stop("no 'z' matrix specified")
    }
    else if (is.list(x)) {
        y <- x$y
        x <- x$x
    }
    if (any(diff(x) <= 0) || any(diff(y) <= 0))
        stop("increasing 'x' and 'y' values expected")
    mar.orig <- (par.orig <- par(c("mar", "las", "mfrow")))$mar
    on.exit(par(par.orig))
    w <- (3 + mar.orig[2L]) * par("csi") * 2.54
    layout(matrix(c(2, 1), ncol = 2L), widths = c(1, lcm(w)))
    par(las = las)
    mar <- mar.orig
    mar[4L] <- mar[2L]
    mar[2L] <- 1
    par(mar = mar)
    plot.new()
    plot.window(xlim = c(0, 1), ylim = range(levels), xaxs = "i",
        yaxs = "i")
    rect(0, levels[-length(levels)], 1, levels[-1L], col = col)
    if (missing(key.axes)) {
        if (axes)
            axis(4)
    }
    else key.axes
    box()
    if (!missing(key.title))
        key.title
    mar <- mar.orig
    mar[4L] <- 1
    par(mar = mar)
    plot.new()
    plot.window(xlim, ylim, "", xaxs = xaxs, yaxs = yaxs, asp = asp)
    .filled.contour(x, y, z, levels, col)
    if (missing(plot.axes)) {
        if (axes) {
            title(main = "", xlab = "", ylab = "")
            Axis(x, side = 1)
            Axis(y, side = 2)
        }
    }
    else plot.axes
    if (frame.plot)
        box()
    if (missing(plot.title))
        title(...)
    else plot.title
    invisible()
}
Mickaël
mickael.canouil.fr | rlille.fr

Eric Wajnberg
Messages : 776
Enregistré le : 11 Aoû 2008, 15:37
Contact :

Re: carte spectrale sur fond de carte [Résolu]

Messagepar Eric Wajnberg » 23 Jan 2019, 17:38

Ok, merci, j'avais déjà vu cette solution (car proposée sur le web par d'autres), mais je n'étais pas arrivé au bout de mon latin. Entre temps, je crois que j'ai trouvé une solution "stable" avec image(add=TRUE).

Je vais regarder ceci plus en détail rapidement.

En attendant, je mets le post en "[Résolu]".

Merci, Eric.


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Google [Bot] et 1 invité