2015-05-24 9 views
4

Есть ли способ выстроить точки линии с полосками гистограммы, используя ggplot, когда они имеют одинаковую ось x? Вот пример данных, с которыми я пытаюсь это сделать.Выровнять столбцы столбчатой ​​диаграммы с точками графика линии с ggplot

library(ggplot2) 
library(gridExtra) 

data=data.frame(x=rep(1:27, each=5), y = rep(1:5, times = 27)) 
yes <- ggplot(data, aes(x = x, y = y)) 
yes <- yes + geom_point() + geom_line() 

other_data = data.frame(x = 1:27, y = 50:76 ) 

no <- ggplot(other_data, aes(x=x, y=y)) 
no <- no + geom_bar(stat = "identity") 

grid.arrange(no, yes) 

Вот результат:

enter image description here

Первая точка линии сюжета находится слева от первого бара, и последняя точка линии сюжета справа последний бар.

Спасибо за ваше время.

+0

Я не уверен, что понимаю, что вы хотите сделать. Проблема в том, что полосы имеют ширину, а точки - нет. Таким образом, левый край первого бара находится в точке (около) x = 0,5, а правый край последнего стержня при x = 27,5. Первая и последняя точки находятся в точке x = 1 и x = 27. Таким образом, выравнивание точек и краев баров кажется совершенно неестественным, потому что это означает, что две оси масштабируются по-разному. Разве не имело бы смысла иметь центры стержней, выровненные с точками? – Stibu

+0

Как бы выровнять центры стержней с точками? –

+0

См. Пакет треков, [здесь приведен пример] (http://stackoverflow.com/a/25451066/680068) – zx8754

ответ

1

Расширение @ немного пост Stibu в: Для выравнивания участков, используйте gtable (Или увидеть ответы на your earlier question)

library(ggplot2) 
library(gtable) 

data=data.frame(x=rep(1:27, each=5), y = rep(1:5, times = 27)) 
yes <- ggplot(data, aes(x = x, y = y)) 
yes <- yes + geom_point() + geom_line() + 
    scale_x_continuous(limits = c(0,28), expand = c(0,0)) 

other_data = data.frame(x = 1:27, y = 50:76 ) 

no <- ggplot(other_data, aes(x=x, y=y)) 
no <- no + geom_bar(stat = "identity") + 
    scale_x_continuous(limits = c(0,28), expand = c(0,0)) 

gYes = ggplotGrob(yes) # get the ggplot grobs 
gNo = ggplotGrob(no) 

plot(rbind(gNo, gYes, size = "first")) # Arrange and plot the grobs 

enter image description here

Редактировать Для изменения высоты участков:

g = rbind(gNo, gYes, size = "first") # Combine the plots 
panels <- g$layout$t[grepl("panel", g$layout$name)] # Get the positions for plot panels 
g$heights[panels] <- unit(c(0.7, 0.3), "null") # Replace heights with your relative heights 
plot(g) 
+0

Есть ли способ изменить высоту графиков так, чтобы высота второго графика была меньше, чем высота первого участка? Подобно тому, как высота height = c (0.7.0.3) может использоваться в grid.arrange() –

+0

См. [Этот ответ] (http://stackoverflow.com/questions/28093412/labels-on-top-with-facet- grid-or-space-option-with-facet-wrap/28099801 # 28099801) или [этот ответ] (http://stackoverflow.com/questions/20638294/geom-tile-and-facet-grid-facet-wrap- для-же высоты-из-плитки/20639481 # 20639481). Кроме того, я добавил редактирование. –

1

я могу думать (по крайней мере) два способов, чтобы выровнять й-ось в двух участках:

  1. Две осей не совпадают, потому что в баре сюжете, геометрия покрытие x- оси от 0,5 до 27,5, в то время как на другом участке данные варьируются от 1 до 27. Причина в том, что полосы имеют ширину, а точки - нет. Вы можете заставить axex выровнять, явно указав диапазон по оси x. Используя определения из вашего участка, это может быть достигнуто за счет

    yes <- yes + scale_x_continuous(limits=c(0,28)) 
    no <- no + scale_x_continuous(limits=c(0,28)) 
    grid.arrange(no, yes) 
    

    limits устанавливает диапазон оси х. Заметьте, однако, что альгинация все еще не совсем идеальна. Ярлыки оси y занимают немного больше места на верхнем участке, потому что цифры имеют две цифры. Сюжет выглядит следующим образом: enter image description here

  2. Другим решением является немного более сложным, но имеет то преимущество, что ось х рисуется только один раз, и что ggplot гарантирует, что выравнивание является совершенным. Он использует огранку и трюк, описанный в this answer. Во-первых, данные должны быть объединены в один кадр данных по

    all <- rbind(data.frame(other_data,type="other"),data.frame(data,type="data")) 
    

    , а затем участок может быть создан следующим образом:

    ggplot(all,aes(x=x,y=y)) + facet_grid(type~.,scales = "free_y") + 
        geom_bar(data=subset(all,type=="other"),stat="identity") + 
        geom_point(data=subset(all,type=="data")) + 
        geom_line(data=subset(all,type=="data")) 
    

    Хитрость заключается в том, чтобы фасеты быть построена по переменной type который ранее использовался для обозначения двух наборов данных. Но тогда каждый geom получает только подмножество данных, которое должно быть нарисовано с помощью этого geom. В facet_grid я также использовал scales = "free_y", потому что две оси y должны быть независимыми. Этот сюжет выглядит следующим образом:

enter image description here

Вы можете изменить метки граней, давая другие имена при определении кадра all данных.Если вы хотите, чтобы удалить их ALLtogether, затем добавьте следующую строку в ваш сюжет:

+ theme(strip.background = element_blank(), strip.text = element_blank()) 
Смежные вопросы