2017-09-03 2 views
2

Die Daten, an denen ich arbeite, sind Clustering-Daten, mit mehreren Beobachtungen innerhalb einer Gruppe. Ich habe ein Raupe-Plot erstellt und möchte für jede Gruppe (zipid), nicht jede Zeile, meine aktuelle Grafik und Code sieht wie folgt aus:R Grafik: Bezeichnung nach Gruppe

text = hosp_new[,c("zipid")] 
    ggplot(hosp_new, aes(x = id, y = oe, colour = zipid, shape = group)) + 
    # theme(panel.grid.major = element_blank()) + 
    geom_point(size=1) + 
    scale_shape_manual(values = c(1, 2, 4)) + 
    geom_errorbar(aes(ymin = low_ci, ymax = high_ci)) + 
    geom_smooth(method = lm, se = FALSE) + 
    scale_linetype_manual(values = linetype) + 
    geom_segment(aes(x = start_id, xend = end_id, y = region_oe, yend = region_oe, linetype = "4", size = 1.2)) + 
    geom_ribbon(aes(ymin = region_low_ci, ymax = region_high_ci), alpha=0.2, linetype = "blank") + 
    geom_hline(aes(yintercept = 1, alpha = 0.2, colour = "red", size = 1), show.legend = "FALSE") + 
    scale_size_identity() + 
    scale_x_continuous(name = "hospital id", breaks = seq(0,210, by = 10)) + 
    scale_y_continuous(name = "O:E ratio", breaks = seq(0,7, by = 1)) + 
    geom_text(aes(label = text), position = position_stack(vjust = 10.0), size = 2) 

Caterpillar Grundstück:

caterpillar plot

Jede Farbe stellt einen Bereich dar, ich will nur ein Etikett/pro Region, aber nicht wissen, wie die duplizierten Etiketten löschen in diesem Diagramm. Irgendeine Idee?

+2

Willkommen bei Stack-Überlauf! Bitte denken Sie daran, dass Sie im Tag "r" in Ihrem Beispiel vollständig reproduzierbare, lauffähige Codes/Daten angeben müssen, einschließlich Bibliotheksanweisungen, Beispieldaten usw. Bitte bearbeiten Sie Ihre Frage entsprechend. –

+0

Sie könnten einen zweiten Datenrahmen mit der Bezeichnung und dem Mittelpunkt jeder Krankenhaus-ID erstellen und diese an geom_text übergeben. Sie können aber auch Facetten oder ... verwenden. Für genauere Hilfe sollte jedoch ein kleines Beispiel-Dataset hinzugefügt werden Beispiel für hosp_new mit nur wenigen Krankenhaus-IDs: wie die Ergebnisse von 'dput (dropevels (hosp_new [hosp_new $ id% in% sample (hosp_new $ id, 3),])) zu deiner Frage hinzufügen. – user20650

Antwort

5

Der Schlüssel ist, dass geom_text nur einen Wert für jeden zipid zurückgibt, anstatt mehrere Werte. Wenn wir jedes zipid Label in der Mitte seiner Gruppe haben wollen, dann können wir den Durchschnittswert von id als x-Koordinate für jedes Label verwenden. Im folgenden Code verwenden wir stat_summaryh (aus dem Paket), um den Durchschnittswert id für die X-Koordinate des Labels zu berechnen und ein einzelnes Label für jedes zipid zurückzugeben.

library(ggplot2) 
theme_set(theme_bw()) 
library(ggstance) 

# Fake data 
set.seed(300) 
dat = data.frame(id=1:100, y=cumsum(rnorm(100)), 
       zipid=rep(LETTERS[1:10], c(10, 5, 20, 8, 7, 12, 7, 10, 13,8))) 

ggplot(dat, aes(id, y, colour=zipid)) + 
    geom_segment(aes(xend=id, yend=0)) + 
    stat_summaryh(fun.x=mean, aes(label=zipid, y=1.02*max(y)), geom="text") + 
    guides(colour=FALSE) 

enter image description here

Sie auch Facettierung nutzen könnten, wie von @ user20650 erwähnt. Im folgenden Code entfernt panel.spacing.x=unit(0,'pt') den Abstand zwischen den Facettenpanels, während expand=c(0,0.5) die Seitenflächen jedes Panels mit 0,5 Polstereinheiten ausfüllt. Zusammen sorgen diese für konstanten Abstand zwischen Teilstrichen, auch über Facetten hinweg.

ggplot(dat, aes(id, y, colour=zipid)) + 
    geom_segment(aes(xend=id, yend=0)) + 
    facet_grid(. ~ zipid, scales="free_x", space="free_x") + 
    guides(colour=FALSE) + 
    theme_classic() + 
    scale_x_continuous(breaks=0:nrow(dat), 
        labels=c(rbind(seq(0,100,5),'','','',''))[1:(nrow(dat)+1)], 
        expand=c(0,0.5)) + 
    theme(panel.spacing.x = unit(0,"pt")) 

enter image description here