将花括号添加到 ggplot2,然后使用 ggsave

Add curly braces to ggplot2 and then use ggsave

所以这与此非常相关question and this answer是一个很好的解决方案。

问题是当我尝试使用 ggsave 导出图时,大括号不存在。

示例:

library(ggplot2)
library(grid)
library(pBrackets) 

x <- c(runif(10),runif(10)+2)
y <- c(runif(10),runif(10)+2)

the_plot <- qplot(x=x,y=y) +
  scale_x_continuous("",breaks=c(.5,2.5),labels=c("Low types","High types") ) +
  theme(axis.ticks = element_blank(),
        axis.ticks.length = unit(.85, "cm"))
the_plot

grid.locator(unit="native") 
bottom_y <- 284 

grid.brackets(220, bottom_y,   80, bottom_y, lwd=2, col="red")
grid.brackets(600, bottom_y,  440, bottom_y, lwd=2, col="red")

ggsave("test.png",width = 4, height = 2.5)

我不愿意使用 RStudio 导出按钮,因为它无法正确导出我的主题字体大小等。我还需要高于 76 dpi 的分辨率。我需要一个解决方案来将花括号添加到 ggplot2 图形并能够使用 ggsave 保存它。

好吧,我想你可以用设备做一些事情,作为 ggsave 的替代方法,我终于让它工作了。这比原本应该付出的努力更多,因为 R-Studio 不知何故对哪些设备实际打开或关闭(关闭)感到困惑。所以有时你必须重置你的 R 会话。经常检查 dev.list() 很有帮助。有点...

但经过一些测试后,这个序列工作得相当可靠。

我也用 jpeg 测试过,因为我可以在 windows 中使用文件 属性 命令查看分辨率,以查看我指定的分辨率 (200 ppi) 是否通过:

library(ggplot2)
library(grid)
library(pBrackets) 


x <- c(runif(10),runif(10)+2)
y <- c(runif(10),runif(10)+2)
the_plot <- qplot(x=x,y=y) +
  scale_x_continuous("",breaks=c(.5,2.5),labels=c("Low types","High types") ) +
  theme(axis.ticks = element_blank(),
        axis.ticks.length = unit(.85, "cm"))

the_plot

# User has to click here to specify where the brackets go
grid.locator(unit="native") 
bottom_y <- 284 
grid.brackets(220, bottom_y,   80, bottom_y, lwd=2, col="red")
grid.brackets(600, bottom_y,  440, bottom_y, lwd=2, col="red")

#dev.copy(png,"mypng.png",height=1000,width=1000,res=200)
dev.copy(jpeg,"myjpg.jpg",height=1000,width=1000,res=200) 
dev.off()

图片:

属性:

我不明白 grid.brackets 中使用的逻辑,但是如果有一个 bracketsGrob 函数可以简单地 return 一个 grob 而不绘制它会有所帮助。也许联系维护者提出功能请求?

无论如何,假设有这样的功能,它可以被提供给 annotation_custom 使其与 ggsave 兼容。

bracketsGrob <- function(...){
l <- list(...)
e <- new.env()
e$l <- l
  grid:::recordGrob(  {
    do.call(grid.brackets, l)
  }, e)
}

# note that units here are "npc", the only unit (besides physical units) that makes sense
# when annotating the plot panel in ggplot2 (since we have no access to 
# native units)

b1 <- bracketsGrob(0.33, 0.05, 0, 0.05, h=0.05, lwd=2, col="red")
b2 <- bracketsGrob(1, 0.05, 0.66, 0.05, h=0.05,  lwd=2, col="red")

p <- the_plot + 
  annotation_custom(b1)+ 
  annotation_custom(b2) +
  scale_y_continuous(expand=c(0.11,0))
p

ggsave("test.png", p, width = 4, height = 2.5)

一个非常非常晚的回答,我的包 lemon 就是这样做的,尽管不是花括号,而是方括号。

这是来自 vignette - they can be directed both outwards and inwards, see more at https://cran.r-project.org/package=lemon 的示例。

您可以查看此 this 对同一问题的回答。这些大括号没有导出问题,因为它们基于正常 geom_path.