it-swarm.com.de

Kommentieren von Text auf einzelnen Facetten in ggplot2

Ich möchte etwas Text auf der letzten Facette des Diagramms mit folgendem Code kommentieren:

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)

enter image description here

Dieser Code kommentiert jedoch den Text auf jeder Facette. Ich würde mich sehr freuen, wenn Sie mich anleiten würden, wie Sie den kommentierten Text auf nur einer Seite erhalten. Danke im Voraus.

103
MYaseen208

Normalerweise würden Sie so etwas tun:

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, aber es werden wahrscheinlich einige Warnungen ausgegeben:

enter image description here

113
joran

Hier ist die Darstellung ohne Textanmerkungen:

library(ggplot2)

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

 plot without text annotations

Erstellen Sie 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 with text annotations at edges

Alternativ können Sie die Position jedes Etiketts manuell festlegen:

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 with manually positioned text labels

Wir können Diagramme auch in zwei Facetten 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
  )

 facet by two variables

Anmerkungen:

  • Sie können -Inf und Inf verwenden, um Text an den Rändern eines Bedienfelds zu positionieren.
  • Sie können hjust und vjust verwenden, um die Textausrichtung anzupassen.
  • Der Datenbeschriftungsdatenrahmen dat_text sollte eine Spalte haben, die mit Ihrer facet_grid() oder facet_wrap() zusammenarbeitet.
64

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 unterschiedliche Beschriftungen in verschiedenen Subgraphen unterschiedlich beschriften möchten, ist dies auf folgende Weise 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) )
21
kdyhl

Wenn jemand nach einer einfachen Möglichkeit sucht, Facetten für Berichte oder Publikationen zu kennzeichnen, hat die Entwicklungsversion des Pakets Egg die Funktion tag_facet() 

library(ggplot2)

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

# devtools::install_github("baptiste/Egg")
library(Egg)

tag_facet(p)

tag_facet(p, x = Inf, y = Inf, hjust = 1)

tag_facet(p, x = -Inf, y = -Inf, vjust = -1)

10
Tung

Ich wusste nichts über das Egg -Paket, daher hier eine einfache ggplot2 -Paketlö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)
0
Erich Neuwirth

Jorans hervorragende Antwort wurde leicht erweitert, um die Funktionsweise des Label-Datenrahmens zu klären. 

Sie können sich "mpg" und "wt" als X- und Y-Koordinaten vorstellen (ich finde es einfacher, die ursprünglichen Variablennamen zu verfolgen, als sie umzubenennen, wie in Kamils ​​ebenfalls exzellenter Antwort). Sie benötigen eine Zeile pro Beschriftung, und die Spalte "Zyl" zeigt, mit welcher Facette jede Zeile verknüpft 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 with labels

0
John