了解“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)
(这里有一个关于 mapping
和 data
的问题,但由于 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
只是简单的连接了所有的坐标,所以我们只需要提供相等数量的x
和y
参数即可。为什么在我的情况下它只适用于 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
的一个普遍特征:它非常以数据框为中心。
我从一个简单的条形图开始:
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
和 data
的问题,但由于 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
只是简单的连接了所有的坐标,所以我们只需要提供相等数量的x
和y
参数即可。为什么在我的情况下它只适用于 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
的一个普遍特征:它非常以数据框为中心。