Подтвердить что ты не робот

Выделенный текст с ggplot2

Я хотел бы знать, есть ли способ нарисовать "набросанный текст" с помощью ggplot2, например черный текст с небольшой белой рамкой, чтобы сделать его легко читаемым на фоне, таком как карты.

В идеале я хотел бы получить те же типы ярлыков, которые вы можете видеть на Картах Google:

enter image description here

Заранее благодарим за любые подсказки!

4b9b3361

Ответ 1

Вот подход, реализующий общую идею из функции shadowtext в пакете TeachingDemos. Код для средней части можно было бы обернуть в функцию, чтобы упростить некоторые вещи. Пример явно украден из ответа Ричи Коттона:

d <- diamonds[sample(nrow(diamonds), 10), ]  


p <- ggplot(d, aes(carat, price) ) 
theta <- seq(pi/8, 2*pi, length.out=16)
xo <- diff(range(d$carat))/200
yo <- diff(range(d$price))/200
for(i in theta) {
    p <- p + geom_text( 
        bquote(aes(x=carat+.(cos(i)*xo),y=price+.(sin(i)*yo),label=cut)), 
                    size=12, colour='black' )
}
p <- p + geom_text( aes(label=cut), size=12, colour='white' )
p <- p + opts( panel.background=theme_rect(fill='green' ) )
print(p)

enter image description here

Ответ 2

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

Я использовал фон зеленой панели для имитации карты.

d <- diamonds[sample(nrow(diamonds), 10), ]

(p <- ggplot(d, aes(carat, price)) +
  geom_text(
    aes(label = cut, family = "mono", fontface = "bold"), 
    size = 12, 
    colour = "black"
  ) +
  geom_text(
    aes(label = cut, family = "mono"), 
    size = 12, 
    colour = "white"
  ) +
  opts(panel.background = theme_rect(fill = "green"))
)

text-on-bold-text with the diamonds dataset

Ответ 3

Принятый ответ Грега Снега больше не работает с [email protected] из-за вызова aes вместо aes_q.

Использование

for(i in theta) {
  p <- p + geom_text( 
    aes_q(x = bquote(carat+.(cos(i)*xo)),
          y = bquote(price+.(sin(i)*yo)),
          label = ~cut), 
    size=12, colour='black' )
}

вместо.