简体   繁体   中英

Drop unused level using facet_grid and coord_flip in ggplot2

I have a dataframe df

df<- structure(list(Categorie = structure(c(1L, 1L, 2L, 2L, 4L, 4L, 
3L, 1L, 1L, 2L, 2L, 4L, 4L, 3L, 1L, 1L, 2L, 2L, 4L, 4L, 3L, 1L, 
1L, 2L, 2L, 4L, 4L, 3L, 1L, 1L, 2L, 2L, 4L, 4L, 3L, 1L, 1L, 2L, 
2L, 4L, 4L, 3L, 1L, 1L, 2L, 2L, 4L, 4L, 3L, 1L, 1L, 2L, 2L, 4L, 
4L, 3L), .Label = c("Age classes", "Climate", "Nutrient availability", 
"PFT"), class = "factor"), Sub_categories = structure(c(7L, 4L, 
6L, 1L, 3L, 2L, 5L, 7L, 4L, 6L, 1L, 3L, 2L, 5L, 7L, 4L, 6L, 1L, 
3L, 2L, 5L, 7L, 4L, 6L, 1L, 3L, 2L, 5L, 7L, 4L, 6L, 1L, 3L, 2L, 
5L, 7L, 4L, 6L, 1L, 3L, 2L, 5L, 7L, 4L, 6L, 1L, 3L, 2L, 5L, 7L, 
4L, 6L, 1L, 3L, 2L, 5L), .Label = c("Continental", "DBF", "ENF", 
"Intermediate-Old", "Low-High", "Temperate", "Young"), class = "factor"), 
    Variable = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 3L, 3L, 
    3L, 3L, 3L, 3L, 3L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 2L, 2L, 2L, 
    2L, 2L, 2L, 2L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 4L, 4L, 4L, 4L, 
    4L, 4L, 4L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 6L, 
    6L, 6L), .Label = c("Age", "Clay content", "GPP", "GPP*Age", 
    "GPP*P", "GPP*P trend", "N availability", "SPI"), class = "factor"), 
    Importance = c(19.2, 23.7, 45.2, 45.7, 39, 66.8, 34.8, 10.9, 
    16.2, 9.2, 6.3, 15.7, 2.1, 10, 13.2, 7.1, 6.1, 3.8, 2.4, 
    7.3, 5.2, 6.4, 10, 6.6, 3.7, 2.9, 5.8, 8.4, 17.7, 0, 6.1, 
    5.2, 8.4, 2.8, 6.7, 11.8, 21.1, 9.8, 21.9, 20, 6.3, 13.5, 
    2.3, 7.6, 3.9, 1.3, 3.9, 0.4, 3.8, 10.9, 7.5, 4.5, 5.8, 0.3, 
    2.5, 9.4)), .Names = c("Categorie", "Sub_categories", "Variable", 
"Importance"), class = "data.frame", row.names = c(NA, -56L))

I want to plot my data by doing a facet_grid. with the Categorie and Sub_categories variables. I run the below command line:

library(ggplot2)

ggplot(data = var_Imp) + 
  geom_bar(mapping = aes(x = Variable, y = Importance, fill=Variable), width = 1, stat= "identity", position = "stack") + 
  coord_flip() +
  facet_grid(Categorie~Sub_categories,  scales="free", space="free", shrink=TRUE, drop=TRUE)+ 
  theme_bw(base_size = 14, base_family = "Helvetica")+
  theme(axis.ticks.length=unit(-0.25, "cm"), 
        legend.position="none", 
        legend.box="horizontal",
        legend.key = element_blank(),
        legend.text=element_text(size=14), 
        axis.text.x = element_text(margin=unit(c(0.5,0.5,0.5,0.5), "cm")), 
        axis.text.y = element_text(margin=unit(c(0.5,0.5,0.5,0.5), "cm")),
        axis.ticks.y=element_blank())+
  xlab("") +
  ylab("Relative contribution [%]")+ 
  scale_fill_brewer(type = "div")

However, the levels with no information in some of the facets are still plotted although they should not because there is no information in it. I thought the scales="free" and space="free" parameters will do the job but apparently not. Anyone knows how I can plot my data without the unused levels? Thanks

I don't know about a specific command in ggplot2. Two possible options:

1) Any of the options proposed in this post ggplot2: How to force the number of facets with too few plots?

2) Export the plot in .svg (or other vectorial format), open it with inkscape or any other program and delete the empty facets

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM