在R中使用ggplot时,如何删除绘图区域周围的边距?

时间:2015-07-06 19:56:27

标签: r plot ggplot2

我试图生成一些分形,并在R中使用ggplot对边距有疑问。我使用以下代码生成分形。

library(ggplot2)
library(grid)

max_iter=25
cl=colours()
step=seq(-2,0.8,by=0.005)
points=array(0,dim=c(length(step)^2,3))
t=0

for(a in step) {
  for(b in step+0.6) {
    x=0;y=0;n=0;dist=0
    while(n<max_iter & dist<4)  {
      n=n+1
      newx=a+x^2-y^2
      newy=b+2*x*y
      dist=newx^2+newy^2
      x=newx;y=newy
    }

    if(dist<4)  { 
      color=24 # black
    } else {
      color=n*floor(length(cl)/max_iter)
    }
    t=t+1
    points[t,]=c(a,b,color)
  }
}

df=as.data.frame(points)    

ggplot(data=df, aes(V1, V2, color=cl[V3]))+ 
  geom_point() + 
  theme(panel.background=element_blank(), 
       panel.grid.major=element_blank(), 
       panel.grid.minor=element_blank(), 
       panel.margin = unit(c(0, 0, 0, 0), "cm"),       
       axis.ticks=element_blank(), 
       axis.text.x=element_blank(), 
       axis.text.y=element_blank(), 
       axis.title.x=element_blank(), 
       axis.title.y=element_blank(),
       plot.background = element_rect(fill = "transparent",colour = NA),
       plot.margin = unit(c(0, 0, 0, 0), "cm"),
       legend.position = 'none')

last_plot() + scale_colour_manual(values=sort(c("#00000000", rainbow(35)), decreasing=FALSE))

ggsave('mandelbrot.png');
print('Image Saved.')

我正在寻找消除情节区域边缘的想法。我尝试过一大堆技巧,比如在&par;&#39;,xaxes / yaxes,last_plot()+ labs(x = NULL,y = NULL)等设置参数,但是似乎没什么用。

有人有想法从剧情中删除这个难以处理的边际吗?我还考虑设置一个透明的背景,但我不得不削减边距 - 这是我想避免的一个步骤。

enter image description here

4 个答案:

答案 0 :(得分:11)

您还可以使用cowplot包中的theme_nothing()

require(cowplot)
qplot(1:10, (1:10)^2, geom='line') + theme_nothing() + 
  scale_x_continuous(expand=c(0,0)) +
  scale_y_continuous(expand=c(0,0)) +
  labs(x = NULL, y = NULL)

不幸的是,您仍然需要添加labs(x = NULL, y = NULL),因为ggplot2的主题机制无法完全删除轴。您需要在比例参数中设置expand=c(0,0),以确保比例不会超出您的数据范围。

结果:

enter image description here

答案 1 :(得分:8)

从ggplot布局中仅选择绘图面板的方法。它创建了ggplot,将绘图面板中的元素设置为element_blank,并且没有扩展x和y刻度。然后它创建ggplot grob,以便只能从布局中选择绘图面板。

次要编辑:更新到ggplot2 2.2.0

library(ggplot2)
library(grid)

max_iter=25
cl=colours()
step=seq(-2,0.8,by=0.005)
points=array(0,dim=c(length(step)^2,3))
t=0

for(a in step) {
  for(b in step+0.6) {
    x=0;y=0;n=0;dist=0
    while(n<max_iter & dist<4)  {
      n=n+1
      newx=a+x^2-y^2
      newy=b+2*x*y
      dist=newx^2+newy^2
      x=newx;y=newy
    }

    if(dist<4)  { 
      color=24 # black
    } else {
      color=n*floor(length(cl)/max_iter)
    }
    t=t+1
    points[t,]=c(a,b,color)
  }
}

df=as.data.frame(points)    

# ggplot with elements in the plot panel set to element_blank()
# and no expansion on the scales
p = ggplot(data=df, aes(V1, V2, color=cl[V3]))+ 
  geom_point() + 
  scale_x_continuous(expand = c(0,0), limits=range(df$V1)) +
  scale_y_continuous(expand = c(0,0), limits=range(df$V2))+
  theme(panel.grid=element_blank(), 
       panel.background=element_rect(fill = "transparent",colour = NA),
       panel.border=element_blank()) +
  scale_colour_manual(values=sort(c("#00000000", rainbow(35)), decreasing=FALSE))

# Get the ggplot grob
gt = ggplotGrob(p)

# Select plot panel only
#   gt = gt[6,4]    # Using index notation; OR
gt = gtable::gtable_filter(gt, "panel")  

# Draw it
grid.newpage()
grid.draw(gt)


# Set up a print method 
class(gt) = c("Panel", class(gt))
print.Panel <- function(x) {
   grid.newpage()   
   grid.draw(x)
}

gt
ggsave('mandelbrot.png', gt)

答案 2 :(得分:7)

使用您的代码后,我会更清楚地看到您正在寻找的内容。这样:

gg <- ggplot(data=df, aes(V1, V2, color=cl[V3]))
gg <- gg + geom_point()
gg <- gg + labs(x=NULL, y=NULL, title=NULL)
gg <- gg + scale_x_continuous(expand=c(0,0), limits=range(df$V1))
gg <- gg + scale_y_continuous(expand=c(0,0), limits=range(df$V2))
gg <- gg + scale_colour_manual(values=sort(c("#00000000", rainbow(35)), decreasing=FALSE))
gg <- gg + theme(panel.background=element_rect(fill = "transparent",colour = NA))
gg <- gg + theme(plot.background=element_rect(fill = "transparent",colour = NA))
gg <- gg + theme(panel.grid=element_blank())
gg <- gg + theme(panel.border=element_blank())
gg <- gg + theme(plot.margin=unit(c(0,0,0,0), "null"))
gg <- gg + theme(panel.margin=unit(c(0,0,0,0), "null"))
gg <- gg + theme(axis.ticks=element_blank())
gg <- gg + theme(axis.text=element_blank())
gg <- gg + theme(axis.title=element_blank())
gg <- gg + theme(axis.line=element_blank())
gg <- gg + theme(legend.position="none")
gg <- gg + theme(axis.ticks.length=unit(0, "null"))
gg <- gg + theme(axis.ticks.margin=unit(0, "null"))
gg <- gg + theme(legend.margin=unit(0, "null"))
gg

你必须删除标签,而不是扩展x&amp; y轴并设置硬限制。 null也很重要。'

这也可以通过执行gb <- ggplotGrob(gg)并手动编辑grobs&amp;参数,但我认为这可能会得到你所需要的。

答案 3 :(得分:3)

我可以通过设置负曲线边距并将轴标题设置为NULL来摆脱白色边框。我在下面的代码中标记了编辑内容。

p = ggplot(data=df, aes(V1, V2, color=cl[V3]))+ 
  geom_point() + 
  theme(panel.background=element_blank(), 
        panel.grid.major=element_blank(), 
        panel.grid.minor=element_blank(), 
        panel.margin = unit(c(0, 0, 0, 0), "cm"),       
        axis.ticks=element_blank(), 
        axis.text.x=element_blank(), 
        axis.text.y=element_blank(), 
        axis.title.x=element_blank(), 
        axis.title.y=element_blank(),
        plot.background = element_rect(fill = "transparent",colour = NA),
        plot.margin = unit(c(-1, -1.2, -1.2, -1.5), "cm"),  # Edited code
        legend.position = 'none') +
  labs(x=NULL, y=NULL) # New code