2012-06-08 3 views
27

Beim Hinzufügen von Annotation Text zu einem Diagramm habe ich festgestellt, dass geom_text() produziert unschönen, gezackten Text, während annotate() glatt, schön aussehenden Text produziert. Weiß jemand, warum das passiert und ob es einen Weg gibt, es zu beheben? Ich weiß, ich könnte annotate() hier verwenden, aber es gibt wahrscheinlich Fälle, in denen geom_text() vorzuziehen ist, und ich würde gerne eine Lösung finden. Auch geom_text() kann nicht beabsichtigt sein, um schlecht aussehenden Text zu geben, so entweder ich mache etwas falsch, oder ich habe in irgendeiner Art von subtilen Nebeneffekt gerannt.ggplot2: Gibt es einen Fix für gezackten, qualitativ schlechten Text von geom_text() produziert?

Hier sind einige gefälschte Daten und der Code, um das Diagramm zu erstellen, plus ein Bild, das die Ergebnisse zeigt.

library(ggplot2) 
age = structure(list(age = c(41L, 40L, 43L, 44L, 40L, 42L, 44L, 45L, 
     44L, 41L, 43L, 40L, 43L, 43L, 40L, 42L, 43L, 44L, 43L, 41L)), 
     .Names = "age", row.names = c(NA, -20L), class = "data.frame") 
ggplot(age, aes(age)) + 
    geom_histogram() + 
    scale_x_continuous(breaks=seq(40,45,1)) + 
    stat_bin(binwidth=1, color="black", fill="blue") + 
    geom_text(aes(41, 5.2, 
      label=paste("Average = ", round(mean(age),1))), size=12) + 
    annotate("text", x=41, y=4.5, 
      label=paste("Average = ", round(mean(age$age),1)), size=12) 

enter image description here

+0

Struktur zu verwenden ist in Ordnung, aber vergessen Sie nicht zuweisen: '' '' age = structure' '' '. Ich habe dein Beispiel bearbeitet. –

+0

Mein Fix ist, dass ich alle wichtigen Elemente in 'ggplot' erzeuge, dann' ggsave (file = "plot.eps") 'und editiere diese mit Adobe Illustrator oder einem anderen Vektorgrafikprogramm für Publikationsqualitätszahlen. – Maiasaura

Antwort

51

geom_text, obwohl sie nicht alles direkt aus dem age data.frame verwenden, wird immer noch mit ihm für seine Datenquelle. Daher legt es 20 Kopien von "Average = 42.3" auf die Handlung, einen für jede Reihe. Es ist das mehrfache Überschreiben, das es so schlecht aussehen lässt. geom_text ist entworfen, um Text auf einem Diagramm zu setzen, wo die Information von einem dat.frame kommt (das es entweder direkt oder indirekt im ursprünglichen Anruf ggplot gegeben wird). annotate ist für einfache einmalige Ergänzungen wie Sie haben (es erstellt eine geom_text, kümmert sich um die Datenquelle).

Wenn Sie wirklich geom_text() verwenden möchten, setzen Sie einfach die Datenquelle:

ggplot(age, aes(age)) + 
    scale_x_continuous(breaks=seq(40,45,1)) + 
    stat_bin(binwidth=1, color="black", fill="blue") + 
    geom_text(aes(41, 5.2, 
      label=paste("Average = ", round(mean(age$age),1))), size=12, 
      data = data.frame()) + 
    annotate("text", x=41, y=4.5, 
      label=paste("Average = ", round(mean(age$age),1)), size=12) 

enter image description here

+0

Gut zu verstehen, wie 'geom_text()' funktioniert. Danke für deine Hilfe, Brian. – eipi10

+0

+1 Brian, ein Beispiel für eine gut geschriebene und bebilderte Antwort und nützlichen Tipp zu 'annotieren()'. –

+0

sollte es nicht 'mean (Alter $ age)' für 'geom_text' sein, da Sie die Daten zurücksetzen? – colinfang

Verwandte Themen