如何在ggplot2中将图例标签放置在图内

3

背景:R/ggplot2。

是否有一种自动化的方式(甚至是手动的方式)将图例因子放在绘图内部,就像这里的能量一样(Co、4、6、10……),而不是将它们放在绘图旁边的普通图例框中?

来源:《放射肿瘤物理学:教师和学生手册》,EB. Podgorsak

来源:《放射肿瘤物理学:教师和学生手册》,EB. Podgorsak


曾经有一个类似的问题:这里 - tonytonov
directlabels包可能会有所帮助。 - baptiste
1个回答

6
这似乎已经很接近了。我认为这可以被描述为“半自动”:肯定需要一些调整,但是大部分工作都已经完成了...
棘手的部分不在于放置文本标签(geom_text(...)),而在于创建绘制曲线中的断点。这可以通过使用 geom_rect(...) 完成,其中矩形的宽度设置为最大标签宽度,由 strwidth(...) 确定。
# create sample data
df <- data.frame(x=rep(seq(0,20,.01),5),k=rep(1:5,each=2001))
df$y <- with(df,x*exp(-x/k))

library(ggplot2)
eps.x <- max(strwidth(df$k))  # maximum width of legend label
eps.y <- eps.x*diff(range(df$y))/diff(range(df$x))
ggplot(df,aes(x,y))+
  geom_line(aes(group=factor(k)))+
  geom_rect(data=df[df$x==5,],
            aes(xmax=x+eps.x, xmin=x-eps.x, ymax=y+eps.y, ymin=y-eps.y),
            fill="white", colour=NA)+
  geom_text(data=df[df$x==5,],aes(x,y,label=k))+
  theme_bw()

如果您也想给线条着色:
ggplot(df,aes(x,y))+
  geom_line(aes(color=factor(k)))+
  geom_rect(data=df[df$x==5,],
            aes(xmax=x+eps.x, xmin=x-eps.x, ymax=y+eps.y, ymin=y-eps.y),
            fill="white", colour=NA)+
  geom_text(data=df[df$x==5,],aes(x,y,label=k), colour="black")+
  scale_color_discrete(guide="none")+
  theme_bw()

我不理解这行代码 eps.y <- eps.x*diff(range(df$y))/diff(range(df$x)) 的作用是什么。它是如何工作的?为什么你不直接调用 strheight() 函数呢? - Urban Vagabond

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接