2016-01-21 3 views
1

считают этот кадр данных:Исключите неиспользуемые уровни фактора в каждой грани в ggplot

df <- data.frame(vars=c(rnorm(3),rnorm(3,2,1), rnorm(3,1,1)), 
      names=c("a","b","c","a","d","b","c","a","f"), 
      groups=c(rep("x",3),rep("y",3),rep("z",3))) 

Я черчения это с ggplot:

ggplot(df, aes(reorder(names, vars), names)) + geom_bar(stat="identity") + 
theme_bw() + facet_grid(groups~., scales="free_x") + coord_flip() +  ylab(NULL) + xlab(NULL) 

это выглядит как этот

enter image description here

Я сейчас хочу:

  • Каждый элемент сетки должен опускать неиспользуемые предметы, например. в сетке «x» не должно быть «d» и «f»
  • ось x должна быть значением столбца «vars». Пропорции в каждой сетке должны быть одинаковыми, общая шкала х должна быть отброшена. Я просто хочу, пропорции баров в каждой сетке интактных
  • стержни должны быть в порядке убывания в каждой сетке (длинные полосы на вершине)

обновления:

Редактировать с помощью советов от here я получаю эту ошибку:

ggplot(df, aes(names,vars)) + geom_bar(stat="identity") + coord_flip() + 
    theme_bw() + facet_wrap(~groups,nrow = 3,scales = "free_x") 

Error in facet_render.wrap(plot$facet, panel, plot$coordinates, theme, : 
    ggplot2 does not currently support free scales with a non-cartesian coord or coord_flip. 
In addition: Warning message: 
Stacking not well defined when ymin != 0 

, когда я удаляю coord_flip() он работает, но я все еще получаю предупреждение и результат не то, что я хочу.

+1

Вы можете проверить [здесь] (http://stats.stackexchange.com/questions/24806/dropping-unused-levels-in-facets-with -ggplot2) – akrun

+0

@akrun Я добавил дополнительную информацию – spore234

ответ

1

Это немного обходное решение, но оно дает сюжет сюжет, который, кажется, отвечает вашим основным целям. geom_bar заменяется на geom_seqment, потому что это похоже на то, что вы рисуете, и избегает осложнений coord_flip. Порядок баров определяется рангами vars в каждом group. Ярлы оси y не могут быть указаны напрямую, но вы можете использовать geom_text, чтобы поместить соответствующие значения names рядом с осью y, чтобы они выступали в качестве меток. Кроме того, я переключил метку фасета на левую сторону, что, казалось, улучшило общий внешний вид меток граней и оси y.

set.seed(177) 
df <- data.frame(vars=c(rnorm(3),rnorm(3,2,1), rnorm(3,1,1)), 
       names=c("a","b","c","a","d","b","c","a","f"), 
       groups=c(rep("x",3),rep("y",3),rep("z",3))) 

library(ggplot2) 
sp1 <- ggplot(data=transform(df, ranked=ave(vars, groups, FUN=rank)), 
        aes(x=vars, y=ranked)) 
sp1 <- sp1 + geom_segment(aes(xend = 0, yend = ranked), size=10) 
sp1 <- sp1 + geom_text(aes(x = min(vars), y= ranked, label = names), hjust= 4) 
sp1 <- sp1 + scale_y_discrete(label=NULL) 
sp1 <- sp1 + theme_bw() 
sp1 <- sp1 + facet_grid(groups ~ ., scales="free", switch="y") 
plot(sp1) 

земля выглядит

enter image description here

+0

отлично, спасибо – spore234

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

  • Нет связанных вопросов^_^