2014-02-26 6 views
8

Ich versuche meine Polygone mit ggplot in R zu beschriften. Ich habe hier auf stackoverflow ein Thema gefunden, von dem ich denke, dass es sehr nah an dem ist, was ich möchte, außer mit Punkten.Etikettierzentrum von Kartenpolygonen in R ggplot

Label points in geom_point

ich online einige Methoden gefunden. Jetzt muss ich zuerst die zentrale Position jeder Form finden und dann muss ich diese Stellen zusammen mit dem Namen zusammensetzen. Dann verknüpfen diese auf die Kennzeichnung Funktion in geom_text()

ggplot centered names on a map

Da ich schon seit langer Zeit versucht, jetzt habe ich beschlossen, die Frage zu stellen und hoffen, dass hier jemand mir den letzten Anstoß geben kann, was ich wollen. Meine Plotten Funktion:

region_of_interest.fort <- fortify(region_of_interest, region = "score") 
region_of_interest.fort$id <- as.numeric(region_of_interest.fort$id) 
region_of_interest.fort$id <- region_of_interest.fort$id 


region_of_interest.fort1 <- fortify(region_of_interest, region = "GM_NAAM") 
region_of_interest.fort1$id <- as.character(region_of_interest.fort1$id) 
region_of_interest.fort1$id <- region_of_interest.fort1$id 

idList <- unique(region_of_interest.fort1$id) 
centroids.df <- as.data.frame(coordinates(region_of_interest)) 
names(centroids.df) <- c("Longitude", "Latitude") 
randomMap.df <- data.frame(id = idList, shading = runif(length(idList)), centroids.df) 

ggplot(data = region_of_interest.fort, aes(x = long, y = lat, fill = id, group = group)) + 
    geom_polygon() + 
    geom_text(centroids.df, aes(label = id, x = Longitude, y = Latitude)) + 
    scale_fill_gradient(high = "green", low = "red", guide = "colorbar") + 
    coord_equal() + 
    theme() + 
    ggtitle("Title") 

Es gibt mir den Fehler: ggplot2 nicht weiß, wie mit den Daten der Klasse uneval

Meine Daten

region_of_interest$GM_NAAM 
[1] Groningen  Haren   Ooststellingwerf Assen   Aa en Hunze  Borger- Odoorn 
[7] Noordenveld  Westerveld  Tynaarlo   Midden-Drenthe 
415 Levels: 's-Gravenhage 's-Hertogenbosch Aa en Hunze Aalburg Aalsmeer Aalten ... Zwolle 

region_of_interest$score 
[1] 10 -2 -1 2 -1 -4 -4 -5 0 0 
+0

Es wäre nützlich für uns ou Frage zu beantworten, ein Beispiel für die Daten, die Sie verwenden können Sie weitere Informationen zu diesem erhalten hier.: http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example – Pop

+0

Ich schätze den Kommentar Die Seite, die Sie verlinken, sieht sehr schwierig für mich als Anfänger in R. Aber Ich denke, ich habe eine ziemlich klare Frage und da muss jemand sein, der das schon gemacht hat.Die Funktion plottet, wenn ich die Beschriftungen ausschließe.Man kann sich leere Formen vorstellen, die Formen oder Daten spielen keine Rolle ein Etikett dort. – Zuenie

+0

