Kommentieren von Text zu einzelnen Facetten in ggplot2

150

Ich möchte einen Text auf der letzten Facette des Plots mit dem folgenden Code versehen:

library(ggplot2)
p <- ggplot(mtcars, aes(mpg, wt)) + geom_point()
p <- p + facet_grid(. ~ cyl)
p <- p + annotate("text", label = "Test", size = 4, x = 15, y = 5)
print(p)

Geben Sie hier die Bildbeschreibung ein

Dieser Code kommentiert jedoch den Text auf jeder Facette. Ich würde mich sehr freuen, wenn Sie mir zeigen, wie Sie den kommentierten Text nur auf einer Facette erhalten.

MYaseen208
quelle
1
Ich glaube, dies ist noch nicht implementiert , daher müssen Sie vermutlich auf die bewährte Methode zurückgreifen, einen Datenrahmen mit dem Text und einer Spalte für die Facettierungsvariable zu erstellen.
Joran

Antworten:

143

Normalerweise machen Sie so etwas:

ann_text <- data.frame(mpg = 15,wt = 5,lab = "Text",
                       cyl = factor(8,levels = c("4","6","8")))
p + geom_text(data = ann_text,label = "Text")

Es sollte funktionieren, ohne die Faktorvariable vollständig anzugeben, wird aber wahrscheinlich einige Warnungen auslösen:

Geben Sie hier die Bildbeschreibung ein

