2013-10-17 15 views
5

Ich habe eine Grafik mit 12 Variablen in zwei Gruppen unterteilt. Ich kann keine Facetten verwenden, aber mit Farbe und Form konnte ich die Visualisierung leicht verständlich machen. Es gibt jedoch einige Punkte, die sich (teilweise oder ganz) überschneiden. Ich verwende Jitter, um mit diesen umzugehen, aber wie Sie aus der beigefügten Grafik sehen können, führt dies dazu, dass alle Punkte verschoben werden, nicht nur die mit Überlappung. enter image description hereBedingte Verwendung von Jitter in ggplot2 mit geom_point

Gibt es eine Möglichkeit, Jitter zu verwenden oder bedingt auszuweichen? Noch besser, gibt es eine Möglichkeit, die sich teilweise überlappenden Punkte nebeneinander zu legen? Wie Sie sehen können, ist meine X-Achse diskrete Kategorien und eine leichte Verschiebung nach links/rechts spielt keine Rolle. Ich habe versucht, mit binaxis='y' Dotplot, aber das verdirbt komplett die X-Achse.

Bearbeiten: This graph hat es geschafft, genau das zu tun, was ich suche.

Weitere Bearbeitung: Hinzufügen des Codes hinter dieser Visualisierung.

disciplines <- c("Comp. Sc.\n(17.2%)", "Physics\n(19.6%)", "Maths\n(29.4%)", "Pol.Sc.\n(40.4%)", "Psychology\n(69.8%)") 

# To stop ggplot from imposing alphabetical ordering on x-axis 
disciplines <- factor(disciplines, levels=disciplines, ordered=T) 

# involved aspects 
intensive <- c(0.660, 0.438, 0.515, 0.028, 0.443) 
comparative <- c(0.361, 0.928, 0.270, 0.285, 0.311) 
wh_adverbs <- c(0.431, 0.454, 0.069, 0.330, 0.577) 
past_tense <- c(0.334, 0.229, 0.668, 0.566, 0.838) 
present_tense <- c(0.680, 0.408, 0.432, 0.009, 0.996) 
conjunctions <- c(0.928, 0.207, 0.162, -0.299, -0.045) 
personal  <- c(0.498, 0.521, 0.332, 0.01, 0.01) 
interrogative <- c(0.266, 0.202, 0.236, 0.02, 0.02) 
sbj_objective <- c(0.913, 0.755, 0.863, 0.803, 0.913) 
possessive <- c(0.896, 0.802, 0.960, 0.611, 0.994) 
thrd_person <- c(-0.244, -0.265, -0.310, -0.008, -0.384) 
nouns  <- c(-0.602, -0.519, -0.388, -0.244, -0.196) 

df1 <- data.frame(disciplines, 
       "Intensive Adverbs"=intensive, 
       "Comparative Adverbs"=comparative, 
       "Wh-adverbs (WRB)"=wh_adverbs, 
       "Verb: Past Tense"=past_tense, 
       "Verb: Present Tense"=present_tense, 
       "Conjunctions"=conjunctions, 
       "Personal Pronouns"=personal, 
       "Interrogative Pronouns"=interrogative, 
       "Subjective/Objective Pronouns"=sbj_objective, 
       "Possessive Pronouns"=possessive, 
       "3rd-person verbs"=thrd_person, 
       "Nouns"=nouns, 
       check.names=F) 

df1.m <- melt(df1) 
grp <- ifelse(df1.m$variable %in% c('3rd-person verbs','Nouns'), 'Informational Features', 'Involved Features') 
g <- ggplot(df1.m, aes(group=grp, disciplines, value, shape=grp, colour=variable)) 
g <- g + geom_hline(yintercept=0, size=9, color="white") 
g <- g + geom_smooth(method=loess, span=0.75, level=0.95, alpha=I(0.16), linetype="dashed") 
g <- g + geom_point(size=4, alpha=I(0.7), position=position_jitter(width=0.1, height=0)) 
g <- g + scale_shape_manual(values=c(17,19)) 
+0

Sie ein reproduzierbares Beispiel (Daten + Code) zur Verfügung stellen sollten andere mit ihm spielen lassen ... – agstudy

