2016-03-01 5 views
3

Я ищу, чтобы нарисовать заполненный контур с geom_tile и соответствующей необработанной трассировкой непосредственно под ним без пробела между ними. При использовании gridExtra или cowplot я могу закрыть их, но не там, где вершина необработанной трассы находится на оси x заполненного контура. Вот подробности:Два ggplots на одной фигуре, построенные близко друг к другу

данных

library(reshape2) 
library(ggplot2) 
volcano=volcano 
volcano3d=melt(volcano) 
names(volcano3d) <- c("x", "y", "z") 

Сюжеты

fill=ggplot(volcano3d,aes(x,y,z))+geom_tile(aes(fill=z)) 
raw=ggplot(volcano3d,aes(x,y))+geom_line()+theme(aspect.ratio=1/20) 

Мои попытки

library(gridExtra) 
grid.arrange(fill,raw,heights=c(5,1) 

В то время как они очень близки, я хотел бы сделать несколько вещей:

  1. Перемещение нижней дорожки вверх так, чтобы верхняя часть нижней следы касалась оси координат контура.
  2. Выровняйте две оси так, чтобы 0,25,50,75 были выровнены. В cowplot вы можете использовать выравнивание аргумента, так что это нормально, но я не могу понять, как сместить их ближе друг к другу.

Идеальный участок

Это из другого набора данных, но это хороший пример макета. enter image description here

мысли?

ответ

4

Это приближает вас к тому, что вы ищете, за исключением того, что легенда находится внутри области построения графика. Я использовал тему (plot.margin), чтобы отрегулировать верхнее и нижнее расстояние вокруг графиков и выровнять оси. Расширение = 0 позволяет расширять данные до краев графика (как в вашем примере). Создание grobs каждого графика и установка ширины равным позволяет вам контролировать высоты и ширину в расположении agrob.

library(reshape2) 
library(ggplot2) 
library(gridExtra) 
library(grid) 
volcano=volcano 
volcano3d=melt(volcano) 
names(volcano3d) <- c("x", "y", "z") 

fill=ggplot(volcano3d,aes(x,y,z))+geom_tile(aes(fill=z)) + 
theme(axis.text.x = element_blank(), 
    legend.position=c(1,1), 
    legend.justification=c(1, 1), 
    axis.title.x = element_blank(),axis.ticks=element_blank(), 
    plot.margin = unit(c(1,1,0,1), "cm")) + 
scale_x_continuous(expand = c(0, 0)) + 
scale_y_continuous(expand = c(0, 0)) 
raw=ggplot(volcano3d,aes(x,y))+geom_line()+ 
theme(aspect.ratio=1/20, 
    plot.margin = unit(c(-1.2,1,1,1), "cm")) + 
scale_x_continuous(expand = c(0, 0)) 

gA <- ggplotGrob(fill) 
gB <- ggplotGrob(raw) 
gA$widths <- gB$widths 
grid.newpage() 
grid.draw(arrangeGrob(gA,gB, heights = c(4/5, 1/5))) 
+0

Отлично. Легенда внутри сюжета должна быть в порядке с моими коллегами. Если они не справятся с этим. –

2

Можно оставить легенду вне участка. В двух примерах gtas gA имеет один дополнительный столбец для обозначения легенды. Поэтому добавьте столбец в gB той же ширины, что и легенда gA.

Кроме того, я бы сбросил соответствующие верхние и нижние ряды полей из вершин.

library(reshape2) 
library(ggplot2) 
library(gridExtra) 
library(gtable) 
library(grid) 
volcano=volcano 
volcano3d=melt(volcano) 
names(volcano3d) <- c("x", "y", "z") 

fill = ggplot(volcano3d, aes(x, y, z)) + 
    geom_tile(aes(fill=z)) + 
    scale_x_continuous(expand = c(0, 0)) + 
    scale_y_continuous(expand = c(0, 0)) 

raw = ggplot(volcano3d,aes(x,y)) + 
    geom_line() + 
    scale_x_continuous(expand = c(0, 0)) 

gA <- ggplotGrob(fill) 
gB <- ggplotGrob(raw) 

ga = gA[-c(10:7), ] # Remove bottom rows from gA 
gb = gB[-c(1:5), ] # Remove top rows from gB 

# Add extra column to gB gtable 
gb = gtable_add_cols(gb, ga$widths[7:8], 6) 

ga$widths <- gb$widths 
grid.newpage() 
grid.draw(arrangeGrob(ga,gb, heights = c(4/5, 1/5))) 
Смежные вопросы