理解`geom_path`和类似函数中的坐标参数

时间:2015-01-06 09:33:28

标签: r ggplot2

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

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)

(这是关于mapping vs data的问题,但我现在感谢大卫的评论。我应该分别将这两个问题分开,抱歉乱七八糟)

然后,如果我尝试添加一两个点,这不再适用了:

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个小组?

2 个答案:

答案 0 :(得分:2)

似乎问题与你将三行数据框放在顶层&#39;在ggplot。当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

当你第一次尝试使用&#34; df&#34;在顶层,geom_path中的点数是&#34; df&#34;中行数的倍数。因此,用&#34; df&#34;在顶层,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的一般特征:它以数据框为中心。

答案 1 :(得分:0)

我发现了我的错误:如果没有覆盖data,我们的mapping会使用原始数据框的维度。所以,就我而言,我需要明确地将路径的坐标放在data