ggplot2の個々のファセットにテキストに注釈を付ける


150

プロットの最後のファセットにあるテキストに次のコードで注釈を付けたいです。

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)

ここに画像の説明を入力してください

しかし、このコードはすべてのファセットのテキストに注釈を付けます。1つのファセットのみで注釈付きテキストを取得する方法をご案内いただければ幸いです。


1
これはまだ実装されていないと思います。そのため、テキストとデータをファセットするための列を使用してデータフレームを構築する、実証済みの方法に頼る必要があると思います。
joran

回答:


144

通常、次のようにします。

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")

factor変数を完全に指定しなくても機能するはずですが、おそらくいくつかの警告がスローされます。

ここに画像の説明を入力してください


2
ファセットプロットでgeom_text()を使用しようとすると、ぼやけたラベルに遭遇するようです。これは、ここで説明したのと同じ問題(groups.google.com/forum/?fromgroups=#!topic/ggplot2/evsbeBT48M4)であり、annotate( "text"、...)を使用して解決されました。他の誰かがgeom_text()でぼやけたラベルを取得しますか?
マーガレット

6
@Margaret通常、これは、誤ってggplotに、元のデータフレーム(ポイント、ラインなどを含むもの)のすべての行の各ラベルのコピーをプロットするように指示したためです。geom_text1行のみの個別のデータフレームを渡すことに注意してください。
joran 2013

3
わかりました。ありがとうございます。ファセットプロットに3つの異なるラベルを付けたい場合はどうしますか?ファセットと同じ数の行を含み、各行に一意のラベルがあるデータフレームを試しました。多分私はこれを別の質問として始めるべきです。
マーガレット

8
解決策をありがとう。これを使ってこれを行うこともできannotate()ますか...?
偏光

2
@ user3420448同じですが、ファセット変数ごとに値を指定する必要があります。
joran

106

これはテキスト注釈のないプロットです:

library(ggplot2)

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

テキスト注釈なしのプロット

テキスト注釈を保持する追加のデータフレームを作成してみましょう。

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
)

エッジにテキスト注釈を付けてプロット

または、各ラベルの位置を手動で指定することもできます。

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)
)

手動で配置されたテキストラベルでプロット

2つのファセットにわたるプロットにラベルを付けることもできます。

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
  )

2つの変数によるファセット

ノート:

  • -InfおよびInfを使用して、テキストをパネルの端に配置できます。
  • とを使用hjustvjustて、テキストの位置揃えを調整できます。
  • テキストラベルデータフレームにdat_textは、facet_grid()またはで機能する列が必要facet_wrap()です。

6
この回答は、各ステップをどれだけ明確に進めるかについて、受け入れられた回答(明らかに2つの間の5年の差)よりも優れています。また、より明確かつ説明します。
ブランドン

1
テキストを複数の行に追加する場合colnames()は、テキスト内のが、data.frameプロットしようとしているデータのものと一致していることを確認してください。
コッツ2018年

ファセットの1つに対してこれを実行しようとすると、注釈が表示されますが、実際のポイントはなくなっています(または不明瞭ですか?)。
ベンG

ベンGさん、コードと図を共有するための新しい投稿を作成することを検討してください。
カミルSlowikowski

35

誰かがレポートまたはパブリケーションのファセットにラベルを付ける簡単な方法を探している場合、eggCRAN)パッケージにはかなり気の利いたtag_facet()tag_facet_outside()関数があります。

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_facet(p)

注:ストリップのテキストと背景を保持したい場合は、元の関数に追加strip.textstrip.backgroundて、元に戻すthemetheme(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) 
}

右上揃えでローマ数字を使用

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

左下に揃えて大文字を使用

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

独自のタグを定義する

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)

外にタグを付ける

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)

編集stickylabellerパッケージを使用して別の代替を追加する

- `.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)

reprexパッケージ(v0.2.1)によって作成されました


2
ソースは、「追加ラベルファセットとセットにggplotにダミーテキストレイヤーが空白にストリップをファセット。」と言うエルゴ、あなたが持っている場合は、カスタムのファセットラベルがために、スクリプト編集、あなたは失いたくないストリップtag_facetnixingでstrip.text = element_blank()
CrunchyTopping

@CrunchyToppingこれは実際に私が探していた帽子でしたが、私にはうまくいかないようです:Warning: Ignoring unknown parameters: strip.text
efrem

上記の私の問題に答えるために...この投稿はストリップを維持する方法をうまく説明しています:stackoverflow.com/a/56064130/3609450
efrem

22

上記の答えはlab = "Text"は役に立たないと思います。以下のコードも問題ありません。

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

ただし、別のサブグラフで別のラベルを付けたい場合は、次の方法で問題ありません。

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) )

7
すでに与えられ、受け入れられている回答と比較して、ソリューションが提供するものを詳しく説明する必要があります。
Sascha Wolf

3
おかげで、これはさまざまなサブグラフのラベル付けに役立ちました。
Deathkill14

何らかの理由で、これを行うと、係数cyl = 2およびcyl = 3の(空の)ファセットが追加されます。
emudrak 2017年

6

joranの優れた答えを少し拡張して、ラベルのデータフレームがどのように機能するかを明確にします。

"mpg"と "wt"はそれぞれx座標とy座標と考えることができます(元の変数名を追跡する方が、Kamilの優れた回答のように名前を変更するよりも簡単です)。ラベルごとに1つの行が必要です。「cyl」列は、各行が関連付けられているファセットを示します。

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)

ラベル付きのプロット


2

私はeggパッケージについて知らなかったので、これは単純なggplot2パッケージソリューションです

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)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.