Создать матрицу графиков с заголовками строк и столбцов

#r #plot

#r #график

Вопрос:

Используя par(mfrow = c(m,n)) команду, я могу легко создать матрицу графиков со m строками и n столбцами.

В особых случаях на графиках присутствует шаблон, так что все графики в каждом столбце имеют общий важный атрибут, а все графики в каждой строке имеют другой важный атрибут. Вся такая информация может быть включена в заголовок каждого из m*n графиков по отдельности, но это, очевидно, повторяется.

Есть ли удобный способ добавить имена столбцов (только над верхней строкой графиков) и имена строк (только слева от левого столбца графиков) в такую сетку?

Лучшее решение на данный момент: используйте text() команду для размещения текста за пределами графиков слева и сверху. Но это довольно неудовлетворительно, так как требует множества отдельных команд и настройки аргументов, например, srt = 90 для того, чтобы текст был вертикальным на левом поле, и использования xpd = NA inside of par() .

Ответ №1:

Пакеты lattice и ggplot2 содержат инструменты для создания нескольких графиков в сетке. Они могут ускорить весь ваш процесс, если они применимы к тому, что вы хотите сделать.

 library(lattice)

splom( ~ iris[,1:4], data=iris, groups=Species )
xyplot( mpg ~ wt | factor(cyl)*factor(am), data=mtcars )

library(ggplot2)

p <- ggplot(mtcars, aes(mpg, wt))   geom_point()
p   facet_grid(am ~ cyl)
 

Используя базовую графику, вы можете начать с установки внешнего поля, см. oma Аргумент par команды, затем используйте mtext функцию, чтобы вписать текст во внешнее поле для ваших надписей.

 par( oma=c(0,6,6,0), mfrow=c(2,2), mar=c(2,2,1,1) 0.1 )
with(iris, plot(Sepal.Width, Petal.Width, ann=FALSE))
mtext( 'Width', side=3, line=2, at=grconvertX(0.5,'npc','nic'), outer=TRUE )
mtext( 'Width', side=2, line=2, at=grconvertY(0.5,'npc','nic'), outer=TRUE )
mtext( 'Sepal', side=3, line=4, outer=TRUE, cex=2 )
mtext( 'Petal', side=2, line=4, outer=TRUE, cex=2 )
with(iris, plot(Sepal.Length, Petal.Width, ann=FALSE))
mtext( 'Length', side=3, line=2, at=grconvertX(0.5,'npc','nic'), outer=TRUE )
with(iris, plot(Sepal.Width, Petal.Length, ann=FALSE))
mtext( 'Length', side=2, line=2, at=grconvertY(0.5, 'npc','nic'), outer=TRUE )
with(iris, plot(Sepal.Length, Petal.Length, ann=FALSE))
 

Комментарии:

1. Ваш третий ответ является наиболее привлекательным для меня, поскольку он выглядит гибким. Похоже, что важнейшими элементами являются oma аргумент in par() , mtext функция и ее outer аргумент, и grconvertX/Y . Я все еще надеюсь, что R разработчики найдут более оптимизированный интерфейс, какой metapar() -нибудь.

2. @zkurtz, ты всегда можешь сам написать функцию, чтобы делать то, что ты хочешь. Если это достаточно полезно для других людей, поместите его в пакет, если он достаточно полезен, то в конечном итоге он может оказаться в обычном R. Для меня не очевидно, как будет работать функция, которая даст вам гибкость и будет проще, чем делать это вручную (1-й и 2-й варианты обеспечивают простоту, а другие инструменты также обеспечивают простоту, но вы, похоже, хотите гибкости).