在R中具有ggplot的连接点

在R中具有ggplot的连接点,r,ggplot2,R,Ggplot2,我正在寻找一种在R中使用ggplot连接一些点的方法。我想将每个点连接到最近的点。这是我的数据的散点图 x <- c(0.81,0.82,0.82,0.82,0.83,0.83,0.83,0.84,0.84,0.84,0.85,0.85,0.85,0.86,0.86,0.86,0.87,0.87,0.87,0.88,0.88,0.88,0.89,0.89,0.89,0.9,0.9,0.9,0.91,0.91,0.91,0.92,0.92,0.92,0.93,0.93,0.93,0.93,0

我正在寻找一种在R中使用ggplot连接一些点的方法。我想将每个点连接到最近的点。这是我的数据的散点图

x <- c(0.81,0.82,0.82,0.82,0.83,0.83,0.83,0.84,0.84,0.84,0.85,0.85,0.85,0.86,0.86,0.86,0.87,0.87,0.87,0.88,0.88,0.88,0.89,0.89,0.89,0.9,0.9,0.9,0.91,0.91,0.91,0.92,0.92,0.92,0.93,0.93,0.93,0.93,0.93,0.94,0.94,0.94,0.94,0.94,0.95,0.95,0.95,0.95,0.95,0.96,0.96,0.96,0.96,0.96,0.97,0.97,0.97,0.97,0.97,0.98,0.98,0.98,0.98,0.98,0.99,0.99,0.99,0.99,1,1,1,1,1.01,1.01,1.01,1.01,1.02,1.02,1.02,1.02,1.03,1.03,1.03,1.03,1.04,1.04,1.04,1.04,1.05,1.05,1.05,1.05,1.06,1.06,1.06,1.06,1.07,1.07,1.07,1.07,1.08,1.08,1.08,1.08,1.09,1.09,1.09,1.09,1.1,1.1,1.1,1.1,1.11,1.11,1.11,1.11,1.12,1.12,1.12,1.12,1.13,1.13,1.13,1.13,1.14,1.14,1.15,1.15,1.16,1.16,1.17,1.17,1.18,1.18,1.19,1.19,1.2,1.2,1.21,1.21,1.22,1.22,1.23,1.23,1.24,1.24,1.25,1.25,1.26,1.26,1.27)

y <- c(-1.295,-0.535,-1.575,-1.295,-0.525,-1.575,-1.295,-0.515,-1.575,-1.285,-0.515,-1.575,-1.285,-0.505,-1.575,-1.275,-0.495,-1.575,-1.275,-0.485,-1.575,-1.265,-0.485,-1.575,-1.265,-0.475,-1.575,-1.255,-0.465,-1.575,-1.255,-0.455,-1.575,-1.245,-0.445,1.285,1.545,-1.575,-1.245,-0.435,1.165,1.675,-1.575,-1.235,-0.425,1.085,1.765,-1.575,-1.235,-0.405,1.015,1.845,-1.575,-1.225,-0.395,0.965,1.905,-1.575,-1.215,-0.385,0.915,1.965,-1.575,-1.215,-0.375,0.865,-1.575,-1.205,-0.355,0.825,-1.575,-1.205,-0.345,0.785,-1.565,-1.195,-0.325,0.745,-1.565,-1.185,-0.305,0.705,-1.565,-1.185,-0.285,0.665,-1.565,-1.175,-0.265,0.625,-1.565,-1.165,-0.245,0.585,-1.565,-1.165,-0.225,0.545,-1.565,-1.155,-0.195,0.495,-1.555,-1.145,-0.165,0.455,-1.555,-1.145,-0.135,0.405,-1.555,-1.135,-0.0849999999999999,0.345,-1.555,-1.125,-0.035,0.275,-1.545,-1.115,0.0850000000000001,0.145,-1.545,-1.115,-1.545,-1.105,-1.545,-1.095,-1.535,-1.085,-1.535,-1.085,-1.535,-1.075,-1.525,-1.065,-1.525,-1.055,-1.525,-1.045,-1.515,-1.045,-1.515,-1.035,-1.505,-1.025,-1.505,-1.015,-1.495,-1.005,-1.495)

example_df <- tibble(x = x, y = y)

ggplot(example_df, aes(x = x, y = y)) + 
  geom_point()

geom_线的默认行为是根据坐标在数据框中的显示顺序连接坐标。根据点之间的欧几里德距离,有没有一种简单的方法来连接点

这是你所问问题的一个解决方案,尽管我怀疑这不是你真正想要的,但它可能会有所帮助

distmat <- as.matrix(dist(example_df))    #matrix of Euclidean distances between rows
diag(distmat) <- Inf                      #remove zeros on diagonal
nearest <- apply(distmat, 1, which.min)   #find index of nearest point to each point
example_df$xend <- example_df$x[nearest]  #set end point of segment from each point
example_df$yend <- example_df$y[nearest]

ggplot(example_df, aes(x = x, y = y, xend = xend, yend = yend)) + 
  geom_point() +
  geom_segment(colour = "blue")

另一个答案——这将适用于这些数据,但不是一般情况

example_df$group <- cut(example_df$y, 
                        breaks = c(Inf, -0.8, -1.4, -Inf))     #breaks determined 'by eye'
example_df <- example_df[order(example_df$y), ]                #sort by y
ggplot(example_df, aes(x = x, y = y, group = group)) + 
  geom_point() +
  geom_path(colour = "blue")

这与Andrew Gustar的不同之处在于如何区分这三条路径。我希望这是一个更具可伸缩性的过程,所以我尝试使用层次聚类,根据点之间的距离将点分为3个簇。在这种情况下,它们很容易分离;对于其他数据,这可能更加棘手,您可能需要不同的聚类算法。然后根据另一个答案+1,按y值排列每个簇,以获得按正确顺序绘制的路径

图书馆弹琴 图书馆GGPLOT2
这有帮助,但我希望连接所有的点。理想情况下,我想使用geom_path和一个分组变量。为什么有些点之间会有间隙?看看代码,我不明白为什么会这样happen@camille这只是连接到最近的点。如果A离B最近,B离A最近,那么B将不会连接到C,即使这看起来像是视觉上合理的下一步。对于沿着三个可感知的点序列的连续线,其中一些点需要连接到第二个最近的点,或者可以想象,甚至更远的点。我认为这是一个非常重要的问题!我认为解决方案可能涉及在选择最近点的每一步从候选点集中迭代移除点。例如,如果选择B作为与A最近的点,则在查找与B最近的点时,A不应作为选项。您是对的,这可能是一个非常重要的问题!在你的全部问题中,你会有什么方法来标记一个点属于哪一组,还是这是问题的一部分?就像在本例中,会有3个组,因为我假设您期望有3条路径通过这些点轨迹。这解决了提示中所述的问题。如果能够连接点而不必在y轴上的拆分处进行分组,那就太好了。这种解决方案不适用于点组不能被水平线分开的情况。希望有人会开发一个包,将此功能添加到ggplot。以前没有考虑过基于集群的解决方案。这是有用的。