193

I want to use bioconductor's hexbin (which I can do) to generate a plot that fills the entire (png) display region - no axes, no labels, no background, no nuthin'.

2
  • 1
    Wouldn't it be easier to create a hexbin plot and the crop it in an image editor? Commented Jun 29, 2011 at 23:36
  • 12
    try theme_void() Commented Apr 12, 2020 at 19:47

9 Answers 9

234

As per my comment in Chase's answer, you can remove a lot of this stuff using element_blank:

dat <- data.frame(x=runif(10),y=runif(10))

p <- ggplot(dat, aes(x=x, y=y)) + 
        geom_point() +
        scale_x_continuous(expand=c(0,0)) + 
        scale_y_continuous(expand=c(0,0))   

p + theme(axis.line=element_blank(),axis.text.x=element_blank(),
          axis.text.y=element_blank(),axis.ticks=element_blank(),
          axis.title.x=element_blank(),
          axis.title.y=element_blank(),legend.position="none",
          panel.background=element_blank(),panel.border=element_blank(),panel.grid.major=element_blank(),
          panel.grid.minor=element_blank(),plot.background=element_blank())

It looks like there's still a small margin around the edge of the resulting .png when I save this. Perhaps someone else knows how to remove even that component.

(Historical note: Since ggplot2 version 0.9.2, opts has been deprecated. Instead use theme() and replace theme_blank() with element_blank().)

Sign up to request clarification or add additional context in comments.

3 Comments

Many thanks! I also found a similar solution at groups.google.com/group/ggplot2/browse_thread/thread/…
Comment in passing: In some cases, theme(axis.ticks=element_blank()) does not work as well as theme(axis.ticks.x=element_blank()), probably a temporary bug somewhere (I have my own theme set, then I attempt to override: only axis.ticks.x and axis.ticks.y do the job.)
I was able to get rid of the extra margin with: theme(plot.margin=grid::unit(c(0,0,0,0), "mm"))
125

Re: changing opts to theme etc (for lazy folks):

theme(axis.line=element_blank(),
      axis.text.x=element_blank(),
      axis.text.y=element_blank(),
      axis.ticks=element_blank(),
      axis.title.x=element_blank(),
      axis.title.y=element_blank(),
      legend.position="none",
      panel.background=element_blank(),
      panel.border=element_blank(),
      panel.grid.major=element_blank(),
      panel.grid.minor=element_blank(),
      plot.background=element_blank())

1 Comment

Although theme_void offered in another answer is the easiest way to achieve the OP's aims, if combining with facet_grid or facet_wrap you will also lose the boxes around the facet labels. If you don't want this to happen, this answer is the one to use.
91

Current answers are either incomplete or inefficient. Here is (perhaps) the shortest way to achieve the outcome (using theme_void()):

data(diamonds) # Data example

ggplot(data = diamonds, mapping = aes(x = clarity)) +
  geom_bar(aes(fill = cut)) +
  theme_void() +
  theme(legend.position = "none")

The outcome is:

enter image description here


If you are interested in just eliminating the labels, labs(x="", y="") does the trick:

ggplot(data = diamonds, mapping = aes(x = clarity)) +
  geom_bar(aes(fill = cut)) + 
  labs(x = "", y = "")

5 Comments

ggplot(data = diamonds, mapping = aes(x = clarity)) + geom_bar(aes(fill = cut)) + theme_void() + theme(legend.position="none", panel.background = element_rect(fill="grey80"), plot.background = element_rect(fill="red")) suggests it's not 100% void
The labs( x="", y="" ) does not appear to remove the axes, just the labels.
@miratrix sorry, my mistake. Updated.
@luchonacho Using labs(x="",y="") leaves space of axis titles because actually there are titles, they are just without signs. To remove axis titles and space for them it is better to use + theme(axis.title = element_blank())
labs(x = NULL) or xlab(NULL) are other ways.
43
'opts' is deprecated.

in ggplot2 >= 0.9.2 use

p + theme(legend.position = "none") 

1 Comment

I realize you don't have edit privileges yet, but if you spot other ggplot2 answers of mine that need to be updated re:opts() feel free to suggest an edit. I'll get a notification and can incorporate it myself.
14

Late to the party, but might be of interest...

I find a combination of labs and guides specification useful in many cases:

You want nothing but a grid and a background:

ggplot(diamonds, mapping = aes(x = clarity)) + 
  geom_bar(aes(fill = cut)) + 
  labs(x = NULL, y = NULL) + 
  guides(x = "none", y = "none")

enter image description here

You want to only suppress the tick-mark label of one or both axes:

ggplot(diamonds, mapping = aes(x = clarity)) + 
  geom_bar(aes(fill = cut)) + 
  guides(x = "none", y = "none")

enter image description here

Comments

3
xy <- data.frame(x=1:10, y=10:1)
plot <- ggplot(data = xy)+geom_point(aes(x = x, y = y))
plot
panel = grid.get("panel-3-3")

grid.newpage()
pushViewport(viewport(w=1, h=1, name="layout"))
pushViewport(viewport(w=1, h=1, name="panel-3-3"))
upViewport(1)
upViewport(1)
grid.draw(panel)

4 Comments

Error in UseMethod("grid.draw") : no applicable method for 'grid.draw' applied to an object of class "NULL"
grid.ls() display the list of viewport and grob objects
it appears that in other version of ggplot that i am using the panel name is different
xy <- data.frame(x=1:10, y=10:1) plot <- ggplot(data = xy)+geom_point(aes(x = x, y = y)) plot panel = grid.get("panel-3-4") grid.newpage() pushViewport(viewport(w=1, h=1, name="layout")) pushViewport(viewport(w=1, h=1, name="panel-3-4")) upViewport(1) upViewport(1) grid.draw(panel)
3

use ggeasy, it is more simple.

library(ggeasy)
p + theme_classic()+easy_remove_axes() + easy_remove_legend()

Comments

1

I didn't find this solution here. It removes all of it using the cowplot package:

library(cowplot)

p + theme_nothing() +
theme(legend.position="none") +
scale_x_continuous(expand=c(0,0)) +
scale_y_continuous(expand=c(0,0)) +
labs(x = NULL, y = NULL)

Just noticed that the same thing can be accomplished using theme.void() like this:

p + theme_void() +
theme(legend.position="none") +
scale_x_continuous(expand=c(0,0)) +
scale_y_continuous(expand=c(0,0)) +
labs(x = NULL, y = NULL)

Comments

0

Does this do what you want?

 p <- ggplot(myData, aes(foo, bar)) + geom_whateverGeomYouWant(more = options) +
 p + scale_x_continuous(expand=c(0,0)) + 
 scale_y_continuous(expand=c(0,0)) +
 opts(legend.position = "none")

1 Comment

gets rid of legend but x and y axes, and the background grid, are still there.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.