2016-09-17 2 views
4

Я хочу создать горизонтальную легенду с несколькими строками с использованием базы R (не ggplot). Существует опция для нескольких столбцов, но не несколько строк в legend(). Есть ли способ сделать это? Пример игры внизу, где горизонтальная легенда слишком широка для сюжета.Базовая горизонтальная легенда R - с несколькими строками

MyCol <- topo.colors(20) 
barplot(rep(1,20), yaxt="n", col=MyCol) 
x <- 1:20 
MyLab <- paste("Zone",x) 
legend("bottom",MyLab,fill=MyCol,horiz=T) 

ответ

12

Вы можете использовать параметр ncol = вместо horiz, чтобы получить макет, который вы хотите. Обратите внимание, что horiz переопределяет ncol, поэтому не используйте их вместе. Хотя это не указывает количество строк напрямую, оно делает это косвенно, потому что количество строк определяется количеством столбцов и факторов.

MyCol <- topo.colors(20) 
barplot(rep(1,20), yaxt="n", col=MyCol) 
x <- 1:20 
MyLab <- paste("Zone",x) 
legend("bottom",MyLab,fill=MyCol,ncol=5) 

enter image description here

Если вы хотите расположить элементы легенды упорядоченные по строкам, вы можете сделать это путем индексации их в нужном порядке. Например.

MyOrder = as.vector(matrix(1:20, nrow = 4, ncol = 5, byrow = T)) 
legend("bottom",MyLab[MyOrder], fill=MyCol[MyOrder] ,ncol=5) 

enter image description here

Обобщить для различного количества строк и факторов, мы можем сделать что-то вроде

Nfact = 21 
Nrows = 5 
Ncols = ceiling(Nfact/Nrows) 
MyOrder = as.vector(matrix(1:(Nrows*Ncols), nrow=Nrows, ncol=Ncols, byrow=T)) 

MyCol <- topo.colors(Nfact) 
x <- 1:Nfact 
MyLab <- paste("Zone",x) 

barplot(rep(1,Nfact), yaxt="n", col=MyCol) 
legend("bottom", MyLab[MyOrder], fill = MyCol[MyOrder], ncol = Ncols, border=NA) 

enter image description here

и окончательный дополнительный трюк: В предыдущем участке, мы устанавливаем границу = NA. Это делается для того, чтобы не создавать границы вокруг пустых элементов легенды (те, которые лежат в нижней части неполных столбцов). Если вам нужны границы, то мы также должны создать вектор цветов границы, который равен NA только в тех местах, где мы не хотим рисовать.

MyBorders = rep("black", Nrows*Ncols) 
MyBorders[MyOrder > Nfact] <- NA 
legend("bottom", MyLab[MyOrder], fill = MyCol[MyOrder], ncol = Ncols, border=MyBorders) 

enter image description here

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