#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
аргумент inpar()
,mtext
функция и ееouter
аргумент, иgrconvertX/Y
. Я все еще надеюсь, чтоR
разработчики найдут более оптимизированный интерфейс, какойmetapar()
-нибудь.2. @zkurtz, ты всегда можешь сам написать функцию, чтобы делать то, что ты хочешь. Если это достаточно полезно для других людей, поместите его в пакет, если он достаточно полезен, то в конечном итоге он может оказаться в обычном R. Для меня не очевидно, как будет работать функция, которая даст вам гибкость и будет проще, чем делать это вручную (1-й и 2-й варианты обеспечивают простоту, а другие инструменты также обеспечивают простоту, но вы, похоже, хотите гибкости).