了解“geom_path”和类似函数中的坐标参数

Understanding coordinates arguments in `geom_path` and similar functions

我从一个简单的条形图开始:

df <- data.frame(xpos=c(200,300,400),
                 ypos=c(  1,  3,  2))
gp <- ggplot(df, aes(x=xpos, y=ypos)) +
  geom_bar(stat="identity")

然后想根据点的坐标添加自定义多线(假设这些坐标完全是自定义的,与条形图数据无关)。 3点效果很好:

gp + geom_path(mapping=aes(x=c(200, 200, 300), 
                           y=c(1.5,   2,   2)), 
               size=1.2)

(这里有一个关于 mappingdata 的问题,但由于 David 的评论,我现在明白了。我应该把这两个问题分开,抱歉乱)

然后,如果我再尝试添加一两个点,这将不再有效:

gp + geom_path(mapping=aes(x=c(200, 200, 300, 300), 
                           y=c(1.5,   2,   2,  1)), 
               size=1.2)
# Error in data.frame(x = c(200, 200, 300, 300), y = c(1.5, 2, 2, 1), PANEL = c(1L,  : 
# arguments imply differing number of rows: 4, 3

为什么它把我的数据减少到 3?与 5 点相同,但 6 点再次确定:

gp + geom_path(mapping=aes(x=c(200, 200, 300, 300, 100, 150), 
                           y=c(1.5,   2,   2,  1,  1.5, 1.8)), 
               size=1.2)

我以为geom_path只是简单的连接了所有的坐标,所以我们只需要提供相等数量的xy参数即可。为什么在我的情况下它只适用于 3 人一组?

我发现了我的错误:在没有覆盖 data 的情况下,我们的 mapping 使用了原始数据框的维度。因此,就我而言,我需要明确地将我的路径坐标放入 data.

看来问题与你在ggplot中的'top level'中放置了三行数据框有关。当 geom_path 数据中的点数不是数据框中行数的倍数时(例如 4 对 3),就会发生错误,因为在某些时候 ggplot 试图将数据到一个数据帧。

一种可能的解决方法是将 geom_bar 的数据从 ggplot 移动到 geom_bar:

gp <- ggplot() +
  geom_bar(data = df, aes(x = xpos, y = ypos), stat = "identity") +
  geom_path(mapping = aes(x = c(200, 200, 300, 300),
                          y = c(1.5,   2,   2,  1)))              
gp 

如果您查看用于渲染绘图的数据,您会发现它位于两个单独的数据框中:

str(ggplot_build(gp)$data)
# List of 2
# $ :'data.frame':  3 obs. of  8 variables: <~~ this is the data for the bars
# ..$ x    : num [1:3] 200 300 400
# ..$ y    : num [1:3] 1 3 2
# ..$ PANEL: int [1:3] 1 1 1
# ..$ group: int [1:3] 1 1 1
# ..$ ymin : num [1:3] 0 0 0
# ..$ ymax : num [1:3] 1 3 2
# ..$ xmin : num [1:3] 155 255 355
# ..$ xmax : num [1:3] 245 345 445
# $ :'data.frame':  4 obs. of  4 variables: <~~ this is the data for the path
#   ..$ x    : num [1:4] 200 200 300 300
# ..$ y    : num [1:4] 1.5 2 2 1
# ..$ PANEL: num [1:4] 1 1 1 1
# ..$ group: int [1:4] 1 1 1 1

第一次尝试时也是这种情况,"df" 在顶层,geom_path 中的点数是 [= 中行数的倍数32=]。因此,在顶层 "df" 中,ggplot 尝试在某个时候将数据组合到一个数据帧,然后为每一层渲染具有单独数据帧的图。

gp <- ggplot(df, aes(x = xpos, y = ypos)) +
  geom_bar(stat = "identity") +
  geom_path(mapping = aes(x = c(200, 200, 300, 300, 100, 150),
                          y = c(1.5,   2,   2,  1,  1.5, 1.8)))
str(ggplot_build(gp)$data)

这凸显了ggplot的一个普遍特征:它非常以数据框为中心。