Автоматическая корректировка полей в горизонтальной гистограмме
Мне нужно создать серию горизонтальных сгруппированных гистограмм. Функция barplot автоматически не корректирует поля графика, поэтому текст отключается.
graphics.off() # close graphics windows
test <- matrix(c(55,65,30, 40,70,55,75,6,49,45,34,20),
nrow =3 ,
ncol=4,
byrow=TRUE,
dimnames = list(c("Subgroup 1", "Subgroup 2", "Subgroup 3"),
c(
"Category 1 Long text",
"Category 2 very Long text",
"Category 3 short text",
"Category 4 very short text"
)))
barplot(test,
las=2,
beside = TRUE,
legend=T,
horiz=T)
![enter image description here]()
Я не могу найти возможность автоматически перемещать график дальше вправо, как это делает функция R-штрих-кода ((процедура штрих-кода в SAS также автоматически регулирует поля). Очевидно, что я всегда могу вручную отрегулировать поля используя парную функцию.
par(mar=c(5.1, 13 ,4.1 ,2.1))
переместит график вправо
![enter image description here]()
Есть ли возможность переместить график вправо (т.е. отрегулировать поля) автоматически в зависимости от длины текста?
Я могу придумать 2 связанных аппроксимации, чтобы сделать это программно:
1) Рассчитайте длину самой длинной текстовой строки и соответственно отрегулируйте левое поле
2) Создайте графический график для данных, как-то захватите поля и используйте одни и те же поля на гистограмме.
Есть ли более простой способ сделать это?
Спасибо!
Ответы
Ответ 1
Я думаю, что ваша первая идея, вероятно, самая подходящая. Кажется, что-то вроде этого работает нормально и не требует многого.
ylabels <- c( "1oooooooooooo",
"2",
"3",
"4"
)
test <- matrix(c(55,65,30, 40,70,55,75,6,49,45,34,20),
nrow =3 ,
ncol=4,
byrow=TRUE,
dimnames = list(c("Subgroup 1", "Subgroup 2", "Subgroup 3"),
ylabels))
# adjust to the maximum of either the default
# or a figure based on the maximum length
par(mar=c(5.1, max(4.1,max(nchar(ylabels))/1.8) ,4.1 ,2.1))
barplot(test,
las=2,
beside = TRUE,
legend=T,
horiz=T)
После проверки dotchart
можно использовать более обобщенное решение:
linch <- max(strwidth(ylabels, "inch")+0.4, na.rm = TRUE)
par(mai=c(1.02,linch,0.82,0.42))