Polygone in Shapefile benutzerdefiniert einfärben

Wie rufe ich R-Funktionen auf, wie selektiere ich Daten, ich weiß nicht genau ....

Moderatoren: EDi, jogo

Antworten
Natsu
Beiträge: 9
Registriert: Mi Jul 01, 2020 12:12 pm

Polygone in Shapefile benutzerdefiniert einfärben

Beitrag von Natsu »

Hi,

ich bin Recht neu bei R unterwegs und habe nun ein größeres Problem bei einer Karte (Shapefile) die später auf einem Dashboard kommen soll.
Es geht hierbei um die Bundesstadt Bonn, diese möchte ich nach den 4 Stadtbezirken in von mir festgelegten Farben einfärben. Später sollen noch verschiedene Standorte mit einem Punkt (nach Koordinaten) auf der Karte markiert werden.

Code: Alles auswählen


 daten1 = as.data.table(daten)

             coordinates(daten1) = c("Longitude","Latitude")
             crs.geo1 = CRS("+proj=longlat")
             proj4string(daten1) = crs.geo1


#Bonn #f1ffea
#Bad Godesberg #ffffd0
#Beuel #f3e8f5
#Hardtberg #dee5e9


            #read shapefile
            Bonn = readOGR(dsn="/home/test/Dokumente/Massendaten/Bonn2", layer= "Bonn", verbose=FALSE)
            #Bonn = readShapePoly("/home/test/Dokumente/Massendaten/Bonn2/Bonn.shp")


					        #par(mar=c(0,0,1,0))
            					#points(daten1, pch='.', cex=1.5, col="orange")

      
            
      # Plot Karte, aber die Zuordnung der Farbe auf den Gebieten passt nicht
            
            #hier sind Fehler!!!!!!!
            #classes <- cut(daten1@Bezirk[positon], c(0,1 ,2 ,3, 4))
            #levels(classes) <- c("Bonn", "Bad Godesberg", "Beuel", "Hardtberg")
            col<- c("#f1ffea","#f3e8f5","blue","green")

            plot(Bonn,border = "darkgrey", col = colours[classes],  main="Anliegen in Bonn")
            legend(x = par("usr")[1],y = par("usr")[3], pch = 15, col = colours, legend = levels(classes),ncol = 1, bty = "n", title = "TEST",
            xjust = -2.8, yjust = -1.8)
            points(daten1, pch='.', cex=1.5, col="orange")



Bei meinem Versuch richte ich mich nach dem Tutorium
https://www.eoda.de/wissen/blog/old/tut ... rung-mit-r


Nur leider klappt das mit dem Classes nicht. Wenn ich wie oben im Code die beiden Gruppierungen auskommentiere, wird die Shapefile angezeigt. Einzelne Polygone sind auch farbig, aber die Zuordnung der Stadtbezirke zu den Farben passt nicht und viele Polygone bleiben weiß.
Wenn ich die beiden Zeilen auskommentiere bekomme ich den Fehler:
Fehler in cut(daten1@Bezirk[positon], c(0, 1, 2, 3, 4)) :
kein Slot des Namens "Bezirk" für dieses Objekt der Klasse "SpatialPointsDataFrame"
Bei den Globalen Enviroments (zumindest heißt das so im RStudio) wird mir bei den Data
Bonn Formal class SpartialPolygonsDataFrame
daten1 Large SpatialPointsDataFrame


Wenn ich mir dann die Inhalte ansehe gibt es in daten1$Stadtbezirk [chr] und daten1$Bezirk [num]



Was mache ich falsch?? Für ausführliche Hinweise für einen Neuling in R wäre ich Dankbar.

Beste Grüße
Natsu
ruedi_br
Beiträge: 159
Registriert: Do Mär 01, 2018 3:53 pm

Re: Polygone in Shapefile benutzerdefiniert einfärben

Beitrag von ruedi_br »

Hallo Natsu,
[positon] kommt so nicht in der verwiesenen Literatur vor - ist Dir die Bedeutung dieser Zeile klar?
VG Ruedi
fortune(111)
Natsu
Beiträge: 9
Registriert: Mi Jul 01, 2020 12:12 pm

Re: Polygone in Shapefile benutzerdefiniert einfärben

Beitrag von Natsu »

Also wenn ich das im Tutorium
Bei meinem Versuch richte ich mich nach dem Tutorium
https://www.eoda.de/wissen/blog/old/tut ... rung-mit-r
richtig verstanden habe, dann soll damit eine Range festgelegt werden (also eine Art Wertebereich), die später für die Einfärbung genutzt wird.
In dem Beispieltutorium haben Sie die Summe von Haushalten genommen, ich möchte dies nach dem Bezirk (von 1-4) einteilen.
Damit die Daten schließlich auf der Karte visualisiert werden können müssen sie noch in Klassen unterteilt werden.
Mit der Funktion cut erstellen wir einen Faktor, der die entsprechenden Klassen enthält. Im nächsten Befehlsaufruf weisen wir diesen Klassen Bezeichnungen zu.

