Frage

Beachten:Diese Frage ist spezifisch für das Mapping, aber ich möchte sie verwenden können, wenn ich in einem kartesischen Standardkoordinatensystem plotte.

Ich liebe Basisgrafiken, mag aber auch ggplot2 für viele Dinge.Eine meiner am häufigsten verwendeten Basisfunktionen zur Feinabstimmung eines Diagramms ist locator(n), aber dies führt zu einem Fehler in ggplot2.

library(ggplot2) 
county_df <- map_data('county')  #mappings of counties by state
ny <- subset(county_df, region=="new york")   #subset just for NYS
ny$county <- ny$subregion

ggplot(ny, aes(long, lat, group=group)) +  geom_polygon(colour='black', fill=NA)
locator(1)

Jetzt grid.locator() wie mir von Dason am gezeigt wurde talkstats.com (HIER) etwas zurückgeben kann.Ich weiß nur nicht, wie ich das verwenden soll, um eine Kartenkoordinate zu erhalten.

> grid.locator()
$x
[1] 286native

$y
[1] 133native

Einheiten schienen nicht zu helfen, da sie keine Kartenkoordinaten sind.Vielleicht brauche ich eine Art Konvertierung.

Danke im Voraus.

BEARBEITEN:(basierend auf Dwins Antwort)

Dwin hat die richtige Idee, aber der Umrechnungsfaktor ist ein bisschen daneben.Hilfe dabei wäre dankbar.Im folgenden Beispiel habe ich eine Karte mit einem roten Punkt an den Koordinaten (x = -73 & y = 40.855).Ich habe Dwins Antwort in eine Funktion geworfen, um die Koordinaten zurückzugeben.Ich würde erwarten, dass die Ergebnisse die Koordinaten sind, die ich eingegeben habe, aber das sind sie nicht.

Ideen?

require(maps); library(ggplot2); require(grid)

county_df <- map_data('county')  #mappings of counties by state
ny <- subset(county_df, region=="new york")   #subset just for NYS
ny$county <- ny$subregion


NY <- ggplot(ny, aes(long, lat)) +  
          geom_polygon(aes(group=group), colour='black', fill=NA) +
          coord_map() + geom_point(aes(-73, 40.855, colour="red"))
NY  

gglocator <- function(object){
    require(maps); require(grid)
    z <- grid.locator("npc")
    y <- sapply(z, function(x) as.numeric(substring(x, 1, nchar(x))))
    locatedX <- min(object$data$long) + y[1]*diff(range(object$data$long))
    locatedy <- min(object$data$lat)  + y[2]*diff(range(object$data$lat))
    return(c(locatedX, locatedy))
}

#click on the red dot
gglocator(NY)  #I expect the results to be x = -73 & y = 40.855

BEARBEITEN 2:(Geht von der Antwort der Taufe ab)

Wir sind da

NY <- ggplot(ny, aes(long, lat)) +  
          geom_polygon(aes(group=group), colour='black', fill=NA) +
          coord_map() + geom_point(aes(-73, 40.855, colour="red")) +
          scale_x_continuous(expand=c(0,0)) + scale_y_continuous(expand=c(0,0))


NY 
x <- grid.ls()[[1]][grep("panel-", grid.ls()[[1]])] #locate the panel
seekViewport(x)
y <-  grid.locator("npc")
y <- as.numeric(substring(y, 1, nchar(y)-3))

locatedX <- min(NY$data$long) + y[1]*diff(range(NY$data$long))
locatedy <- min(NY$data$lat) + y[2]*diff(range(NY$data$lat))
locatedX; locatedy 

UPDATE: Der gglocator funktion des ggmap-Paket enthält jetzt diese Funktionalität.

War es hilfreich?

Lösung

Ich erhalte das richtige Ergebnis, wenn ich hinzufüge scale_x_continuous(expand=c(0,0)) + scale_y_continuous(expand=c(0,0)) zum Grundstück und seekViewport("panel-3-4") vor grid.locator()

Andere Tipps

Müssen Sie ein Gerätesystem verwenden, das den Sinn ergibt und die Informationen im GGPLOT-Objekt speichern sollen, damit Sie von "NPC" -Aneinheiten in Karteneinheiten konvertieren können: generasacodicetagpre.

Hier sind die endgültigen Ergebnisse mit allem, was Dwin und Taufen verwendet, gab mir in eine Funktion eingewickelt.Ich fragte auch auf der GGPLOT-Help-Liste und berichtet und zusätzliche Informationen hier wieder. generasacodicetagpre.

Ich habe an die GgPlot-Hilfsliste geschrieben und erhielt eine sehr hilfreiche Antwort von David KAHLE, der an demselben Problem interessiert ist.Seine Funktion ist großartig:

1) Sie müssen dem Diagramm nicht Skala y und skala x hinzugefügt werden.

2) Es kann mehrere Punkte gleichzeitig finden und als Datenrahmen zurücksenden

3) Es funktioniert auf jeder Art von GgPlot, nicht nur Karten generasacodicetagpre.

update: die generationstechnische tagcode-Funktion des GGMAP-Paket enthält jetzt diese Funktionalität.

Diese Beiträge waren sehr hilfreich, aber es ist ein paar Jahre her, also sind ein paar Dinge kaputt.Hier ist ein neuer Code, der für mich funktioniert.Der Code zum Auffinden des richtigen Ansichtsfensters hat nicht funktioniert, also habe ich stattdessen verwendet current.vpTree() um manuell nach dem richtigen Ansichtsfenster zu suchen, kopieren Sie dieses in seekViewport().Beachten Sie, dass das Ansichtsfenster für mich war 'panel.6-4-6-4' und nicht der alte Stil panel-*.Schließlich bekam ich beim Rendern in rstudio nicht die richtigen Antworten, stattdessen musste ich verwenden x11().

Hier ist ein vollständiges Beispiel.Hoffe das ist hilfreich.

library(ggplot2)
library(grid)

object<-ggplot(dat=data.frame(x=1:5,y=1:5),aes(x=x,y=y)) + 
  geom_point()  +
  scale_x_continuous(expand=c(0,0)) +
  scale_y_continuous(expand=c(0,0))
x11()
print(object)
formatVPTree(current.vpTree()) #https://www.stat.auckland.ac.nz/~paul/useR2015-grid/formatVPTree.R
seekViewport('panel.6-4-6-4')
y <-  as.numeric(grid.locator("npc"))
locatedX <- min(object$data$x) + y[1]*diff(range(object$data$x))
locatedY <- min(object$data$y) + y[2]*diff(range(object$data$y))
locatedX; locatedY
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top