首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在R?中使用ggplot2导出带有边框的pdf图像?

在R?中使用ggplot2导出带有边框的pdf图像?
EN

Stack Overflow用户
提问于 2021-10-01 13:48:52
回答 2查看 97关注 0票数 0

所以我有这个问题,当我导出某种类型的绘图的pdf时,绘图是用边界绘制的。例如,如果我像这样创建一个图:

代码语言:javascript
复制
library(reshape)
library(ggplot2)
library(ggnewscale)

# Create matrix
set.seed(1701)
a <- sample(1:10,100, replace=TRUE)
s <- matrix(a, nrow = 5, ncol=5)
s[upper.tri(s)] = t(s)[upper.tri(s)]
rownames(s) <- colnames(s) <- paste0("x", 1:5)
diag(s) <- 0
sDf <- melt(s)

# create diagonal values
diagDf <- data.frame(
  var1 = c(paste0("x", 1:5)),
  var2 = c(paste0("x", 1:5)),
  val = c(2,5,3,1,5)
)
colPal <- rev(colorspace::sequential_hcl(palette = "Blues 3", n = 100))
colPal2 <- rev(colorspace::sequential_hcl(palette = "Reds 3", n = 100)) 

# make plot
ggplot(sDf, aes(X1,X2)) + 
  geom_tile(aes(fill = value)) +
  scale_fill_gradientn(colors = colPal) +
  new_scale_fill() +
  geom_tile(data = diagDf, aes(var1, var2, fill = val),  color = "black",
            size = 0) +
  scale_fill_gradientn(colors = colPal2) +
  theme(aspect.ratio = 1) 

这将在我的绘图窗口中生成如下所示的绘图:

但是,如果我导出图像的pdf,它会在对角线周围绘制一个黑色边框,如下所示:

现在,我意识到这一定与台词有关:

代码语言:javascript
复制
 geom_tile(data = diagDf, aes(var1, var2, fill = val),  color = "black",
            size = 0)

具体地说,color = "black", size = 0。我希望在代码中保留这一行,以允许用户通过控制边界的size的函数参数来打开和关闭边界。因此,例如,在一个更大的函数中,我会有如下内容

代码语言:javascript
复制
if(border){
    lineSize <- 0.2
  }else{
    lineSize <- 0
  }

并设置size = lineSize。这个想法是,当lineSize = 0然后size将等于零,然后将以零大小绘制线条(这实际上应该与根本不绘制线条相同)。

这在RStudio的绘图窗口中有效...但是当我用size = 0导出pdf时,黑色边框被绘制在pdf上。如果我导出PNG,就不会发生这种情况。

你知道这是怎么回事吗?我正在使用MacBook专业版(如果这很重要?!)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-10-01 14:25:35

首先创建不带边框的绘图:

代码语言:javascript
复制
p <- ggplot(sDf, aes(Var1,Var2)) + 
  geom_tile(aes(fill = value)) +
  scale_fill_gradientn(colors = colPal) +
  new_scale_fill() +
  geom_tile(data = diagDf, aes(var1, var2, fill = val)) +
  scale_fill_gradientn(colors = colPal2) +
  theme(aspect.ratio = 1) 

然后,如果用户要求,您可以修改边框颜色/大小:

代码语言:javascript
复制
if (border) {
  p$layers[[2]]$aes_params$colour = 'black'
  p$layers[[2]]$aes_params$size = 0.2
}

票数 2
EN

Stack Overflow用户

发布于 2021-10-01 14:26:31

你有没有试过玩你的ggplot末尾的页边距?

代码语言:javascript
复制
theme(plot.margin = unit(c(2,2,2,2), "cm"))

每个页边距的规则如下:单位(上、右、下、左)

示例:

代码语言:javascript
复制
pdf(file = "example2.pdf")

ggplot(mpg, aes(displ, hwy, colour = class)) + 
geom_point() +
theme(plot.margin = unit(c(2,2,2,2), "cm"))

dev.off()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69406994

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档