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

Как сделать график geom_text в пределах холста

Использование geom_text для маркировки исходящих точек графика рассеяния. По определению эти точки, как правило, близки к краям холста: обычно есть хотя бы одно слово, которое перекрывает край холста, делая его бесполезным.

Очевидно, что это можно решить вручную в следующем случае, используя + xlim(c(1.5, 4.5)):

# test
df <- data.frame(word = c("bicycle", "tricycle", "quadricycle"),
                 n.wheels = c(2,3,4),
                 utility = c(10,6,7))
ggplot(data=df, aes(x=n.wheels, y=utility, label=word))  + geom_text() + xlim(c(1.5, 4.5))

trike

Это не идеально, хотя

  • Он не автоматизирован, поэтому замедляет процесс, если будет создано множество графиков.
  • Это неточно, то есть расстояние между краем слова и краем холста не одинаково в каждом случае.

Поиски этой проблемы не выявили никаких решений, и Хэдли Уикхэм, похоже, довольствовался тем, что метки сокращаются наполовину в ggplot2 справочная страница (я знаю Хэдли, они просто примеры;)

4b9b3361

Ответ 1

ggplot 2.0.0 представил новые опции для hjust и vjust для geom_text(), которые могут помочь с отсечением, особенно "inward". Мы могли бы сделать:

ggplot(data=df, aes(x=n.wheels, y=utility, label=word))  + 
  geom_text(vjust="inward",hjust="inward")

введите описание изображения здесь

Ответ 2

Вы можете отключить обрезку. Для вашего примера он отлично работает.

p <- ggplot(data=df, aes(x=n.wheels, y=utility, label=word))  + geom_text() 
gt <- ggplot_gtable(ggplot_build(p))
gt$layout$clip[gt$layout$name == "panel"] <- "off"
grid.draw(gt)

Clipping off

Ответ 3

Я думаю, что это полезно для expand в scale_continuous:

ggplot(data=df, aes(x=n.wheels, y=utility, label=word))  + geom_text() + 
    scale_x_continuous(expand = c(.1, .1))

Он заполняет ваши данные (мультипликативно и аддитивно) для расчета пределов шкалы. Если у вас на самом деле не длинные слова, достаточно немного наброситься на него по умолчанию. К сожалению, сейчас я не могу найти значения по умолчанию, но, возможно, достаточно изменить на c(0.1, 0.1).

Если вы хотите найти значения по умолчанию, похоже, вы можете изменить значения по умолчанию, если хотите использовать ggplot2:::coord_expand_defaults...

Ответ 4

Я уверен, что кто-то может придумать способ запрограммировать это немного быстрее, но вот ответ, который может быть использован, в частности, с несколькими аспектами, которые имеют разные диапазоны - я изменил data.frame, чтобы иметь две грани разные шкалы x и y:

df <- data.frame(word = c("bicycle", "tricycle", "quadricycle"),
                 n.wheels = c(2,3,4, .2, .3, .4),
                 utility = c(10,6,7, 1, .6, .7),
                 facet = rep(c("one", "two"), each = 3))

Затем я создаю фиктивный фрейм данных, который определяет ширину диапазона x и y для каждой грани (например, diff(range(n.wheels))), делит эту ширину на подходящее число (в зависимости от длины ваших меток, я выбрал 8) и добавляет, что заполнение до минимального и максимального значений x и y для каждой грани:

pad <- rbind(ddply(df, .(facet), summarize,
             n.wheels = min(n.wheels) - diff(range(n.wheels))/8, 
             utility = min(utility) - diff(range(utility))/8),
ddply(df, .(facet), summarize,
             n.wheels = max(n.wheels) + diff(range(n.wheels))/8,
             utility = max(utility) + diff(range(utility))/8))
pad$word <- NA

Затем вы можете добавить этот слой к вашему сюжету с цветом, установленным как NA:

ggplot(data=df, aes(x=n.wheels, y=utility, label = word))  + 
   geom_text() + 
   geom_point(data = pad, aes(x = n.wheels, y = utility), colour = NA) +
   facet_wrap(~facet, ncol = 1, scales = "free") 

Результат: воспроизводимый, "автоматизированный" сюжет без метки отсечения (вы можете выбрать позже, чтобы изменить масштаб, чтобы быть красивее...)

Графический ggplot с красивыми метками