R-(ggplot)使geom_step跳跃为虚线

时间:2018-09-08 15:08:01

标签: r ggplot2

我正在绘制离散CDF。我有一些关于geom_step的问题,使用Google找不到。

  1. 是否可以使代表跳跃的线段变为虚线 而不是为了更好地显示正在发生的事情?
  2. 是否可以比我更有效地添加geom_point? (减 c / p)。

以下是我当前的解决方案:

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 :(得分:2)

如果您可以将数据放入数据帧并对其进行结构化,以便可以直接映射数据的特征,那么

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

答案 1 :(得分:0)

(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)')

答案 2 :(得分:0)

对于问题的第二部分,您可以将所有坐标放在单独的数据框中并仅调用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)')