正如我在《用R画meme ;)》里说的,meme包就可以拿来画,当然这个包是设计来画meme的,所以文本只会打在中间,如果你想在右下角之类的,不好意思,我没提供选项让你调文本位置,氮素,meme依然是你的好帮手,怎么说呢,meme不单能帮你读图片,还能用grid画出来,这意味着你可以用grid.text随便加个文本就OK了。

实例演示一发:

library(meme)
u <- system.file("angry8.jpg", package="meme")
x <- meme(u)
print(x)
grid.text("biobabble", x=.9, y=.05, 
	gp=gpar(col='white', cex=1.2))

由于提问说到ggplot2,这里讲一下。meme要支持ggplot2的输出也容易,不过我没看出必要性,所以懒得搞,要想用meme,你的ggplot2输出要先写图片。

如果想要ggplot2直接加水印,这有何难,不就是打个文本是吧?如果你想到geom_text或者annotate("text")之类的,赶紧面壁去,水平太差,这些只能打在画图区域里。你应该想到的是labs(caption=XXX),但是这里也有个问题,caption的位置是相对于画图区域的,你的图legend区域的大小是不一样的,或者有些图legend在画图区域之外,有些在内部,这会导致你加的水印在不同的图中相对的位置是不统一的。怎么办?!上面已经有答案了,还是一样的grid.text,因为ggplot2也是用grid画的,所以通用。

下面这个代码,黑色的biobabble是通过caption画的,相对位置是没法保障的,但红色的biobabble通过grid.text,位置在整张图片中,是固定的,在不同的图片中,是可以统一的。

p = ggplot(iris, aes(Sepal.Width, Petal.Width)) + 
	geom_point(aes(color=Species))
p + labs(caption="biobabble")
grid.text("biobabble", x=.9, y=.05, 
	gp=gpar(col='firebrick', cex=1.2))

  • grid是ggplot2成功背后的男人,笑哭🤣~
  • 用Y叔的shadowtext包,可以打出有阴影效果的水印,你懂的🍻
  • 用Y叔的emojifont包,可以打上emoji或者图标logo(比如微信的水印有微信的logo)👻
  • 用Y叔的ggimage包,你甚至于可以用图片来当水印🤡
  • Y叔才是花样打水印背后的男人🙈