r - 在 R 中使用 ggplot 将移位图的点与另一个图连接起来
问题描述
我有两个数据框df1
,df2
如下所示:
> df1
dateTime value
1 1 6
2 2 2
3 3 3
4 4 1
> df2
dateTime value
1 1 3
2 2 8
3 3 4
4 4 5
我想在一张图中绘制这些数据帧,将它们分成两个具有相同x
轴的不同图,df1
向右移动 1,并将 的每个值连接df1
到 的相应值df2
。这是我的代码:
#Shift df1 by 1 to the right
df1$value <- lag(df1$value, 1)
plot1 <- df1 %>%
select(dateTime, value) %>%
ggplot(aes(dateTime, value)) +
geom_point() +
geom_line(color = "green") +
geom_segment(aes(xend = dateTime, yend = -Inf), linetype = "dashed") +
theme(axis.text=element_text(size = 14), axis.title=element_text(size = 14),
axis.title.x=element_blank(),
axis.text.x=element_blank(),
axis.ticks.x=element_blank())
plot2 <- df2 %>%
select(dateTime, value) %>%
ggplot(aes(dateTime, value)) +
geom_point() +
geom_line(color = "red") +
geom_segment(aes(xend = dateTime, yend = Inf), linetype = "dashed") +
xlab("dateTime") +
theme(axis.text=element_text(size = 14), axis.title=element_text(size = 14))
gt <- rbind(ggplotGrob(plot1), ggplotGrob(plot2), size = "last")
# Panel positioning
is_panel <- which(gt$layout$name == "panel")
panel_x <- unique(gt$layout$l[is_panel])
panel_y <- gt$layout$t[is_panel]
# Coordinates and graphical parameters for segments
x_coords <- gt$grobs[[is_panel[1]]]$children[[5]]$x0
gpar <- gt$grobs[[is_panel[1]]]$children[[5]]$gp
linkgrob <- segmentsGrob(x0 = x_coords, y0 = 0, x1 = x_coords, y1 = 1, gp = gpar)
gt <- gtable_add_grob(gt, linkgrob,
t = panel_y[1] + 1, l = panel_x, b = panel_y[2] - 1)
grid.newpage()
grid.draw(gt)
这是结果,但实际上还有一条我想删除它的附加行,而且我df1
还想显示最后一点的最后一个值没有意义:
解决方案
落后
我想这lag
可能是错误的功能:
lag(1:3)
# [1] NA 1 2
如果我对您的理解正确,您想要转移您的数据,这取决于您的真实数据,但对于这个虚拟示例,类似
df1 <- df1 %>%
mutate(dateTime = dateTime + 1)
应该做的伎俩。
线条
您需要稍微调整您的基础图:
plot1 <- df1 %>%
select(dateTime, value) %>%
## create a temp variable to which we can map the line type to
mutate(lty = ifelse(dateTime == max(dateTime), "none", "dashed")) %>%
ggplot(aes(dateTime, value)) +
geom_point() +
geom_line(color = "green") +
## map the linetype to this variable
geom_segment(aes(xend = dateTime, yend = -Inf, linetype = lty)) +
## use a manual scale to map the variable to dashed and blank linetype
scale_linetype_manual(values = c(dashed = "dashed", none = "blank"),
guide = "none") +
## add xlim to align scales properly in both plots
xlim(c(1, 5)) +
theme(axis.text=element_text(size = 14), axis.title=element_text(size = 14),
axis.title.x=element_blank(),
axis.text.x=element_blank(),
axis.ticks.x=element_blank())
plot2 <- df2 %>%
select(dateTime, value) %>%
mutate(lty = ifelse(dateTime == min(dateTime), "none", "dashed")) %>%
ggplot(aes(dateTime, value)) +
geom_point() +
geom_line(color = "red") +
geom_segment(aes(xend = dateTime, yend = Inf, linetype = lty)) +
scale_linetype_manual(values = c(dashed = "dashed", none = "blank"),
guide = "none") +
xlab("dateTime") +
xlim(c(1, 5)) +
theme(axis.text=element_text(size = 14), axis.title=element_text(size = 14))
这给了你这个情节:
推荐阅读
- r - R - 如何使用 system() 或 system2() 执行 PowerShell cmds
- java - 在没有eclipse的情况下安装Java库
- haskell - Stack 如何决定依赖关系?
- javascript - 如何在类组件中使用反应导航道具?
- angular - Angular 6:更改对象的属性并将其保存到数据库(内存中 Web API)
- sql - SSIS:合并连接/条件拆分问题
- firefox - 如何在 firefox 62.0.3 的控制台中查看 content_script 错误?
- ms-access - 使用查询 Access 2007 填充组合框的两行
- javascript - 如果消息仅以标签开头,如何使 slackbot 回复
- javascript - postMessage 期间 Microsoft Edge 中的 SCRIPT5022 语法错误