#r #text #ggplot2
#r #текст #ggplot2
Вопрос:
Вот пример проблемы:
example=data.frame(x1=c(1,4.1,7),x2=c(4,7.1,10),
y1=c(1,1,5),y2=c(2,2,6),text=c('Example','A Bigger Example','little.lite'))
example$xmid = (example$x1 example$x2)/2
example$ymid = (example$y1 example$y2)/2
ggplot() geom_rect(data=example,aes(xmin=x1,xmax=x2,ymin=y1,ymax=y2,fill=text))
geom_text(data=example,aes(x=xmid,y=ymid,label=text))
Результат выглядит следующим образом:
Я попытался настроить размер меток, используя количество символов в строке, но это не учитывает интервал и кернинг разных символов в немоноширинных шрифтах. Например,
example$text_size=24/nchar(as.character(example$text))
ggplot() geom_rect(data=example,aes(xmin=x1,xmax=x2,ymin=y1,ymax=y2,fill=text))
geom_text(data=example,aes(x=xmid,y=ymid,label=text,size=text_size))
scale_size_continuous(range=c(4,8))
Затем результат выглядит следующим образом:
Хотя ширина текста в нижних полях одинакова, ширина текста строки со многими буквами l и t. меньше. Есть ли какой-либо способ заранее рассчитать интервал, чтобы учесть ширину всех разных символов?
Комментарии:
1.
strwidth
может быть полезно для вас здесь.
Ответ №1:
Согласно предложению @Tyler Rinker, я использовал strwidth
функцию вместо nchar
.
example$text_size2=24/strwidth(as.character(example$text))
ggplot() geom_rect(data=example,aes(xmin=x1,xmax=x2,ymin=y1,ymax=y2,fill=text))
geom_text(data=example,aes(x=xmid,y=ymid,label=text,size=text_size2))
scale_size_continuous(range=c(4,8))
Конечный результат выглядит следующим образом:
Комментарии:
1. Когда я пытаюсь запустить ваш пример, я получаю
Error in strwidth(as.character(example$text)) : plot.new has not been called yet
. Из документации видно, что функция извлекает ширину из графического устройства, еслиunits = "user"
(по умолчанию в наши дни) и, похоже, не работает с ggplot2. Используйтеunits = "figure"
для выполнения обычной работы в версиях R и ggplot2 2018 года.