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)
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.
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:
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
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
)
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)
)
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
)
Anmerkungen:
-Inf
und Inf
verwenden, um Text an den Rändern eines Bedienfelds zu positionieren.hjust
und vjust
verwenden, um die Textausrichtung anzupassen.dat_text
sollte eine Spalte haben, die mit Ihrer facet_grid()
oder facet_wrap()
zusammenarbeitet.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) )
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)
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)
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)