Сохранение заказа с помощью geom_text_repel - PullRequest
0 голосов
/ 25 июня 2018

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

library(ggplot2)
library(tibble)
library(ggrepel)

d <- tribble(
  ~repr,             ~number,
 "1.1[2] %*% 2^-11", 2**-3 + 2**-4,
 "1.0[2] %*% 2^-11", 2**-3,
 "1.1[2] %*% 2^-10", 2**-2 + 2**-3,
 "1.0[2] %*% 2^-10", 2**-2,
 "1.1[2] %*% 2^-01", 2**-1 + 2**-2,
 "1.0[2] %*% 2^-01", 2**-1,
 "1.0[2] %*% 2^0",   1,
 "1.1[2] %*% 2^0",   1 + 2**-1,
 "0.0[2] %*% 2^0",   0,
 "1.1[2] %*% 2^01",   2 + 1,
 "1.0[2] %*% 2^01",   2,
 "1.1[2] %*% 2^10",   2**2 + 2**1,
 "1.0[2] %*% 2^10",   2**2,
 "1.1[2] %*% 2^11",   2**3 + 2**2,
 "1.0[2] %*% 2^11",   2**3,

 "-1.1[2] %*% 2^-11", -(2**-3 + 2**-4),
 "-1.0[2] %*% 2^-11", -(2**-3),
 "-1.1[2] %*% 2^-10", -(2**-2 + 2**-3),
 "-1.0[2] %*% 2^-10", -(2**-2),
 "-1.1[2] %*% 2^-01", -(2**-1 + 2**-2),
 "-1.0[2] %*% 2^-01", -(2**-1),
 "-1.0[2] %*% 2^0",   -1,
 "-1.1[2] %*% 2^0",   -(1 + 2**-1),
 "-1.1[2] %*% 2^01",  -(2 + 1),
 "-1.0[2] %*% 2^01",  -2,
 "-1.1[2] %*% 2^10",  -(2**2 + 2**1),
 "-1.0[2] %*% 2^10",  -2**2,
 "-1.1[2] %*% 2^11",  -(2**3 + 2**2),
 "-1.0[2] %*% 2^11",  -2**3
)

ggplot(d) +
  geom_text_repel(aes(x = number, y = -0.1, label = number),
                  parse = TRUE,
                  angle = 0,
                  ylim = c(NA, -0.1)) +
  geom_text_repel(aes(x = number, y = 0.1, label = repr),
                  angle = 0,
                  parse = TRUE, direction = "both", #angle = 90,
                  ylim = c(0.1, NA)) +
  geom_hline(yintercept = 0) +
  coord_cartesian(ylim = c(-2, 2)) +
  labs(x = NULL, y = NULL) +
  theme_classic() +
  theme(axis.line.y = element_blank(),
        axis.ticks = element_blank(),
        axis.text = element_blank())

Результат выглядит так:

Number line plot

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

Есть ли способ избежать пересечения каких-либо линий с geom_text_repel? Я не против иметь больший разброс меток вокруг нуля, где много значений, я просто думаю, что трудно прочитать график как есть, так как метки скремблированы так, как они есть.

1 Ответ

0 голосов
/ 26 июня 2018

Давайте добавим еще один столбец для размещения текстовых меток:

d <- d[order(d$number),]
d$i <- seq(min(d$number), max(d$number), length.out = nrow(d))
head(d)

Вот оно:

            repr  number          i
-1.1[2] %*% 2^11     -12  -12.00000
-1.0[2] %*% 2^11      -8  -11.14285
-1.1[2] %*% 2^10      -6  -10.28571
-1.0[2] %*% 2^10      -4  -9.428571
-1.1[2] %*% 2^01      -3  -8.571429
-1.0[2] %*% 2^01      -2  -7.714286

Нам не нужен ggrepel:

ggplot() +
geom_point(
  data = d,
  mapping = aes(x = 0, y = number),
  size = 0.1
) +
geom_text(
  data = d,
  mapping = aes(x = 0.05, y = i, label = repr),
  parse = TRUE, hjust = 0
) +
geom_segment(
  data = d,
  mapping = aes(x = 0, xend = 0.05, y = number, yend = i),
  size = 0.1
) +
scale_y_continuous(
  breaks = c(-12, -8, -6, -4, -3, -2, -1, 0, 1, 2, 3, 4, 6, 8, 12)
) +
coord_cartesian(xlim = c(-0.01, 0.12)) +
theme_classic(base_size = 14) +
labs(x = NULL, y = NULL) +
theme(
  axis.line.y = element_line(size = 0.2),
  axis.ticks.y = element_line(size = 0.2),
  axis.line.x = element_blank(),
  axis.ticks.x = element_blank(),
  axis.text.x = element_blank()
)

enter image description here

...