Автоматическая корректировка полей в горизонтальной гистограмме

Мне нужно создать серию горизонтальных сгруппированных гистограмм. Функция 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))