R: Как мне разместить две диаграммы рядом друг с другом, сохраняя одинаковый диапазон y для обоих?

Допустим, у меня есть два набора данных, один с y-диапазоном [min0:max0], а другой с y-диапазоном [min1:max1]. Как можно разместить оба графика на одном графике рядом друг с другом с разумным диапазоном y [min (min0, min1): max (max0, max1)]?

Вот что я пробовал:

d0 <- matrix(rnorm(15), ncol=3)
d1 <- matrix(rnorm(15), ncol=3)

par(mfrow = c(1, 2))
boxplot(d0)
usr <- par("usr")
plot.new()
par(usr = usr)
boxplot(d1, add = TRUE)

Но это сохранит только первые графики y-диапазона, а также сожмет оба графика, тогда как я бы хотел, чтобы они были квадратными.

Любые идеи?


person htorque    schedule 21.07.2011    source источник
comment
Ваш код не воспроизводится. См. stackoverflow.com /вопросы/5963269/   -  person Roman Luštrik    schedule 21.07.2011
comment
@RomanLuštrik Спасибо за подсказку; это сейчас.   -  person htorque    schedule 21.07.2011


Ответы (1)


d0 <- matrix(rnorm(15), ncol=3)
d1 <- matrix(rnorm(15), ncol=3)

# Using base R graphics
lmts <- range(d0,d1)

par(mfrow = c(1, 2))
boxplot(d0,ylim=lmts)
boxplot(d1,ylim=lmts)

базовый графический сюжет

Вы также можете подумать о том, как сделать это с помощью сетки, либо с помощью пакетов lattice, либо ggplot2.

Вот одна попытка в ggplot2:

# Using ggplot2
library(ggplot2)
d <- data.frame(d.type=c(rep(0,15),rep(1,15)),sub.type=rep(c('A','B','C'),10),val=rnorm(30))

p <- ggplot(d, aes(factor(sub.type), val)) 
p + geom_boxplot() + facet_grid(. ~ d.type)

ggplot2

И в решетке:

# Using lattice
library(lattice)
bwplot(~ val|sub.type+d.type ,d)

решетчатый график

Обратите внимание, как решения на основе сетки избавляют вас от необходимости указывать ограничения; вы указываете структуру, а программа делает все остальное.

person Ari B. Friedman    schedule 21.07.2011
comment
Хмпф, я, наверное, прочитал аргумент ylim boxplot. Спасибо! - person htorque; 21.07.2011
comment
Хотел бы я дать вам еще один +1 за обширный ответ, еще раз спасибо! - person htorque; 21.07.2011
comment
Нет, действительно развернутый ответ включал бы срезы (решетка), эстетику (ggplot2) и другие способы сделать графику на основе сетки более красивой :-) - person Ari B. Friedman; 21.07.2011
comment
Э-э, это опоясывающий лишай, а не кусочки. - person Ari B. Friedman; 21.07.2011
comment
lmts можно рассчитать более кратко с помощью: lmts <- range(d0,d1). - person Joshua Ulrich; 21.07.2011
comment
@Джошуа Ульрих: Спасибо, обновлено. Иногда вы оглядываетесь на свой собственный код и просто качаете головой :-). Зависимость от пути в действии. - person Ari B. Friedman; 21.07.2011
comment
@gsk: В моем случае с/иногда/всегда. Я только что увидел эту строку и подумал, что должен быть более ленивый способ получить такой результат. ;-) - person Joshua Ulrich; 21.07.2011
comment
@JU: Да, я как бы взял [min(min0, min1):max(max0, max1)] из исходного вопроса и преобразовал его в R. Так что, как говорится в руководстве по Perl, речь идет о том, чтобы лениться правильно, а не о том, чтобы лениться так, чтобы больше печатать и меньше думать! - person Ari B. Friedman; 21.07.2011