我从一个简单的条形图开始:
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
只是连接所有坐标,所以我们只需要提供相同数量的x
和y
参数。为什么在我的情况下它仅适用于3个小组?
答案 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
。