2016-01-29 1 views
0

Длина оси x важна для моего участка, потому что она позволяет сравнивать между фасетами, поэтому я хочу, чтобы грани имели разные размеры по оси x. Вот мой пример данных:Границы разных размеров по оси x

group1 <- seq(1, 10, 2) 
group2 <- seq(1, 20, 3) 
x = c(group1, group2) 
mydf <- data.frame (X =x , Y = rnorm (length (x),5,1), 
        groups = c(rep(1, length (group1)), rep(2, length(group2)))) 

И мой код:

p1 = ggplot(data=mydf,aes(x=X,y=Y,color=factor(groups)))+ 
    geom_point(size=2)+ 
    scale_x_continuous(labels=comma)+ 
    theme_bw() 
p1+facet_grid(groups ~ .,scales = "fixed",space="free_x") 

И полученный показатель:

enter image description here

Панель-1 имеет значения х по оси меньше, чем 10, тогда как панель-2 имеет значение оси x, равное 20. Все обе панели имеют одинаковый размер по оси X. Есть ли способ сделать размер панели x-axis различным для разных панелей, чтобы они соответствовали их (по оси x) значениям?

Я нашел пример из какого-то другого пакета, который показывает, что я пытаюсь сделать, вот фигура: enter image description here

+1

Я думаю, что это: http://stackoverflow.com/questions/10454805/different-size-facets-proportional-of-x-axis-on-ggplot-2-r?rq = 1 может ответить на ваш вопрос. – mshum

+0

Если вы хотите сравнить между фасетами, лучше не иметь одинаковую ось? На примере графика, похоже, все грани имеют одинаковую шкалу по оси x. Если вы нарисовали ящики вокруг ваших данных, это будет выглядеть как пример. – oshun

+0

Почему бы не использовать упомянутый пакет (ggbio)? – zx8754

ответ

3

Может быть что-то вроде этого вы могут получить работу. Тем не менее, есть еще какое-то форматирование.

library(grid) 
library(gridExtra) 
library(dplyr) 
library(ggplot2) 

p1 <- ggplot(data=mydf[mydf$groups==1,],aes(x=X,y=Y))+ 
    geom_point(size=2)+ 
    theme_bw() 
p2 <- ggplot(data=mydf[mydf$groups==2,],aes(x=X,y=Y))+ 
    geom_point(size=2)+ 
    theme_bw() 

summ <- mydf %>% group_by(groups) %>% summarize(len=diff(range(X))) 
summ$p <- summ$len/max(summ$len) 
summ$q <- 1-summ$p 

ng <- nullGrob() 
grid.arrange(arrangeGrob(p1,ng,widths=summ[1,3:4]), 
      arrangeGrob(p2,ng,widths=summ[2,3:4])) 

enter image description here

Я уверен, что есть способ сделать это более общий характер, а оси не выстраиваются в линию отлично еще, но это начало.

4

Это решение после поясняющего комментария OP («Я думаю, ось будет такой же, но ящики будут иметь переменный размер. Возможно ли это, построив их отдельно и выравнивая по сетке?»).

library(plyr); library(ggplot2) 

buffer <- 0.5 # Extra space around the box 

#Calculate box parameters 
mydf.box <- ddply(mydf, .(groups), summarise, 
     max.X = max(X) + buffer, 
     min.X = 0, 
     max.Y = max(Y) + buffer, 
     min.Y = 0, 
     X = mean(X), Y = mean(Y)) #Dummy values for X and Y needed for geom_rect 


p2 <- ggplot(data=mydf,aes(x=X, y=Y))+ 
    geom_rect(data = mydf.box, aes(xmax = max.X, xmin = min.X, 
            ymax = max.Y, ymin = min.Y), 
      fill = "white", colour = "black", fill = NA) + 
    geom_point(size=2) + facet_grid(groups ~ .,scales = "free_y") + 
    theme_classic() + 
    #Extra formatting to make your plot like the example 
    theme(panel.background = element_rect(fill = "grey85"), 
     strip.text.y = element_text(angle = 0), 
     strip.background = element_rect(colour = NA, fill = "grey65")) 

p2

+0

Спасибо за чистое решение. Я обнаружил, что решение Сэма ниже дает мне больше контроля, хотя оно отличается от того, что я спросил. – Bade

+0

Для вашего вопроса ответ, который я дал, должен быть достаточным для моделирования графа примера. Но да, грифы лучше всего подходят для тонкой настройки, а ответ @ Сэма - хороший! – oshun

+0

Можете ли вы помочь мне с соответствующим вопросом здесь: http: //stackoverflow.com/questions/35111220/add-geom-segment-to-geom-point-plot-in-ggplot – Bade

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