当主图使用对数刻度时,如何让ggplot2显示一个嵌入式图形?

4

我有一个x轴采用对数刻度的图形。尝试创建插图时无法正常工作,但如果将比例改为线性,则似乎没问题。是否有解决方法,还是这是ggplot的限制?

这个可以:

p = qplot(1:10, 1:10)
g = ggplotGrob(qplot(1, 1))
p + annotation_custom(grob = g, xmin = 3, xmax = 6, ymin = 6, ymax = 10)

这个不行:

p = qplot(1:10, 1:10, log='x')
g = ggplotGrob(qplot(1, 1))
p + annotation_custom(grob = g, xmin = 3, xmax = 6, ymin = 6, ymax = 10)
3个回答

7

使用对数刻度,x 被解释为从 0 到 1:

p = qplot(1:10, 1:10, log='x')
g = ggplotGrob(qplot(1, 1))
p + annotation_custom(grob = g, xmin = 0.3, xmax = 0.9, ymin = 6, ymax = 10)

所以只需按比例分配

enter image description here


6

使用对数刻度时,只需使用指数而不是绝对值来指定坐标。因此,在这个例子中,使用0 < x < 1,因为刻度从1e0到1e1:

p = qplot(1:10, 1:10, log='x')
g = ggplotGrob(qplot(1, 1))
p + annotation_custom(grob = g, xmin = 0.3, xmax = 0.9, ymin = 6, ymax = 10)

1
对于一个通用的解决方案,请参考:https://dev59.com/bm435IYBdhLWcg3wxDL_#37857548(但这个答案确实帮助我入门) - pallevillesen

3

首先,我也遇到了使用ggplot2绘制对数刻度嵌入式图的问题。

但是,我之前使用过grid包中的viewport

viewport的描述:

这些函数创建视口,它们描述了图形设备上的矩形区域,并在这些区域内定义了许多坐标系。

基本上,您可以将一个图形重叠在另一个图形上...

(1) 您可以取消注释命令,以便轻松输出为png或使用dev.copy2**等。

(2) x、y、width和height可以指定为unit对象,有关grid::unit的更多信息,请单击此处

require(grid)
require(ggplot2)
p = qplot(1:10, 1:10, log="x")
g = qplot(0.1 , 0.1)
vp1 <- viewport(width = 0.3, 
               height = 0.3, 
               x = 0.4, 
               y = 0.7)
vp2 <- viewport(width = 0.3, 
               height = 0.3, 
               x = 0.8, 
               y = 0.3)
#png("text.png")
print(p)
print(g, vp = vp1)
print(g, vp = vp2)
#dev.off()

viewport


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