2017-11-17 2 views
0

Angenommen, ich habe geografische Daten (lange lat) für viele Menschen und 2 Eigenschaften für jede Person (Größe und Geschlecht), und ich möchte sie platzieren platzieren die Punkte mit den langen Lat-Daten, und die Punkte mit einem zweifarbigen Quadrat formen, die linke Hälfte entsprechend der Größe, die rechte je nach Geschlecht. Ich verwende den folgenden Trick, um Plots diese 2-farbige Quadrate (inspired from here) zu verwalten: Nehmen wir nun anmehrere Male die gleichen Punkte nach einem anderen Kriterium plotten: Probleme der Überlappung

library(ggplot2) 
library(Cairo) 

dataframe = read.table(text = 
"Lat Long Size Sex 
47.875 6.787 small F 
47.684 7.032 big M 
47.644 6.942 small M 
47.609 7.070 big F 
47.460 7.197 big F 
47.508 7.110 small F 
47.442 7.006 big M 
47.364 7.154 small F 
47.348 7.455 big M 
47.264 7.013 big F", header = TRUE) 

colors <- c("big" = "firebrick3", "small" = "dodgerblue4", "M" = "gold", "F" = "forestgreen") 

g <- ggplot(data = dataframe, mapping = aes(x = Long, y = Lat)) + 
     geom_point(aes (color=Size), shape="◧", size=30) + 
     geom_point(aes (color=Sex), shape="◨", size=30) + 
     geom_point(color="black", shape="◫", size=30) + 
     scale_color_manual(values=colors, "") 

g 

, dass die Punkte müssen überlappen, aus 2 Gründen: sie sind nicht wegen der Lesbarkeit zu klein sein kann die Farben, und sie werden viel zu zahlreich sein (wie 1000 oder so) ...

Und angenommen, ich habe eine befriedigende Skala gefunden. Dies ergibt folgendes Ergebnis.

png image of the result

Das Problem ist mit der Art, die Punkte überlappen. Ich habe die Daten so sortiert, dass sich die unteren Punkte auf den höheren überschneiden. Dies ist nur eine Frage der Wahl. Aber es funktioniert nicht gut, da die Rechte-Hälften über den linken und die schwarzen Rechtecke über dem Rest stehen. Wie man auf dem resultierenden Bild sehen kann, bedeckt eine grüne Hälfte in der Mitte die rote Hälfte darunter und alle schwarzen Rechtecke werden oben angezeigt.

Meine Frage: Wie zeichne ich die linke Hälfte, die rechte Hälfte und die schwarzen Rechtecke für den ersten Punkt, und dann das gleiche für die zweite, usw., so dass die Überlappung ist, wie ich will, nämlich die oberen Punkte, die von den unteren abgedeckt werden?

+0

Was ist mit der Verwendung der Rahmenfarbe und der Füllfarbe anstelle der Halb- und Halbstrategie? – Nate

+0

Ihre Daten werden nicht richtig geladen. Verwenden Sie "dput" auf Ihre Daten und veröffentlichen Sie das Ergebnis. Ihre Daten zeichnen diesen Weg, weil Sie die Sexrechtecke als zweites zeichnen. Schauen Sie genau hin und Sie können sehen, dass andere Geschlechtsrechtecke die Größenrechtecke abdecken, wenn sie es nicht sollten. Das Diagramm ist in der richtigen Reihenfolge, es wird jedoch für jeden Aufruf von 'geom_point' einmal ausgeführt. Um zu bekommen, was Sie wollen, können Sie buchstäblich 1 Reihe hintereinander zeichnen. Eine "loop" - oder "apply" -Funktion dafür zu schreiben wäre nicht zu schwer. – CCurtis

+0

@Nate: Ja, das könnte eine Lösung sein. Ich müsste dann überprüfen, ob die Proportionen der Grenze und der Füllflächen so sind, dass beide gut zu sehen sind. – benjamin

Antwort

1

In ggplot2 ist es einfacher, wenn Sie die Antwortvariablen auf separaten Skalen halten. Eine Möglichkeit, dies hier zu tun, ist die Verwendung der Skalen für "Füllung" und "Farbe" und eines der shapes (21:25), die beide handhaben können (die mit separaten Umriss- und Füllfarben).

ggplot(data = dataframe, mapping = aes(x = Long, y = Lat)) + 
    geom_point(aes(color = Sex, fill = Size), shape = 22, size = 6, stroke = 2, alpha = .8) + 
    scale_fill_manual(values = c("firebrick3", "dodgerblue4")) + 
    scale_color_manual(values = c("gold", "forestgreen")) 

enter image description here

stroke steuert, wie dick die Gliederung und alpha Kontrollen Transparenz (in diesem Fall 80% lichtundurchlässig) Ihre Punkte, so dass Sie sich überlappen, wenn Punkte berichten.

Verwandte Themen