выравнивание нескольких типов графов в R (предпочтительно в ggplot2 или решетке) - PullRequest
3 голосов
/ 24 февраля 2012

Я хочу создать следующий тип графика с линией, полосой и тепловой картой с набором данных, подобным этому:

pos <- 1:40 # X axis 
barvar <- rnorm (40, 5, 2) # y axis for barplot 
linevar <- rnorm (40, 0, 0.5) # yvar for line plot 
heatmapvar <- rep(1:5, 8) # yvar plot for heatmap (color coded) plot 
myd <- data.frame (pos, barvar, linevar, heatmapvar) 

# labeling positions 
label <- c("A", "B", "C", "D", "E", "F", "G", "H", "I")
position <- c(1, 5, 10, 15, 20, 25, 30, 35, 40)

enter image description here

Ответы [ 3 ]

3 голосов
/ 24 февраля 2012

Используя решетку, установите scales=list(relation="free") - это выдаст предупреждение для levelplot(), но выравнивание по-прежнему работает нормально. Если вы хотите, чтобы он был выровнен как супер, выровняйте space="top" в levelplot(), чтобы легенда переместилась с правой стороны в верхнюю часть тепловой карты.

Обновление : я сбросил некоторые отступы и удалил метки, как было запрошено OP.

library(lattice)
library(gridExtra)
#within `scales` you can manipulate different parameters of x and y axis
a = xyplot(linevar ~ pos,type="l",col=1,xlab="",ylab="",
           scales=list(relation="free",x=list(draw=F)))
#layout.heights/layout.width can tweak padding for margins
b = barchart(barvar ~ pos,col=1,horizontal=F,xlab="",ylab="",
             scales=list(relation="free",x=list(cex=0.5)),
             par.settings=list(layout.heights=list(bottom.padding = 0)))
#change region colors according to your taste and use `colorkey` to remove legend
col=gray(seq(0.3,0.8,length=6))
c = levelplot(as.matrix(heatmapvar),col.regions=col,colorkey=F,xlab="",ylab="",
              scales=list(relation="free"),
              par.settings=list(layout.heights = list(top.padding =-25)))
grid.arrange(b,a,c)

enter image description here

3 голосов
/ 24 февраля 2012

При таком комбинированном сюжете зачастую проще составить их все по отдельности, прежде чем пытаться объединить их вместе:

library(ggplot2)

# line plot
p.line <- ggplot(myd,aes(x=pos)) + 
          geom_line(aes(y=linevar)) + # plot the line using linevar
          # draw the scales. NOTE: position[1] should be 0 not 1.
          scale_x_continuous(breaks=position,labels=label)
# bar plot
p.bar <- ggplot(myd,aes(x=pos)) + 
         geom_bar(aes(y=barvar),stat='identity') +  # plot the bar chart
         scale_y_reverse()                          # reverse y scale

# heat plot
p.heat <- ggplot(myd,aes(x=pos)) + 
          geom_tile(aes(y=-.5,fill=heatmapvar,height=.5)) +  # draw heatmap
          scale_fill_gradient(low="yellow",high="red")       # colour scale

Вы можете использовать print(p.xxx), чтобы посмотреть, как они выглядят.

Теперь мы можем объединить их все вместе, используя grid.arrange в gridExtra:

library(gridExtra)
grid.arrange(p.line,p.heat,p.bar)

Это выглядит так:

enter image description here

(Примечание. Моя гистограмма выдала предупреждение, потому что у меня отрицательный barvar - я предполагаю, что данные, которые вы собираетесь использовать, не будут иметь этой проблемы).

Теперь тепловая карта выглядит немного некрасивои похоже, что вы хотите, чтобы он нарисовал на карте линий, поэтому мы можем вместо этого добавить ее на карту линий:

Я не хочу, чтобы карта тепла отображалась над линией, поэтому я сам установлю ее позицию и высоту:

hght <- .25 # just looked nice - you'll have to adjust based on your data
ypos <- min(myd$linevar)-hght
p.line2 <- p.line + 
           geom_tile(aes(x=pos-.5,y=ypos, fill=heatmapvar, height=hght)) +
           scale_fill_gradient(low="yellow",high="red") +               
           opts(legend.position="none")  # <-- turn off the heatmap legend.
# print(p.line2)

Примечание - я добавил в x=pos-.5, потому что в противном случае geom_tile центрирует плитки по значению x, которое нене выстраиваются в линию (попробуйте без x=pos-.5, чтобы понять, что я имею в виду).

позиции маркировки

метка <- c ("A", "B", "C", "D ","E "," F "," G "," H "," I ") положение <- c (1, 5, 10, 15, 20, 25, 30, 35, 40) </p>

Теперь, когдаЯ организую это:

grid.arrange(p.line2,p.bar)

Это выглядит так:

enter image description here

Что касается подстройки цветов, добавления заголовков и т. Д. - вы можете сделать это.Я бы порекомендовал настроить отдельные графики, чтобы получить их так, как вам нравится, а затем только объединить их в конце.ggplot2 heatmap '(например, более полезна с точки зрения получения примеров для работы).

0 голосов
/ 24 февраля 2012

Можете ли вы думать, что мы можем объединить все три участка в один?

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

Существуют два основных недостатка -

(1) В не удалось сделать начальную точку баров из - 2

(2) Я хочу подавить - отрицательное число (Iпросто используйте трюк, чтобы преобразовать бары в минус)

...