R - (ggplot) Делать скачки geom_step пунктирными - PullRequest
0 голосов
/ 08 сентября 2018

Я строю дискретный CDF. У меня есть несколько вопросов, касающихся geom_step, которые я не могу найти с помощью Google.

  1. Можно ли сделать отрезок, представляющий скачок, пунктирным? а не твердо, чтобы лучше показать, что происходит?
  2. Можно ли добавить geom_point более эффективно, чем я? (Меньше с / р).

Ниже мое текущее решение:

library(tidyverse)
library(ggthemes)
theme_set(theme_few())

x0 <- seq(-0.5, -0.01, by = 0.01)
x1 <- seq(0, 0.99, by = 0.02)
x2 <- seq(1, 1.99, by = 0.02)
x3 <- seq(2, 2.99, by = 0.02)
x35 <- seq(3, 3.49, by = 0.01)
x4 <- seq(3.5, 3.99, by = 0.01)

tibble_ex <- tibble(
  x0 = x0,
  x1 = x1,
  x2 = x2,
  x3 = x3,
  x35 = x35,
  x4 = x4
)

tibble_ex %>%
  gather(x, xax, x0:x4) %>%
  mutate(cdf = case_when(x == 'x0' ~ 0,
                         x == 'x1' ~ 1/2,
                         x == 'x2' ~ 3/5,
                         x == 'x3' ~ 4/5,
                         x == 'x35' ~ 9/10,
                         x == 'x4' ~ 1)) %>%
  ggplot(aes(x = xax, y = cdf)) +
  geom_step() +
  geom_point(aes(x = 0, y = 0), size = 3, shape = 21, fill = 'white') +
  geom_point(aes(x = 1, y = 0.5), size = 3, shape = 21, fill = 'white') +
  geom_point(aes(x = 2, y = 3/5), size = 3, shape = 21, fill = 'white') +
  geom_point(aes(x = 3, y = 4/5), size = 3, shape = 21, fill = 'white') +
  geom_point(aes(x = 3.5, y = 9/10), size = 3, shape = 21, fill = 'white') +
  geom_point(aes(x = 0, y = 0.5), size = 3, shape = 21, fill = 'black') +
  geom_point(aes(x = 1, y = 3/5), size = 3, shape = 21, fill = 'black') +
  geom_point(aes(x = 2, y = 4/5), size = 3, shape = 21, fill = 'black') +
  geom_point(aes(x = 3, y = 9/10), size = 3, shape = 21, fill = 'black') +
  geom_point(aes(x = 3.5, y = 1), size = 3, shape = 21, fill = 'black') +
  labs(x = 'x', y = 'F(x)')

enter image description here

Ответы [ 3 ]

0 голосов
/ 08 сентября 2018

Для второй части вашего вопроса вы можете поместить все координаты в отдельный фрейм данных и вызывать geom_point только один раз:

ddf <- data.frame(xax = rep(c(0:3, 3.5), 2),
                  cdf = c(0, .5, .6, .8, .9, .5, .6, .8, .9, 1),
                  col = rep(c("white", "black"), each = 5))
dev.new()
tibble_ex %>%
  gather(x, xax, x0:x4) %>%
  mutate(cdf = case_when(x == 'x0' ~ 0,
                         x == 'x1' ~ 1/2,
                         x == 'x2' ~ 3/5,
                         x == 'x3' ~ 4/5,
                         x == 'x35' ~ 9/10,
                         x == 'x4' ~ 1)) %>%
  ggplot(aes(x = xax, y = cdf)) +
  geom_step() +
  geom_point(data = ddf, aes(fill = I(col)), size = 3, shape = 21) +
  labs(x = 'x', y = 'F(x)')
0 голосов
/ 08 сентября 2018

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

Вот способ взять ваши данные и дополнить их дополнительными строками, представляющими соединительные точки, сопоставив каждый x с предыдущим значением cdf. Я добавил столбец type, чтобы отслеживать, какой именно. Я также расположил df так, чтобы geom_segment наносил точки в правильном порядке.

new_steps <- 
  tibble(x = c(0:3, 3.5, 4),
         cdf = c(0, .5, .6, .8, .9, 1))


df <- new_steps %>%
  mutate(type = "cdf") %>%
  bind_rows(new_steps %>%
              mutate(type = "prior",
                     cdf = lag(cdf))) %>%
  drop_na() %>%
  arrange(x, desc(type))

Затем мы можем отобразить точки 'fill и тип линии geom_segments' на type.

ggplot(df) + 
  geom_point(aes(x, cdf, fill = type),
             shape = 21) +
  scale_fill_manual(values = c("black", "white")) +
  geom_segment(aes(x = lag(x), y = lag(cdf),
                   xend = x, yend = cdf,
                   lty = type)) +
  scale_linetype_manual(values = c("dashed", "solid"))

plot with dashed vertical lines

0 голосов
/ 08 сентября 2018

(1) Нет, встроенного способа сделать geom_step наполовину пунктирным не существует. Но если вы разместите это как отдельный вопрос, возможно, кто-то поможет создать новый гем для этого.

(2) Ответ состоит в том, чтобы поместить точки, которые вы хотите построить, во фрейме данных, как и все, что вы хотите построить:

point_data = data.frame(x = rep(c(0, 1, 2, 3, 3.5), 2),
                        y = c(0, rep(c(.5, .6, .8, .9), 2), 1),
                        z = rep(c("a", "b"), each = 5))

# calling your gathered/mutated version of tibble_ex df
ggplot(df, aes(x = xax, y = cdf)) +
  geom_step() +
  geom_point(data = point_data, aes(x = x, y = y, fill = z), shape = 21) +
  scale_fill_manual(values = c("white", "black"), guide = FALSE) +
  labs(x = 'x', y = 'F(x)')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...