R 在多面板ggplot2中为单个面板添加标签
我对尝试为我正在ggplot中准备的多面板图形创建简单的角点标签感兴趣,但答案只是解释了如何在绘图顶部添加标签,而不是按照许多期刊要求的格式生成角标签。我希望复制类似于R 在多面板ggplot2中为单个面板添加标签,r,ggplot2,label,panel,R,Ggplot2,Label,Panel,我对尝试为我正在ggplot中准备的多面板图形创建简单的角点标签感兴趣,但答案只是解释了如何在绘图顶部添加标签,而不是按照许多期刊要求的格式生成角标签。我希望复制类似于ggplot2中的plotrix函数corner.label() require(plotrix) foo1<-rnorm(50,25,5) foo2<-rpois(50,25) foo3<-rbinom(50,25,0.5) foo4<-rnbinom(50,25,0.5) par(mfrow=c(2
ggplot2
中的plotrix
函数corner.label()
require(plotrix)
foo1<-rnorm(50,25,5)
foo2<-rpois(50,25)
foo3<-rbinom(50,25,0.5)
foo4<-rnbinom(50,25,0.5)
par(mfrow=c(2,2))
hist(foo1)
corner.label(label='a',figcorner=T)
hist(foo2)
corner.label(label='b',figcorner=T)
hist(foo3)
corner.label(label='c',figcorner=T)
hist(foo4)
corner.label(label='d',figcorner=T)
下面是一个使用plottrix
的示例,我想在ggplot2
中重新创建它
require(plotrix)
foo1<-rnorm(50,25,5)
foo2<-rpois(50,25)
foo3<-rbinom(50,25,0.5)
foo4<-rnbinom(50,25,0.5)
par(mfrow=c(2,2))
hist(foo1)
corner.label(label='a',figcorner=T)
hist(foo2)
corner.label(label='b',figcorner=T)
hist(foo3)
corner.label(label='c',figcorner=T)
hist(foo4)
corner.label(label='d',figcorner=T)
require(plotrix)
foo1一个例子:
d <- data.frame(x = runif(16),
y = runif(16),
grp = rep(letters[1:4],each = 4))
ggplot(d,aes(x = x,y = y)) +
facet_wrap(~grp) +
geom_point() +
theme(strip.text = element_text(hjust = -0.05),
strip.background = element_blank())
d我遇到了同样的问题,并提出了以下解决方案,但有点不同:
加载r包
示例数据
这里有一个使用自定义标签功能的解决方案。这不涉及对数据的任何操作。目前,它仅适用于一维面(facet_wrap)。我还在研究如何沿二维网格递增
定义labeller函数
make_labelstring <- function(mypanels) {
mylabels <- sapply(mypanels,
function(x) {LETTERS[which(mypanels == x)]})
return(mylabels)
}
label_panels <- ggplot2::as_labeller(make_labelstring)
最近的两项变化使这一点变得容易得多:
- 最新版本的
ggplot2
添加了tag
标题,可用于标记子批次
- 软件包
patchwork
使绘制多个ggplot对象变得非常容易李>
这意味着不需要更改grobs。调整Kev提供的可复制示例:
library(ggplot2)
# install.package("patchwork")
library(patchwork)
a <- 1:20
b <- sample(a, 20)
c <- sample(b, 20)
d <- sample(c, 20)
mydata <- data.frame(a, b, c, d)
myplot1 <- ggplot(mydata, aes(x=a, y=b)) + geom_point() + labs(tag = "A")
myplot2 <- ggplot(mydata, aes(x=b, y=c)) + geom_point() + labs(tag = "B")
myplot3 <- ggplot(mydata, aes(x=c, y=d)) + geom_point() + labs(tag = "C")
myplot4 <- ggplot(mydata, aes(x=d, y=a)) + geom_point() + labs(tag = "D")
myplot1 + myplot2 + myplot3 + myplot4
有关自定义ggplot2主题的更多信息,请参阅。您能否澄清标签的确切外观?您是否需要将刻面标签全部推到左侧?或者您需要完全移除刻面标签带吗?我只需要将标签对齐到每个面板的左上角。我不知道你删除刻面标签条带是什么意思。好的,然后查看?主题,并为条带设置hjust.text
。有没有办法让标签位于绘图/轴区域之外?与corner.label()中的“figcorner=T”选项类似?@Thraupidae您可以将hjust
设置为负值,但随后b和d将漂移到其他面板中。@Thraupidae请参见我的编辑。我想这更接近你想要的。(并且应该解释为什么我要问小面带。)好的,为了防止漂移到其他面板上,我想你只需要使用plot.margin来处理间距问题?啊,是的,这看起来非常接近我希望去除小面带的效果。谢谢这太棒了。这比IMO公认的解决方案更简单、更普遍适用、更易于实施。谢谢!您能将标签
改为粗体、更改大小等吗。?如何做到这一点?好问题:在原始答案的基础上添加更多内容以涵盖您的观点。ggplot2的几乎每个组件都可以通过主题
参数进行定制。谢谢!我试图找到文档,但似乎没有很多人使用它!
myplot1 <- ggplot(mydata, aes(x=a, y=b)) + geom_point()
myplot2 <- ggplot(mydata, aes(x=b, y=c)) + geom_point()
myplot3 <- ggplot(mydata, aes(x=c, y=d)) + geom_point()
myplot4 <- ggplot(mydata, aes(x=d, y=a)) + geom_point()
myplot1 <- arrangeGrob(myplot1, top = textGrob("A", x = unit(0, "npc")
, y = unit(1, "npc"), just=c("left","top"),
gp=gpar(col="black", fontsize=18, fontfamily="Times Roman")))
myplot2 <- arrangeGrob(myplot2, top = textGrob("B", x = unit(0, "npc")
, y = unit(1, "npc"), just=c("left","top"),
gp=gpar(col="black", fontsize=18, fontfamily="Times Roman")))
myplot3 <- arrangeGrob(myplot3, top = textGrob("C", x = unit(0, "npc")
, y = unit(1, "npc"), just=c("left","top"),
gp=gpar(col="black", fontsize=18, fontfamily="Times Roman")))
myplot4 <- arrangeGrob(myplot4, top = textGrob("D", x = unit(0, "npc")
, y = unit(1, "npc"), just=c("left","top"),
gp=gpar(col="black", fontsize=18, fontfamily="Times Roman")))
grid.arrange(myplot1, myplot2, myplot3, myplot4, ncol = 2)
make_labelstring <- function(mypanels) {
mylabels <- sapply(mypanels,
function(x) {LETTERS[which(mypanels == x)]})
return(mylabels)
}
label_panels <- ggplot2::as_labeller(make_labelstring)
library(ggplot2)
data("diamonds")
# create a faceted plot
ggplot(data = diamonds, aes(x = depth, y = price)) +
geom_point() +
facet_wrap(~cut, labeller = label_panels) +
theme(strip.text = element_text(hjust = -0),
strip.background = element_blank())
library(ggplot2)
# install.package("patchwork")
library(patchwork)
a <- 1:20
b <- sample(a, 20)
c <- sample(b, 20)
d <- sample(c, 20)
mydata <- data.frame(a, b, c, d)
myplot1 <- ggplot(mydata, aes(x=a, y=b)) + geom_point() + labs(tag = "A")
myplot2 <- ggplot(mydata, aes(x=b, y=c)) + geom_point() + labs(tag = "B")
myplot3 <- ggplot(mydata, aes(x=c, y=d)) + geom_point() + labs(tag = "C")
myplot4 <- ggplot(mydata, aes(x=d, y=a)) + geom_point() + labs(tag = "D")
myplot1 + myplot2 + myplot3 + myplot4
ggplot2::theme_update(plot.tag = element_text(face = "bold", colour = "blue"))