Вопрос по ggplot2, r – Набросал текст с помощью ggplot2

33

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

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

enter image description here

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

related question baptiste

Ваш Ответ

4   ответа
16

Вот подход, который реализует общую идею из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

@GregSnow, кроме исходного кода, нет реальной ссылки. Единственное руководствоthat I know of немного устарел и неясен. Проще всего было бы скопировать кодgeom-text.r, дать ему новое имя, заменитьtextGrob используется в методе рисования с векторной версиейgridExtra::stextGrob.
добавление множества новых слоев, вероятно, немного излишне, вместо этого вы можете определитьgrob+ геом, который заменяетtextGrob+geom_text как один слой.
Очень хорошее решение! Если вы добавитеalpha Вы получаете хороший градиент оттенка; напримерbquote(aes(x=carat+.(cos(i)*xo),y=price+.(sin(i)*yo),label=cut)), size=12, colour='black', alpha=1/8)
Другая небольшая проблема заключается в том, что все черные метки пишутся сразу, а затем все белые метки. Это не идеально, если метки перекрываются, например, в левом нижнем углу вашего примера. Но это, безусловно, лучший ответ, спасибо! juba
Это очень хитро. Мне это нравится.
2

Принятый ответ Грега Сноу больше не работает с[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' )
}

вместо.

11

Гораздо более простым решением является использованиеshadowtext библиотека и использованиеgeom_shadowtext вместоgeom_text

Это работает намного лучше, чем ответы с более высоким рейтингом
6

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

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

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

Похожие вопросы