我想从第二个图中获取第一个信息。
第二个图表示事件发生的日期。它似乎更宽,因为它没有传说,但它是相同的时间尺度。我选择在第一个图中手动指定颜色。
我想在第一个图上叠加第二个绘图点/符号(即组合它们),以便可以在一个图中看到事件。理想情况下,这将是在Y上为0.33高度的点线,在右端,它将具有标记点的字母F-在0.33的相同高度。你可以帮忙吗?数据和绘图代码如下:
剧情1:
ggplot(dfSub, aes(x=Date)) +
geom_smooth(aes(y=P,col='P'),span=0.5,se=F) +
geom_smooth(aes(y=A,col='A'),span=0.5, se=F) +
geom_smooth(aes(y=DEP,col='DEP'),span=0.5, se=F) +
geom_bar(aes(y=R,col='R'),stat="identity",alpha=0.5) +
scale_color_manual("",
values=c('P'='red','A'='purple','DEP'='blue',R='grey')) +
ylab("Scale 0 to 4")
剧情2:
ggplot(dfSub, aes(x=Date)) +
geom_point(data=subset(dfSub, !is.na(F)), aes(y=F))
数据:
dfSub <- structure(list(Date = structure(c(17539, 17540, 17541, 17542,
17543, 17544, 17545, 17546, 17547, 17548, 17549, 17550, 17551,
17552, 17553, 17554, 17555, 17556, 17557, 17558, 17559, 17560,
17561, 17562, 17563, 17564, 17565, 17566, 17567, 17568, 17569,
17570, 17571, 17572, 17573, 17574, 17575, 17576, 17577, 17578,
17579, 17580, 17581, 17582, 17583, 17584, 17585, 17586, 17587,
17588, 17589, 17590, 17591, 17592, 17593, 17594, 17595, 17596,
17597, 17598, 17599, 17600, 17601, 17602, 17603, 17604, 17605,
17606, 17607, 17608, 17609, 17610, 17611, 17612, 17613, 17614,
17615, 17616, 17617, 17618, 17619, 17620, 17621, 17622, 17623,
17624, 17625, 17626, 17627, 17628, 17629), class = "Date"), R = c(1,
2, NA, 1, 1, 2, NA, 1, 1, NA, 1, NA, 1, 1, 1, NA, NA, NA, 1,
NA, NA, NA, 1, 1, NA, 1, NA, NA, NA, NA, NA, NA, 2, NA, NA, 0,
1, 1, 1, 0, 1, 0, NA, NA, NA, 1, 1, 1, NA, NA, NA, NA, 1, NA,
1, 2, 1, 1, 3, 1, NA, 2, NA, NA, 1, 2, 1, 2, NA, NA, 1, NA, NA,
2, 1, NA, 1, 2, 1, NA, 1, 2, 1, NA, 1, 1, NA, 1, NA, NA, NA),
P = c(2, 4, 1, 1, 1, 2, 4, 0, 4, 1, 1, 0, 0, 2, 4, 4, 2,
2, 2, 4, 2, 1, 3, 2, 1, 3, 1, 0, 1, NA, 2, NA, 4, 4, 1, 3,
4, 4, 3, 2, 4, 4, 3, 0, 0, 2, 1, 3, 2, 0, 0, 0, 0, 1, 2,
4, 4, 3, 3, 3, 0, 2, 2, NA, 1, 2, 1, 1, 1, 1, 1, 1, 1, 3,
1, 1, 2, 4, 2, 0, 1, 4, 3, 1, 3, 1, 0, 0, 0, 0, 0), F = structure(c(NA,
NA, 1L, 1L, 1L, 1L, 1L, 1L, NA, 1L, 1L, 1L, 1L, NA, 1L, 1L,
NA, NA, NA, NA, 1L, NA, 1L, NA, 1L, 1L, 1L, 1L, 1L, NA, 1L,
1L, 1L, NA, NA, NA, NA, 1L, NA, 1L, NA, 1L, 1L, 1L, NA, NA,
NA, NA, 1L, 1L, NA, 1L, NA, 1L, NA, 1L, NA, NA, NA, NA, NA,
NA, NA, NA, NA, 1L, NA, NA, NA, NA, 1L, 1L, NA, NA, NA, 1L,
1L, NA, NA, NA, NA, NA, NA, NA, NA, 1L, 1L, NA, NA, NA, NA
), .Label = "X", class = "factor"), DEP = c(NA, NA, 1.5,
NA, NA, NA, NA, 1.5, NA, 1.5, 2, 2, 2, 2, 1.5, 1, 1.5, 1.5,
1, 1, 1.5, 1, 2, 2, 1.5, 1, 1, 0, 1, 0.5, 1, 0.5, 1, 1, 1,
1, 0, 1.5, 1, 1, 1.5, 0.5, 1, 2, 1.5, 1.5, 1.5, 1.5, 1.5,
1.5, 1.5, 2, 2, 2, 2, 1.5, 1.5, 2, 2.5, 2, 1.5, 1, 1.5, 1,
NA, 2, 2.5, 2, 1.5, 1.5, 1, 1.5, 1.5, 1, 1.5, 2, 2, 1, 1.5,
2, 1, 1.5, 2, 2, 1.5, 2, 2, 1.5, 1, 2, 2), A = c(NA, NA,
NA, NA, NA, NA, NA, NA, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2,
1, 1, 1, NA, 2, 1, 1, 1, 1, 1, 1, NA, 1, 1, 2, 1, 1, 1, 1,
1, 1, 1, 1, 1, NA, 1, 1, 1, 1, 1, 1, 1, 1.5, 1, 1, 1, 1,
2, 2, 1, 2, 3, 1, 2, 1, 1, 1, 1, 1, 1, 1.5, 1, 1, 2, 1, 1,
1, 1, 1, 1, 1, 1, 1, 3, 2, 2, 2, 1, 1, 1, 1, 1), FAS = structure(c(NA,
NA, 1L, 1L, NA, NA, NA, 1L, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA
), .Label = "X", class = "factor")), .Names = c("Date", "R",
"P", "F", "DEP", "A", "FAS"), class = "data.frame", row.names = c(NA,
-91L))
答案 0 :(得分:4)
首先,如果您将数据重新整形为长格式而不是宽格式,我认为您将拥有更轻松的时间。 ggplot
期待长形数据。这样你就可以将美学 - 在你的情况下,颜色 - 映射到变量,然后再调用geom_smooth
一次而不是多次。
同样简单,geom_col()
相当于geom_bar(stat = "identity")
。
@Gregor上面的建议很好:如果你只需要一两件文字,annotate
电话很简单。在这种情况下,我使用x = max(df_long$Date), y = 0.33
进行了此操作,但您可以将其放在任何您想要的日期。
如果有任何不清楚的地方,请告诉我。
library(tidyverse)
# deleted long line of reading in data frame
df_long <- dfSub %>%
select(-FAS) %>%
mutate(`F` = as.numeric(`F`)) %>%
gather(key = group, value = value, -Date) %>%
filter(!is.na(value))
ggplot(df_long, aes(x = Date, group = group)) +
geom_smooth(aes(y = value, color = group), data = . %>% filter(group %in% c("P", "A", "DEP")), span = 0.5, se = F) +
geom_col(aes(y = value), data = . %>% filter(group == "R"), alpha = 0.5, fill = "grey") +
geom_point(aes(color = "F"), y = 0.33, data = . %>% filter(group == "F")) +
annotate("text", x = max(df_long$Date), y = 0.33, label = "F") +
scale_color_manual("", values = c("P" = "red", "A" = "purple", "DEP" = "blue", "F" = "gray30")) +
ylab("Scale 0 to 4")
#> `geom_smooth()` using method = 'loess' and formula 'y ~ x'
由reprex package(v0.2.0)创建于2018-04-23。
已添加4/29 :对于点,这里是一个使用数据的示例,其中y值不仅仅是硬编码,就像原始帖子一样。
set.seed(1234)
dots <- data.frame(
value = rep(c(0.5, 1, 1.5), each = 20),
Date = sample(unique(df_long$Date), size = 60, replace = T)
)
ggplot() +
geom_col(
aes(x = Date, y = value),
data = df_long %>% filter(group == "R"),
fill = "gray60"
) +
geom_point(aes(x = Date, y = value), data = dots)
答案 1 :(得分:3)
这是你想要的吗?
library(tidyverse)
pp1 <- ggplot(dfSub, aes(x=Date)) +
geom_smooth(aes(y=P,col='P'),span=0.5,se=F) +
geom_smooth(aes(y=A,col='A'),span=0.5, se=F) +
geom_smooth(aes(y=DEP,col='DEP'),span=0.5, se=F) +
geom_bar(aes(y=R,col='R'),stat="identity",alpha=0.5) +
scale_color_manual("",
values=c('P'='red','A'='purple','DEP'='blue',R='grey')) +
ylab("Scale 0 to 4")
dfSub <- dfSub %>%
mutate(F1 = ifelse(F == "X", 0.33, .))
pp1 +
geom_point(data=subset(dfSub, !is.na(F1)), aes(y=F1)) +
geom_text(data = dfSub %>%
select(Date, F1) %>%
arrange(desc(Date)) %>%
slice(1),
aes(x = Date + 0.03, y = 0.33, label = "F"))