我目前正在使用ggplot2创建一个图表,在该图表中我需要通过点的末端连接点,类似于下面提供的示例图像:

Desired outcome example

为了说明这个问题,请考虑以下简单的代码:

library(tidyverse)

df <- data.frame(day=1:5, sales=c(10, 7, 5, 4, 3))

# Plotting
p1 <- df %>% ggplot(aes(day)) +
  geom_line(aes(y = sales), linetype = 2, linewidth = 0.25) +
  geom_point(aes(y = sales), size = 9, shape = 95) +
  
  theme_minimal()

p1

结果图如下所示:

Resulting plot

正如人们所见,这条线通过点的中心将点连接起来.

例如,虽然使用position = position_nudge可以相对于x轴"移动"线,但它并不能实现所需的结果.

p2 <- df %>% ggplot(aes(day)) +
  geom_line(aes(y = sales), linetype = 2, linewidth = 0.25, position = position_nudge(x = -0.155)) +
  geom_point(aes(y = sales), size = 9, shape = 95) +
  
  theme_minimal()

p2

Undesired outcome

关于如何连接示例图像中所示的点,您有什么建议吗?任何见解或替代方法都将受到极大的赞赏.

推荐答案

您可以使用geom_segment()来完成此操作,但您必须定义每个段的开始和结束.起始值可以是(day,sales)对,但您需要从day中减go 相关金额,才能将其放在点的左边缘.然后,您可以让直线再次延伸到lag(day)lag(sales),确保将适当的量添加到lag(day),以将线段放置在点的右边缘.我分别用了.125和.075.可能需要一些试验和错误才能找出准确的正确值.

library(tidyverse)
df <- data.frame(day=1:5, sales=c(10, 7, 5, 4, 3)) %>%
  mutate(y_start = sales, 
         y_end = lag(sales),
         x_start = day-.1, 
         x_end = lag(day) + .075) 


df %>% ggplot() +
  geom_point(aes(x=day, y = sales), size = 9, shape = 95) +
  geom_segment(aes(x=x_start, y=y_start, xend=x_end, yend = y_end), linetype=2) + 
  theme_minimal()

创建于2024-01-30,共reprex v2.0.2

R相关问答推荐

R的GG平行坐标图中的排序变量

查找满足SpatRaster中条件的单元格位置

如果列中存在相同的字符串,则对行值进行总和

整数成随机顺序与约束R?

ggplot2中的X轴显示数值,单位为百,而不是十

使用ggsankey调整Sankey图中单个 node 上的标签

如果某些列全部为NA,则更改列

如何同时从多个列表中获取名字?

R:从geom_ol()中删除轮廓并导出为pdf

用两种 colored颜色 填充方框图

用R ggplot2求上、下三角形中两个变量的矩阵热图

创建在文本字符串中发现两个不同关键字的实例的数据框

整理曲线图、曲线图和点图

每行不同列上的行求和

如何用不同长度的向量填充列表?

在GT()中的列之间添加空格

如何在矩阵图中按标准对数据进行分组以绘制矩阵

汇总数据:在跨越()all_of()Dynamic_list_of_vars=>;所选内容不能有缺失值的汇总()中出错

R data.设置函数&;连接中的列值而不使用for循环的表方法?

使用循环改进功能( struct 简单)