2013-03-27 6 views
5

Я пытаюсь сделать сюжет с ggplot2, но я борюсь с geom плитки. Поскольку я впервые использую эту геометрию, я внимательно посмотрел документацию Хэдли, но до сих пор мне не удалось получить то, что я за ней. Я хочу настроить ширину плитки и высоту плитки. Я нашел, как настроить ширину плитки в документации, но я борюсь с высотой. Принимая следующий сюжет в качестве отправной точки:Как отрегулировать высоту плитки в геометрической плите?

test <- data.frame(
    x = rep(c(1,3,6),2), 
    y = rep(c(1,3), each = 3), 
    w = rep(c(.5,2,1), 2), 
    z = sample(rep(LETTERS[1:6]))) 

ggplot(test, aes(x=x, y=y, fill = z)) + geom_tile(aes(width = w)) 

enter image description here

Теперь я хотел бы, чтобы регулировать высоту плитки, а также. С нижней плитой в первом «столбце» (при которой x = 1) будет выполняться от 0 до 1, а верхняя плитка в первом столбце работает от 1 до 4. Во втором столбце я хочу сделать нижнюю черепицу от 0 до 3 и верхняя плитка от 3 до 4. Для последнего столбца я хочу, чтобы нижняя часть от 0 до 1,5 и верхняя часть от 1,5 до 4. Я пробовал много вещей, например следующее:

test2 <- data.frame(
x = rep(c(1,3,6),2), 
y = c(0, 0, 0, 1, 3, 1.5), 
w = rep(c(.5,2,1), 2), 
z = sample(rep(LETTERS[1:6])), 
h = c(1, 3, 1.5, 3, 1, 2.5)) 

ggplot(test2, aes(x=x, y=y, fill = z)) + geom_tile(aes(width = w, heigth = h)) 

, но ни один не создал участок, который я искал.

Любая помощь будет принята с благодарностью. Заранее спасибо!

ответ

7

geom_tile принимает эстетический height=h и генерирует ymin и ymax от -h/2 to h/2. Вот почему вы не получаете сюжета, который вы планируете. Хотя я полностью поддерживаю решение @Didzis, поскольку он чрезвычайно прост и выполняется, я покажу решение, используя geom_tile по двум причинам. Это весело и всегда приятно знать :).

Цель состоит в том, чтобы «сгенерировать» ваши y позиций соответственно в зависимости от высоты, чтобы участок был таким, каким вы ожидаете. Принимая test2 data.frame,

require(plyr) 
# calculate y coordinate accounting for shift in y due to h 
test2 <- ddply(test2, .(x), transform, y2 = c(0, head(h,-1)) + h/2) 
p <- ggplot(test2, aes(x=x, y=y2, fill = z)) + 
      geom_tile(aes(width = w, height=h)) 
p 

enter image description here

Теперь вы видите, что высота аккуратно генерироваться (Ymin и Ymax)

ggplot_build(p)$data 

#  fill x y PANEL group xmin xmax ymin ymax 
# 1 #00BFC4 1 0.50  1  4 0.75 1.25 0.0 1.0 
# 2 #619CFF 1 2.50  1  5 0.75 1.25 1.0 4.0 
# 3 #00BA38 3 1.50  1  3 2.00 4.00 0.0 3.0 
# 4 #F8766D 3 3.50  1  1 2.00 4.00 3.0 4.0 
# 5 #B79F00 6 0.75  1  2 5.50 6.50 0.0 1.5 
# 6 #F564E3 6 2.75  1  6 5.50 6.50 1.5 4.0 
+0

Спасибо Арун, теперь я понимаю, что плитка геома лучше! – Edwin

+0

Я рад, что вы выбрали мой ответ. Но если у вас нет веских оснований, я не думаю, что здесь нужны «плитки». Решение @Didzis более подходит для ваших данных, я думаю. Что ты скажешь, Дидзис? – Arun

+1

@Arun По крайней мере, для меня это швы, что данные, нанесенные на график, представляют собой просто уложенные створки с разной шириной. –

5

Вместо использования geom_tile()geom_bar() с stat="identity" и использовать h как y значения. Вы можете установить width= также для geom_bar(), но вы получите предупреждение, которое можно игнорировать.

ggplot(test2,aes(x,h,fill=z))+geom_bar(stat="identity",aes(width=w)) 

enter image description here

+0

Спасибо за приятные решения, не делают связь между плиткой и баром. – Edwin

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