我正在尝试显示一些数据,我不需要使用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))
答案 0 :(得分:1)
这样做......你可以将它包装在一个函数中,以便在需要时使其更具通用性。
首先,我们使用expand.grid
创建x
和1:(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)
我不确定你是否真的希望这些点是红色的 - 如果你想让它们看起来都一样,那么你可以使用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))
注意我没有包含红色,但如果你想要它可以轻松完成
答案 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)
答案 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")