ggplot将geom_segment显示为一系列点

时间:2016-10-26 21:29:29

标签: r ggplot2

我正在尝试显示一些数据,我不需要使用geom_point显示一个点,但也希望从轴跟踪一条线。我想我可以用geom_segment来做,但我想显示一系列离散点。

说我有这样的数据:

df2 <- data_frame(x = c("a", "b", "c" ,"d"), y = c(3:6))

# A tibble: 4 × 2
      x     y
  <chr> <int>
1     a     3
2     b     4
3     c     5
4     d     6

我想得到的是如下图所示,只有在0和它们的值之间的4个变量中都有一个点(所需的点用红色手动标记):

ggplot(df2, aes(x=x)) + geom_point(aes(y=y)) + geom_point(aes(y=0))

enter image description here

4 个答案:

答案 0 :(得分:1)

这样做......你可以将它包装在一个函数中,以便在需要时使其更具通用性。

首先,我们使用expand.grid创建x1:(max(y) - 1)的所有组合,将其加入原始数据,并过滤掉不必要的组合。

library(dplyr)
df3 = left_join(expand.grid(x = unique(df2$x), i = 1:max(df2$y - 1)),
          df2) %>%
    filter(i < y)

构建数据后,绘图很容易:

ggplot(df2, aes(x=x)) + 
    geom_point(aes(y=y)) + 
    geom_point(y = 0) +
    geom_point(data = df3, aes(y = i), color = "red") +
    expand_limits(y = 0)

transform-origin

我不确定你是否真的希望这些点是红色的 - 如果你想让它们看起来都一样,那么你可以使用1:max(df2$y)(省略-1)并使用{过滤器中的{1}}然后仅使用结果数据框。

答案 1 :(得分:1)

如果您想使用data.table方法,可以使用类似的扩展方法:

dt <- setDT(df2)
dt_expand<-dt[rep(seq(nrow(dt)),dt$y),]
dt_expand[,y2:=(1:.N),by=.(x)]
ggplot(dt_expand, aes(x=x)) + geom_point(aes(y=y2)) + geom_point(aes(y=0))

注意我没有包含红色,但如果你想要它可以轻松完成

enter image description here

答案 2 :(得分:1)

这里是基础R的解决方案。想法是创建2个不同的数据集,一个用于红点:

dat1 <- do.call(rbind,Map(function(x,y)data.frame(x=x,y=seq(0,y)),df2$x,df2$y))

另一个黑点

dat2 <- do.call(rbind,Map(function(x,y)data.frame(x=x,y=c(0,y)),df2$x,df2$y))

然后情节只是相同情节的2层的juxtopsition但具有不同的数据:

library(ggplot2)

ggplot(data=dat1,aes(x=x,y=y)) +
  geom_point(col="red") +
  geom_point(data=dat2)

enter image description here

答案 3 :(得分:0)

又一个与@Gregor相似的选项,因为它创建了一个新的数据向量。

d <- data.frame(x = c("a", "b", "c" ,"d"), y = c(3:6))

new_points <- mapply(seq, 0, d$y)
new <- data.frame(new = unlist(lapply(new_points, as.data.frame)), 
                     x = rep(letters[1:4], d$y + 1),
                     group = 1)

d <- merge(d, new, by = "x")
d$group <- as.factor(ifelse(d$y == d$new|d$new == 0, 2, d$group))

ggplot(d, aes(x, new, color = group)) + 
    geom_point() +
    scale_color_manual(values = c("red", "black")) +
    theme(legend.position = "none")

enter image description here