Вы можете использовать параметр 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)
Если вы хотите расположить элементы легенды упорядоченные по строкам, вы можете сделать это путем индексации их в нужном порядке. Например.
MyOrder = as.vector(matrix(1:20, nrow = 4, ncol = 5, byrow = T))
legend("bottom",MyLab[MyOrder], fill=MyCol[MyOrder] ,ncol=5)
Обобщить для различного количества строк и факторов, мы можем сделать что-то вроде
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)
и окончательный дополнительный трюк: В предыдущем участке, мы устанавливаем границу = NA. Это делается для того, чтобы не создавать границы вокруг пустых элементов легенды (те, которые лежат в нижней части неполных столбцов). Если вам нужны границы, то мы также должны создать вектор цветов границы, который равен NA
только в тех местах, где мы не хотим рисовать.
MyBorders = rep("black", Nrows*Ncols)
MyBorders[MyOrder > Nfact] <- NA
legend("bottom", MyLab[MyOrder], fill = MyCol[MyOrder], ncol = Ncols, border=MyBorders)