classes <- cut(data.agg$Households[position], c(0,6000,10000,15000,20000,25000))

levels(classes) <- c(„under 6000“, „6000 – 10000“, „10000 – 15000“, „15000 – 20000″,“20000 – 25000“)

Wir erstellen des Weiteren noch einen Farbvektor, der fünf unterschiedliche Grüntöne enthält.
colours<- c(„#73AC97“, „#489074“, „#267356“, „#0E563B“, „#003924“)





Hmm wenn aber [position] in der Litaratur nicht zu finden ist, ist dies vlt als Synonym gedacht...

Gruß
Natsu
Natsu
Beiträge: 9
Registriert: Mi Jul 01, 2020 12:12 pm

Re: Polygone in Shapefile benutzerdefiniert einfärben

Beitrag von Natsu »

Ich habe die Funktion nun so angepasst

Code: Alles auswählen

            classes <- cut(daten1@data$Bezirk, breaks = seq(0, 4, by = 1))
            levels(classes) <- c("Bonn", "Bad Godesberg", "Beuel", "Hardtberg")
            col<- c("#f1ffea","#f3e8f5","blue","green")

            plot(Bonn,border = "darkgrey", col = colours[classes],  main="Anliegen in Bonn")
            legend(x = par("usr")[1],y = par("usr")[3], pch = 15, col = colours, legend =                  
            levels(classes),ncol = 1, bty = "n", title = "TEST",
            xjust = -2.8, yjust = -1.8)
            #points(daten1, pch='.', cex=1.5, col="orange")
            
 
Damit wir eine Karte erzeugt, allerdings stimmt die Färbung noch nicht. Es sind zwar alle Polygone nun eingefärbt, aber die Färbung ist nicht Stadtbezirk bezogen. Zur Besseren Darstellung hab ich die Daten-Punkte die nachträglich noch eingezeichnet werden erstmal rausgenommen. Anbei zwei Bilder, einmal meine Karte und einmal wie ich die Färbung gerne erreichen möchte.

Ich hab mir mal classes ausgeben lassen:

[1] (0,1] (1,2] (0,1] (0,1] (0,1] (3,4] (3,4] (1,2] (2,3] (0,1] (0,1] (0,1] (2,3] (0,1]
[15] (3,4] (1,2] (0,1] (2,3] (0,1] (1,2] (0,1] (0,1] (0,1] (0,1] (0,1] (0,1] (3,4] (2,3]
[29] (2,3] (2,3] (2,3] (0,1] (3,4] (0,1] (0,1] (0,1] (0,1] (0,1] (0,1] (0,1] (2,3] (1,2]
[43] (0,1] (1,2] (1,2] (2,3] (0,1] (2,3] (0,1] (2,3] (2,3] (1,2] (2,3] (1,2] (0,1] (0,1]
[57] (0,1] (0,1] (2,3] (3,4] (2,3] (1,2] (0,1] (2,3] (0,1] (2,3] (0,1] (1,2] (1,2] (0,1]
[71] (0,1] (0,1] (0,1] (2,3] (1,2] (2,3] (0,1] (0,1] (0,1] (0,1] (1,2] (1,2] (1,2] (0,1]
[85] (0,1] (0,1] (0,1] (0,1] (1,2] (0,1] (0,1] (0,1] (2,3] (0,1] (1,2] (0,1] (2,3] (0,1]
[99] (0,1] (0,1] (0,1] (0,1] (0,1] (0,1] (1,2] (1,2] (2,3] (2,3] (0,1] (3,4] (1,2] (3,4]
[113] (0,1] (0,1] (0,1] (2,3] (2,3] (2,3] (1,2] (0,1] (0,1] (0,1] (2,3] (0,1] (0,1] (1,2]
[127] (2,3] (0,1] (1,2] (0,1] (0,1] (0,1] (3,4] (0,1] (0,1] (0,1] (0,1] (1,2] (2,3] (2,3]
[141] (0,1] (0,1] (0,1] (0,1] (0,1] (0,1] (0,1] (3,4] (0,1] (0,1] (0,1] (2,3] (0,1] (2,3]
[155] (0,1] (1,2] (1,2] (0,1] (0,1] (0,1] (0,1] (0,1] (1,2] (0,1] (0,1] (1,2] (2,3] (1,2]
[169] (0,1] (0,1] (0,1] (0,1] (1,2] (1,2] (2,3] (0,1] (0,1] (1,2] (0,1] (2,3] (1,2] (0,1]
[183] (0,1] (1,2] (1,2] (2,3] (2,3] (1,2] (0,1] (0,1] (0,1] (0,1] (0,1] (0,1] (0,1] (0,1]
[197] (0,1] (0,1] (0,1] (0,1] (1,2] (0,1] (0,1] (1,2] (0,1] (1,2] (0,1] (0,1] (0,1] (0,1]
[211] (3,4] (1,2] (0,1] (0,1] (0,1] (0,1] (0,1] (0,1] (0,1] (0,1] (0,1] (0,1] (3,4] (1,2]
[225] (0,1] (2,3] (0,1] (1,2] (0,1] (1,2] (0,1] (0,1] (0,1] (0,1] (0,1] (0,1] (0,1] (0,1]
[239] (0,1] (0,1] (0,1] (0,1] (3,4] (0,1] (3,4] (0,1] (0,1] (2,3] (0,1] (2,3] (0,1] (0,1]
[253] (1,2] (0,1] (3,4] (0,1] (0,1] (0,1] (0,1] (0,1] (0,1] (0,1] (0,1] (0,1] (3,4] (3,4]
[267] (3,4] (1,2] (1,2] (0,1] (1,2] (0,1] (0,1] (0,1] (0,1] (2,3] (1,2] (2,3] (0,1] (0,1]
......
[981] (0,1] (0,1] (1,2] (0,1] (1,2] (3,4] (1,2] (0,1] (0,1] (0,1] (0,1] (0,1] (0,1] (0,1]
[995] (0,1] (3,4] (0,1] (0,1] (2,3] (2,3]
[ reached getOption("max.print") -- omitted 10264 entries ]
Levels: (0,1] (1,2] (2,3] (3,4]

irgendwie ist das nicht ganz das was ich erwartet hatte.


Gruß
Natsu
Dateianhänge
Bonn_Subdivisions.svg.png
Karte.png
ruedi_br
Beiträge: 159
Registriert: Do Mär 01, 2018 3:53 pm

Re: Polygone in Shapefile benutzerdefiniert einfärben

Beitrag von ruedi_br »

Sollte m.E. an diesen beiden Zeilen hängen:
col<- c("#f1ffea","#f3e8f5","blue","green")

plot(Bonn,border = "darkgrey", col = colours[classes],
Am eingefügten Skript kann ich nicht erkennen, wo colours definiert wurde ...
VG Ruedi
fortune(111)
Natsu
Beiträge: 9
Registriert: Mi Jul 01, 2020 12:12 pm

Re: Polygone in Shapefile benutzerdefiniert einfärben

Beitrag von Natsu »

ruedi_br hat geschrieben: Do Jul 02, 2020 12:25 pm Sollte m.E. an diesen beiden Zeilen hängen:
col<- c("#f1ffea","#f3e8f5","blue","green")

plot(Bonn,border = "darkgrey", col = colours[classes],
Am eingefügten Skript kann ich nicht erkennen, wo colours definiert wurde ...
VG Ruedi
Danke für den Hinweiß, hatte dort wirklich noch was übersehen. Hatte mich auch schon gewundert warum er die Testfarben (darkgreen etc) nicht genommen hatte. Habe nun die Sache noch etwas verändert und die Legende von der Position angepasst. Er scheint eine Färbung der Farben nun vorzunehmen, nur leider passt diese immer noch nicht.

Code: Alles auswählen


            daten1 = as.data.table(daten)
   
            coordinates(daten1) = c("Longitude","Latitude")
            crs.geo1 = CRS("+proj=longlat")
            proj4string(daten1) = crs.geo1

            Bonn = readOGR(dsn="/home/sandra/Dokumente/Massendaten/Bonn2", layer= "Bonn", verbose=FALSE)

            classes <- cut(daten1@data$Bezirk, c(0, 1 ,2 ,3, 4))
            levels(classes) <- c("Bonn", "Bad Godesberg", "Beuel", "Hardtberg")
            print(levels(classes))
            print(classes)
            colours<- c("#f1ffea","#ffffd0","#f3e8f5","#dee5e9")

            par(mar = c(0,0,1,6), oma = c(3,0,2,1), bg ="lightgrey" , xpd = TRUE)
            
            plot(Bonn, col = colours[classes],  main="Anliegen in Bonn")
            legend(x = par("usr")[1],y = par("usr")[3], pch = 15, col = colours, legend =                  levels(classes),ncol = 1, bty = "n", title = "Stadtbezirke",
            xjust = -2.8, yjust = -1.2)
            #points(daten1, pch='.', cex=1.5, col="orange")


Die Ausgabe ist für levels(classes):
1] "Bonn" "Bad Godesberg" "Beuel" "Hardtberg"

Die Ausgabe nur für classes sieht nun so aus. Und das verstehe ich nicht so ganz.......
[1] Bonn Bad Godesberg Bonn Bonn Bonn Hardtberg
[7] Hardtberg Bad Godesberg Beuel Bonn Bonn Bonn
[13] Beuel Bonn Hardtberg Bad Godesberg Bonn Beuel
[19] Bonn Bad Godesberg Bonn Bonn Bonn Bonn
[25] Bonn Bonn Hardtberg Beuel Beuel Beuel
[31] Beuel Bonn Hardtberg Bonn Bonn Bonn
[37] Bonn Bonn Bonn Bonn Beuel Bad Godesberg
[43] Bonn Bad Godesberg Bad Godesberg Beuel Bonn Beuel
[49] Bonn Beuel Beuel Bad Godesberg Beuel Bad Godesberg
[55] Bonn Bonn Bonn Bonn Beuel Hardtberg
[61] Beuel Bad Godesberg Bonn Beuel Bonn Beuel
[67] Bonn Bad Godesberg Bad Godesberg Bonn Bonn Bonn
[73] Bonn Beuel Bad Godesberg Beuel Bonn Bonn
.....
.....
[991] Bonn Bonn Bonn Bonn Bonn Hardtberg
[997] Bonn Bonn Beuel Beuel
[ reached getOption("max.print") -- omitted 10264 entries ]
Levels: Bonn Bad Godesberg Beuel Hardtberg

Also eine Zuordnung scheint irgendwie vorgenommen zu werden, aber ich glaube ich verstehe die Arbeitsweise von classes nicht; bzw wie daraus die Farben in den Polygonen bestimmt wird.

Gruß
Natsu
Dateianhänge
Karte2.png
Natsu
Beiträge: 9
Registriert: Mi Jul 01, 2020 12:12 pm

Re: Polygone in Shapefile benutzerdefiniert einfärben

Beitrag von Natsu »

Hi,

vielen Dank für eure Hilfe, ich konnte nun das Problem lösen. Durch die Variabel classes wurden zu viele "Gruppen" erstellt. Meine Shapefile hat nur 51 Polygone somit wurden immer nur die ersten 51 genutzt. Ich habe dies gelöst indem ich den meinen Datensatz angepasst habe

Code: Alles auswählen


                Datentest <-daten[!duplicated(daten[,c(6,7)]),]
                		
                daten2 <- Datentest[order(Datentest$Bezirk),]
                #Der Stadtteil Villenviertel wurde nachträglich hinzugenommen zur Zuordnung; daher 52 Stadtteile, dies muss für das "färben"  hierbei wieder             korrigiert werden.
                daten2 <- daten2[daten2$Stadtteil != "Villenviertel",]

                daten12 =as.data.table(daten2)
                daten1 = as.data.table(daten)
                print(daten2)
                
                
                coordinates(daten1) = c("Longitude","Latitude")
                crs.geo1 = CRS("+proj=longlat")
                proj4string(daten1) = crs.geo1
                
                coordinates(daten12) = c("Longitude","Latitude")
                crs.geo12 = CRS("+proj=longlat")
                proj4string(daten12) = crs.geo12
                

#Bonn #f1ffea
#Bad Godesberg #ffffd0
#Beuel #f3e8f5
#Hardtberg #dee5e9


            #read shapefile
            Bonn = readOGR(dsn="/home/sandra/Dokumente/Massendaten/Bonn2", layer= "Bonn", verbose=FALSE)
            #Bonn = readShapePoly("/home/sandra/Dokumente/Massendaten/Bonn2/Bonn.shp")
            
           
            classes <- cut(daten12@data$Bezirk, c(0, 1 ,2 ,3, 4))
            levels(classes) <- c("Bonn", "Bad Godesberg", "Beuel", "Hardtberg")
            print(levels(classes))
            print(classes)
            colours<- c("#f1ffea","#ffffd0","#f3e8f5","#dee5e9")

            par(mar = c(0,0,1,6), oma = c(3,0,2,1), bg ="lightgrey" , xpd = TRUE)
            
            plot(Bonn, col = colours[classes],  main="Anliegen in Bonn")
            legend(x = par("usr")[1],y = par("usr")[3], pch = 15, col = colours, legend =                  levels(classes),ncol = 1, bty = "n", title = "Stadtbezirke",
            xjust = -2.8, yjust = -1.2)
            #points(daten1, pch='.', cex=1.5, col="orange")



Somit ist meine Karte nun genau so gefärbt wie ich es wollte.

Nochmals vielen Dank!!!!
Antworten