ggplot2 исправляет перекрывающиеся y-метки - PullRequest
0 голосов
/ 14 февраля 2019

Пример кода
Позвольте мне взять этот небольшой пример:

example.data <- data.frame(
  x = seq(1,5),
  y = c(seq(1,3), 4.1, 4.11),
  y.label = letters[1:5]
)


library(ggplot2)
ggplot(example.data, aes(x=x, y = y)) + 
  geom_point() +
  scale_y_continuous(breaks = example.data$y, labels = example.data$y.label)

Так как 4.1 и 4.11 очень близки друг к другу, ярлыки будут перекрываться:

enter image description here

Инфо
Я строю очень похожий график для публикации и не хочу увеличивать размер рисунка только для того, чтобы сделатьметки подходят (что потребовало бы, чтобы участок был очень большим).Я знаком с ggrepel, но, насколько мне известно, это работает только для текстовой аннотации внутри самого графика, а не для оси.

Вопрос
Как я могу убедиться, что метки не перекрываются без увеличения размера всего графика?

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Я бы предложил другой сюжет для этой задачи:

ggplot(example.data, aes(x=y.label, y = y)) + 
    geom_point() +
    geom_hline(yintercept = 4.1) +
    geom_text(aes(0,4.1,label = 4.1,hjust=-1,  vjust = -0.5))

Changed axis plot

0 голосов
/ 14 февраля 2019

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

p1 <- ggplot(example.data, aes(x=x, y = y)) + 
  geom_point() + 
  scale_y_continuous(breaks = example.data$y[1:4], labels = example.data$y.label[1:4])

p2 <- ggplot(example.data, aes(x=x, y = y)) + 
  geom_point() + 
  xlim(3.9, 5.1) + 
  scale_y_continuous(breaks=seq(4.100, 4.111, .002), labels=c("d", rep("", 4), "e"),
                     limits=c(4.1, 4.111))

vp <- grid::viewport(width=0.4, height=0.15, x=.8, y=.4)

png("plot.png")
print(p1)
print(p2, vp=vp)
dev.off()

Результат

enter image description here

С руководством для читателя становится еще яснее:

library("ggforce")
p1 <- p1 + geom_circle(aes(x0=4.5, y0=4.2, r=.7), 
                       inherit.aes=FALSE, linetype=2) +
  geom_segment(aes(x=4.5, y=2.5, xend=4.5, yend=3.5),
               size=1, arrow=arrow(length=unit(0.5, "cm")))

Уточненный результат

enter image description here

Примечание: Конечно, вы все еще можете это уточнить, просто чтобы дать вам идею.

...