[Dieses Beispiel] (http://stackoverflow.com/questions/20378403/how-to-add-legend-for-regional-map-with-a-legend-scribing-associated-labels-us/20447373#20447373) macht was du willst. – jlhoward

Antwort

12

Versuchen Sie, so etwas beschäftigen?

  1. einen Datenrahmen des Zentroide Ihrer Polygone vom Objekt Originalkarte Get.

  2. Im Datenrahmen Sie Plotten, sicherzustellen, dass es Spalten für die ID, die Sie und die Länge und Breite dieser Centroide beschriften möchten.

  3. Verwenden Sie geom_text in ggplot, um die Beschriftungen hinzuzufügen.

Based on this example Ich las eine Weltkarte, die ISO3 IDs zu extrahieren als meine Polygon-Etiketten zu verwenden, und einen Datenrahmen der Länder ID, Bevölkerung und Längen- und Breitengrade von Zentroiden. Ich zeichne dann die Populationsdaten auf einer Weltkarte auf und füge Markierungen an den Zentroiden hinzu.

library(rgdal) # used to read world map data 
library(rgeos) # to fortify without needing gpclib 
library(maptools) 
library(ggplot2) 
library(scales) # for formatting ggplot scales with commas 

# Data from http://thematicmapping.org/downloads/world_borders.php. 
# Direct link: http://thematicmapping.org/downloads/TM_WORLD_BORDERS_SIMPL-0.3.zip 
# Unpack and put the files in a dir 'data' 

worldMap <- readOGR(dsn="data", layer="TM_WORLD_BORDERS_SIMPL-0.3") 
# Change "data" to your path in the above! 
worldMap.fort <- fortify(world.map, region = "ISO3") 
# Fortifying a map makes the data frame ggplot uses to draw the map outlines. 
# "region" or "id" identifies those polygons, and links them to your data. 
# Look at head([email protected]) to see other choices for id. 
# Your data frame needs a column with matching ids to set as the map_id aesthetic in ggplot. 
idList <- [email protected]$ISO3 
# "coordinates" extracts centroids of the polygons, in the order listed at [email protected] 
centroids.df <- as.data.frame(coordinates(worldMap)) 
names(centroids.df) <- c("Longitude", "Latitude") #more sensible column names 
# This shapefile contained population data, let's plot it. 
popList <- [email protected]$POP2005 

pop.df <- data.frame(id = idList, population = popList, centroids.df) 

ggplot(pop.df, aes(map_id = id)) + #"id" is col in your df, not in the map object 
    geom_map(aes(fill = population), colour= "grey", map = worldMap.fort) + 
    expand_limits(x = worldMap.fort$long, y = worldMap.fort$lat) + 
    scale_fill_gradient(high = "red", low = "white", guide = "colorbar", labels = comma) + 
    geom_text(aes(label = id, x = Longitude, y = Latitude)) + #add labels at centroids 
    coord_equal(xlim = c(-90,-30), ylim = c(-60, 20)) + #let's view South America 
    labs(x = "Longitude", y = "Latitude", title = "World Population") + 
    theme_bw() 

Population map of South America

Minor technischer Hinweis: tatsächlich coordinates in the sp package doesn't quite find the centroid, but it should usually give a sensible location for a label. Verwenden Sie gCentroid in dem rgeos-Paket, wenn Sie in komplexen Situationen like non-contiguous shapes auf dem wahren Zentroid beschriften möchten.

+0

Vielen Dank für den Kommentar. Ich versuche dein Skript zu benutzen, alles scheint mir sehr logisch zu sein, ich muss es nur zur Arbeit bringen. – Zuenie

+0

Ich habe die ursprüngliche Frage nach der Implementierung Ihres Codes angepasst. Ich denke, ich habe das Problem, das du hier im Kommentar erwähnt hast. – Zuenie

+0

Die Lösung besteht nicht darin, die IDs des verstärkten DF und der Zentroide von der ursprünglichen Karte zu lesen. Verwenden Sie stattdessen die @data wie im obigen Code. Hoffe das hilft. – Silverfish

2

Die hier angenommene Antwort funktioniert möglicherweise, aber die eigentliche Frage, die speziell gestellt wurde, stellt fest, dass ein Fehler vorliegt. "Ggplot2 kann nicht mit Daten der Klasse uneval umgehen."

Der Grund, dass es Ihnen den Fehler geben, weil die Einbeziehung von centroids.df eine benannte Variable sein muss (zB durch „data =“ begleitet)

Derzeit:

ggplot(data = region_of_interest.fort, aes(x = long, y = lat, fill = id, group = group)) + 
    geom_polygon() + 
    geom_text(centroids.df, aes(label = id, x = Longitude, y = Latitude)) + 
    scale_fill_gradient(high = "green", low = "red", guide = "colorbar") + 
    coord_equal() + 
    theme() + 
    ggtitle("Title") 

Sollte be (Hinweis: "Daten = Schwerpunkte.df "):

ggplot(data = region_of_interest.fort, aes(x = long, y = lat, fill = id, group = group)) + 
    geom_polygon() + 
    geom_text(data=centroids.df, aes(label = id, x = Longitude, y = Latitude)) + 
    scale_fill_gradient(high = "green", low = "red", guide = "colorbar") + 
    coord_equal() + 
    theme() + 
    ggtitle("Title") 

Dieses Problem wurde hier angesprochen: How to deal with "data of class uneval" error from ggplot2?

Verwandte Themen