2016-12-17 2 views
1

Я работаю в обновленном ggplot2 (2.2.0). Большой новой особенностью является возможность построения вдоль каждой оси х для нечетного числа графиков, согласно странице this.Как получить все метки оси x, включая отсутствующие данные, в ggplot2 с facet_wrap?

Я хочу построить одну и ту же ось х в каждой грани. Однако это не работает при вводе отсутствующих данных. В качестве примера я опишу примерные данные в вопросе this. не

# Example dataset 
dataf <- data.frame(x=c(1:30), A=rnorm(30,20,5), B=rnorm(30,15,0.5)) 
datam <- melt(dataf, id="x") 
# Plot in ggplot2 
ggplot(datam, aes(factor(x), value)) + 
    geom_bar(stat="identity") + 
    facet_wrap(~variable,nrow = 2,scales = "free") 

Когда я удалить отдельные строки и ввести недостающие данные (в соответствии с моим кодом ниже), я больше не иметь те же х-метки осей как для «A» и «B».

# Remove certain rows to introduce missing data 
datam <- datam[-c(2, 4, 58), ] 

Я могу построить недостающие значения и выровнять по нижней оси х с использованием scales = fixed хотя я больше не имею осей х галочка метки для группы «А» в фаске.

ggplot(datam, aes(factor(x), value)) + 
    geom_bar(stat="identity") + 
    facet_wrap(~variable,nrow = 2,scales = "fixed") 

Каким образом отображаются одинаковые ярлыки оси X для каждой грани, даже если отсутствуют данные?

спасибо.

+0

@hadley - есть ли функциональность внутри ggplot2, пожалуйста, сделайте это без использования обходного пути в ответе ниже? – user2716568

ответ

1

Вы могли бы сделать что-то вроде:

library(reshape2) 
library(ggplot2) 
dataf <- data.frame(x=c(1:30), A=rnorm(30,20,5), B=rnorm(30,15,0.5)) 
datam <- melt(dataf, id="x") 
datam2 <- datam[-c(2, 4, 58), ] #mising rows 
graph<-ggplot(datam2, aes(factor(x), value)) + 
    geom_bar(stat="identity") + 
    facet_wrap(~variable,nrow = 2,scales = "fixed") 
library(gtable) 
library(grid) 
g <- ggplotGrob(graph) #retrieve grob from graph 
panels <- grep("panel", g$layout$name) 
top <- unique(g$layout$t[panels]) 
all <- gtable:::rbind_gtable(gtable:::rbind_gtable(g[seq.int(min(top)), ], 
                g[max(top)+1,], "first"), 
          g[seq(min(top)+1, nrow(g)),], "first") 
grid.newpage() 
grid.draw(all) 

enter image description here
Довольно уверен, что решение, которое я нашел на SO в какой-то момент. Но не помню оригинальный пост.

+1

Отлично, спасибо за обходной путь! Это позор, который нельзя было решить с помощью опции весов. Как бы добавить ярлык оси y (а не в исходное сообщение)? – user2716568

Смежные вопросы