+0

Added-Code. Hoffentlich hilft das :-) –

+1

Danke für den Code. P.S. Ihr Diagramm sieht nicht so sauber aus wie das biomedizinische Beispiel, da Ihre Y-Werte überall zu finden sind. Sie können jedoch die x-Werte in der Reihenfolge unten anordnen. – beroe

Antwort

3

Ich bin gespannt, was andere könnte darauf hindeuten, aber den Side-by-Side-Effekt zu erzielen, könnten Sie die wichtigsten x-Achse Kategorien als Zahlen-Code (10, 20, .. 50) plus/minus einem kleiner Betrag wie (0..10)/2 basierend auf den Kategorien, die Sie für die Farbe verwenden. Sie könnten also die x-Achse als 9.6, 9.8, 10.0, 10.2 ... und dann als 20.0, 20.2, 20.4 bekommen. Dies könnte ein organisiertes Diagramm erstellen, anstatt diese fraktionellen Anpassungen nach dem Zufallsprinzip zuzuweisen.

Hier ist eine schnelle Implementierung dieser Idee für Ihren Datensatz. Es versetzt die Hauptvariable x disciplines von einem Sechstel der Unterkategorie variable und verwendet diese ohne Jitter für den x-Wert ...

M = df1.m 
ScaleFactor = 6 
xadj = as.numeric(M$variable)/ScaleFactor 
xadj = xadj - mean(xadj) # shift it to center around zero 
x10 = as.numeric(M$disciplines) * 10 
M$x = x10 + xadj 
g = ggplot(M, aes(group=grp, x, value, shape=grp, colour=variable)) 
g + geom_point(size=4,alpha=I(0.7)) + scale_x_discrete(breaks=x10,labels=disciplines) 

anzumerken, dass die Werte innerhalb jeder Kategorie gleichmäßig auf und in den gleichen Abstand auftreten, Auftrag. (Dieser Code enthält nicht alle Kurvenanpassungen usw., die in der Abbildung dargestellt sind).

enter image description here

Variation: Sie können den Effekt noch deutlicher sehen, wenn Sie „quantisiert“ Ihre y-Werte, so dass mehr von ihnen Grundstück nebeneinander.

M$valmod = M$value - M$value %% 0.2 + .1 

Dann valmod anstelle von value in der aes() Anweisung den Effekt zu sehen.

Um die Kategorieetiketten zurück zu erhalten, setzen Sie sie manuell mit scale_x_discrete. Diese Version verwendet einen anderen ScaleFactor für einen breiteren Abstand und die quantisiert y-Achse:

M=df1.m 
ScaleFactor = 3 
# Note this could just be xadj instead of adding to data frame 
M$xadj = as.numeric(M$variable)/ScaleFactor 
M$xadj = M$xadj - mean(M$xadj) # shift it to center around zero 
M$x10 = as.numeric(M$disciplines) * 10 
M$x = M$x10 + M$xadj 

Qfact = 0.2 # resolution to quantize y values 
M$valmod = M$value - M$value %% Qfact + Qfact/2 # clump y to given resolution 

g = ggplot(M, aes(group=grp, x, valmod, shape=grp, colour=variable)) + 
    scale_x_discrete(limits = M$x10, breaks=unique(M$x10),labels=levels(M$disciplines)) 
g + geom_point(size=3,alpha=I(0.7)) 

quantized

+0

Ich verwende 'height = 0' in meinem Jitter. Die vertikalen Positionen aller Punkte stammen direkt aus den Daten. Ich mag einfach nicht, wie die horizontale Position verschoben wird, auch wenn keine anderen Datenpunkte in der Nähe sind. –

+0

Das sieht gut aus! Aber ...Gibt es eine Möglichkeit, die ursprünglichen Kategorienamen auf der X-Achse anstelle der numerischen Werte zurück zu bekommen? –

+0

Ja, das war "eine Übung für den Leser", aber ich habe es in ... hinzugefügt. Ich würde gerne sehen, dass dieser "einheitliche Jitter" zur Basis ggplot2 hinzugefügt wird. Vielleicht hätten einige der R-Gurus auch einen anderen Ansatz. – beroe

Verwandte Themen