Как сделать график 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 справочная страница (я знаю Хэдли, они просто примеры;)
Ответы
Ответ 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 с красивыми метками]()