Joran
quelle
2
Ich scheine auf einige verschwommene Beschriftungen zu stoßen, wenn ich versuche, geom_text () für mein facettiertes Diagramm zu verwenden. Es ist das gleiche Problem, das hier diskutiert wurde ( groups.google.com/forum/?fromgroups=#!topic/ggplot2/evsbeBT48M4 ) und mit annotate ("text", ...) behoben wurde. Bekommt sonst noch jemand verschwommene Beschriftungen mit geom_text ()?
Margaret
6
@Margaret Normalerweise liegt das daran, dass Sie ggplot fälschlicherweise angewiesen haben, für jede Zeile in Ihrem ursprünglichen Datenrahmen (die mit den Punkten, Linien usw.) eine Kopie jedes Etiketts zu zeichnen. Beachten Sie, dass ich einen separaten Datenrahmen geom_textmit nur einer Zeile übergebe.
Joran
3
Ok, das habe ich - Danke. Was wäre, wenn Sie Ihrem facettierten Plot 3 verschiedene Beschriftungen hinzufügen möchten? Ich habe einen Datenrahmen mit so vielen Zeilen wie Facetten und eindeutigen Beschriftungen in jeder Zeile ausprobiert. Vielleicht sollte ich dies als separate Frage beginnen.
Margaret
8
Vielen Dank für Ihre Lösung. Ich frage mich, ob ich das auch mit annotate()... machen kann?
Polarisieren Sie den
2
@ user3420448 Das gleiche, Sie müssen nur Werte für jede Facettenvariable angeben.
Joran
106

Hier ist die Handlung ohne Textanmerkungen:

library(ggplot2)

p <- ggplot(mtcars, aes(mpg, wt)) +
  geom_point() +
  facet_grid(. ~ cyl) +
  theme(panel.spacing = unit(1, "lines"))
p

Plot ohne Textanmerkungen

Erstellen wir einen zusätzlichen Datenrahmen für die Textanmerkungen:

dat_text <- data.frame(
  label = c("4 cylinders", "6 cylinders", "8 cylinders"),
  cyl   = c(4, 6, 8)
)
p + geom_text(
  data    = dat_text,
  mapping = aes(x = -Inf, y = -Inf, label = label),
  hjust   = -0.1,
  vjust   = -1
)

Plot mit Textanmerkungen an den Kanten

Alternativ können wir die Position jedes Etiketts manuell angeben:

dat_text <- data.frame(
  label = c("4 cylinders", "6 cylinders", "8 cylinders"),
  cyl   = c(4, 6, 8),
  x     = c(20, 27.5, 25),
  y     = c(4, 4, 4.5)
)

p + geom_text(
  data    = dat_text,
  mapping = aes(x = x, y = y, label = label)
)

Plot mit manuell positionierten Textbeschriftungen

Wir können Diagramme auch über zwei Facetten hinweg beschriften:

dat_text <- data.frame(
  cyl   = c(4, 6, 8, 4, 6, 8),
  am    = c(0, 0, 0, 1, 1, 1)
)
dat_text$label <- sprintf(
  "%s, %s cylinders",
  ifelse(dat_text$am == 0, "automatic", "manual"),
  dat_text$cyl
)
p +
  facet_grid(am ~ cyl) +
  geom_text(
    size    = 5,
    data    = dat_text,
    mapping = aes(x = Inf, y = Inf, label = label),
    hjust   = 1.05,
    vjust   = 1.5
  )

Facette durch zwei Variablen

Anmerkungen:

  • Sie können Text verwenden -Infund Infan den Rändern eines Bedienfelds positionieren.
  • Sie können die Textausrichtung verwenden hjustund vjustanpassen.
  • Der Textbeschriftungsdatenrahmen dat_textsollte eine Spalte haben, die mit Ihrem facet_grid()oder zusammenarbeitet facet_wrap().
Kamil Slowikowski
quelle
6
Diese Antwort ist der akzeptierten Antwort (offensichtlich ein Unterschied von 5 Jahren zwischen den beiden) überlegen, da sie jeden Schritt klar durchläuft. Auch mehr Klarheit und Erklärungen.
Brandon
1
Wenn Sie mehreren Zeilen Text hinzufügen möchten, stellen Sie sicher, dass Ihre colnames()Texte data.framemit denen der Daten übereinstimmen, die Sie zeichnen möchten .
Kots
Wenn ich dies für eine meiner Facetten versuche, wird die Anmerkung angezeigt, aber die tatsächlichen Punkte sind weg (oder verdeckt?).
Ben G
Ben G, Sie könnten einen neuen Beitrag erstellen, um Ihren Code und Ihre Figur zu teilen.
Kamil Slowikowski
35

Wenn jemand für eine einfache Möglichkeit zur Kennzeichnung von Facetten für Berichte oder Publikationen suchen, die egg( CRAN hat) Paket ziemlich raffinierte tag_facet()und tag_facet_outside()Funktionen.

library(ggplot2)

p <- ggplot(mtcars, aes(qsec, mpg)) + 
  geom_point() + 
  facet_grid(. ~ am) +
  theme_bw(base_size = 12)

# install.packages('egg', dependencies = TRUE)
library(egg)

Tag innen

Standard

tag_facet(p)

Hinweis: Wenn Sie den Streifentext und den Hintergrund beibehalten möchten, versuchen Sie , die ursprüngliche Funktion hinzuzufügen strip.textundstrip.background wieder aufzunehmen themeoder daraus zu entfernen .theme(strip.text = element_blank(), strip.background = element_blank())tag_facet()

tag_facet <- function(p, open = "(", close = ")", tag_pool = letters, x = -Inf, y = Inf, 
                      hjust = -0.5, vjust = 1.5, fontface = 2, family = "", ...) {

  gb <- ggplot_build(p)
  lay <- gb$layout$layout
  tags <- cbind(lay, label = paste0(open, tag_pool[lay$PANEL], close), x = x, y = y)
  p + geom_text(data = tags, aes_string(x = "x", y = "y", label = "label"), ..., hjust = hjust, 
                vjust = vjust, fontface = fontface, family = family, inherit.aes = FALSE) 
}

Oben rechts ausrichten und römische Ziffern verwenden

tag_facet(p, x = Inf, y = Inf, 
          hjust = 1.5,
          tag_pool = as.roman(1:nlevels(factor(mtcars$am))))

Unten links ausrichten und Großbuchstaben verwenden

tag_facet(p, 
          x = -Inf, y = -Inf, 
          vjust = -1,
          open = "", close = ")",
          tag_pool = LETTERS)

Definieren Sie Ihre eigenen Tags

my_tag <- c("i) 4 cylinders", "ii) 6 cyls")
tag_facet(p, 
          x = -Inf, y = -Inf, 
          vjust = -1, hjust = -0.25,
          open = "", close = "",
          fontface = 4,
          size = 5,
          family = "serif",
          tag_pool = my_tag)

Tag draußen

p2 <- ggplot(mtcars, aes(qsec, mpg)) + 
  geom_point() + 
  facet_grid(cyl ~ am, switch = 'y') +
  theme_bw(base_size = 12) +
  theme(strip.placement = 'outside')

tag_facet_outside(p2)

Bearbeiten : Hinzufügen einer weiteren Alternative mit dem Stickylabeller- Paket

- `.n` numbers the facets numerically: `"1"`, `"2"`, `"3"`...
- `.l` numbers the facets using lowercase letters: `"a"`, `"b"`, `"c"`...
- `.L` numbers the facets using uppercase letters: `"A"`, `"B"`, `"C"`...
- `.r` numbers the facets using lowercase Roman numerals: `"i"`, `"ii"`, `"iii"`...
- `.R` numbers the facets using uppercase Roman numerals: `"I"`, `"II"`, `"III"`...

# devtools::install_github("rensa/stickylabeller")
library(stickylabeller)

ggplot(mtcars, aes(qsec, mpg)) + 
  geom_point() + 
  facet_wrap(. ~ am, 
             labeller = label_glue('({.l}) am = {am}')) +
  theme_bw(base_size = 12)

Erstellt vom reprex-Paket (v0.2.1)

Tung
quelle
2
Quelle sagt , „fügt eine Dummy - Textebene zu einem ggplot zu Etikett Facetten und Sätze Streifen blank Facette.“ Ergo, wenn Sie benutzerdefinierte Facette Label Streifen Sie wollen nicht verlieren, bearbeiten Sie das Skript für tag_facetvon nixingstrip.text = element_blank()
CrunchyTopping
@CrunchyTopping Das war eigentlich der Hut, den ich gesucht habe, aber es scheint nicht für mich zu funktionieren:Warning: Ignoring unknown parameters: strip.text
efrem
Um meine obigen Probleme zu beantworten ... dieser Beitrag erklärt gut, wie man die Streifen behält
efrem
22

Ich denke für die Antwort oben lab = "Text" ist nutzlos, der Code unten ist auch ok.

ann_text <- data.frame(mpg = 15,wt = 5,
                       cyl = factor(8,levels = c("4","6","8")))
p + geom_text(data = ann_text,label = "Text" )

Wenn Sie jedoch in verschiedenen Untergraphen unterschiedlich beschriften möchten, ist dies folgendermaßen in Ordnung:

ann_text <- data.frame(mpg = c(14,15),wt = c(4,5),lab=c("text1","text2"),
                       cyl = factor(c(6,8),levels = c("4","6","8")))
p + geom_text(data = ann_text,aes(label =lab) )
kdyhl
quelle
7
Sie sollten ausführlich erklären, was Ihre Lösung im Vergleich zu der bereits gegebenen und akzeptierten Antwort bietet.
Sascha Wolf
3
Vielen Dank, dies war nützlich, um verschiedene Subgraphen zu kennzeichnen.
Deathkill14
Aus irgendeinem Grund werden dabei (leere) Facetten für die Faktoren cyl = 2 und cyl = 3 hinzugefügt.
Emudrak
6

Erweitern Sie leicht Jorans ausgezeichnete Antwort, um zu verdeutlichen, wie der Etiketten-Datenrahmen funktioniert.

Sie können sich "mpg" und "wt" als x- bzw. y-Koordinaten vorstellen (ich finde es einfacher, die ursprünglichen Variablennamen zu verfolgen, als sie umzubenennen, wie in Kamils ​​ebenfalls ausgezeichneter Antwort). Sie benötigen eine Zeile pro Beschriftung, und die Spalte "Zyl." Zeigt an, welcher Facette jede Zeile zugeordnet ist.

ann_text<-data.frame(mpg=c(25,15),wt=c(3,5),cyl=c(6,8),label=c("Label 1","Label 2"))

ann_text
>  mpg wt cyl  label
>  25  3   6   Label 1
>  15  5   8   Label 2

p <- ggplot(mtcars, aes(mpg, wt)) + geom_point()
p <- p + facet_grid(. ~ factor(cyl))
p + geom_text(data = ann_text,label=ann_text$label)

Plot mit Beschriftungen

John
quelle
2

Ich wusste nichts über das eggPaket, daher hier eine einfache ggplot2Paketlösung

library(tidyverse)
library(magrittr)
Data1=data.frame(A=runif(20, min = 0, max = 100), B=runif(20, min = 0, max = 250), C=runif(20, min = 0, max = 300))
Data2=data.frame(A=runif(20, min = -10, max = 50), B=runif(20, min = -5, max = 150), C=runif(20, min = 5, max = 200))
bind_cols(
Data1 %>% gather("Vars","Data_1"),
Data2 %>% gather("Vars","Data_2")
) %>% select(-Vars1) -> Data_combined
Data_combined %>%
  group_by(Vars) %>%
  summarise(r=cor(Data_1,Data_2),
            r2=r^2,
            p=(pt(abs(r),nrow(.)-2)-pt(-abs(r),nrow(.)-2))) %>%
  mutate(rlabel=paste("r:",format(r,digits=3)),
         plabel=paste("p:",format(p,digits=3))) ->
  label_df 
label_df %<>% mutate(x=60,y=190)
Data_combined %>%
  ggplot(aes(x=Data_1,y=Data_2,color=Vars)) +
  geom_point() + 
  geom_smooth(method="lm",se=FALSE) +
  geom_text(data=label_df,aes(x=x,y=y,label=rlabel),inherit.aes = FALSE) + 
  geom_text(data=label_df,aes(x=x,y=y-10,label=plabel),inherit.aes = FALSE) + 
    facet_wrap(~ Vars)
Erich Neuwirth
quelle