[英]ggplot2; Adding points from a different dataset and a raster/matrix data to a plot of a spatialpolygonsdataframe
[英]Adding points from other dataset to ggplot2
關於這個主題已經有很多問題了,但我找不到一個能回答我具體問題的問題。
我有一個barplot
(見下面的testplot1
和testplot3
)繪制一個數據集(下面的bardata
),並想從另一個數據集( pointdata
)中添加點。 請參見簡化示例:
bardata <- data.frame(
xname = c(1, 1, 1, 2, 2, 2, 3, 3, 3),
yvalue = c(1, 2, 3, 2, 3, 1, 4, 2, 1),
colorname = c("a", "b", "c", "a", "b", "c", "a", "b", "c")
)
pointdata <- data.frame(
xname = c(1, 1, 3),
ypos = c(2, 4, 3),
ptyname = c("p", "q", "r")
)
testplot1 <- qplot(xname, yvalue, data= bardata, stat = "identity",
fill= factor(colorname), geom = "bar")
testplot2 <- testplot1 +
geom_point(data = pointdata, mapping =
aes(x = xname, y = ypos, shape = factor(ptyname))
)
現在testplot1
工作得很好,但testplot2
給出了錯誤
因素(顏色名稱)錯誤:未找到 object '顏色名稱'。
我不明白他為什么這么說,並且想知道,但這不是我的主要問題,因為有一個簡單的解決方法,請參見下面的testplot3
。
testplot3 <- qplot(xname, yvalue, data= bardata, stat = "identity",
fill= factor(bardata$colorname), geom = "bar")
testplot4 <- testplot3 +
geom_point(data = pointdata, mapping =
aes(x = xname, y = ypos, shape = factor(ptyname)))
現在這一次程序說:
錯誤:美學長度必須為 1,或與 dataProblems:xname、ypos、factor(ptyname) 的長度相同。
所以我的問題是:這甚至意味着什么? 顯然aes
和 data 的長度都是 3。 pointdata 中的行數少於pointdata
中的行bardata
,但這本身不是問題,例如參見這個答案: https://stackoverflow.com/a/2330825 /2298323
那么這里發生了什么? (以及如何在 plot 中獲得積分?)
問題是你在qplot
調用中為整個圖分配了fill = factor(colorname)
。
所以testplot2
也將嘗試映射colorname
到fill
的審美,但沒有colorname
列在pointdata
data.frame這就是為什么你有這樣的錯誤消息。 如果你用ggplot
重寫它,它看起來像這樣:
ggplot(bardata, aes(xname, yvalue, fill = factor(colorname))) +
geom_bar(stat = "identity")+
geom_point(data = pointdata,
mapping = aes(x = xname, y = ypos, shape = factor(ptyname)))
您需要做的是僅將映射應用於geom_bar
調用,如下所示:
ggplot(bardata, aes(xname, yvalue)) +
geom_bar(stat = "identity", aes(fill = factor(colorname)))+
geom_point(data = pointdata,
mapping = aes(x = xname, y = ypos, shape = factor(ptyname)))
是的,有時ggplot錯誤描述很難理解。 首先要注意:盡量避免使用qplot
,對於相當復雜的情節,它往往會使事情變得模糊。 你的代碼相當於
ggplot(bardata, aes(xname, yvalue, fill = factor(colorname))) +
geom_bar(stat = "identity") +
geom_point(data = pointdata, aes(x = xname, y = ypos, shape = factor(ptyname))
#Error in factor(colorname) : object 'colorname' not found
這就是問題:當你在ggplot()
(或你的情況下是qplot()
中指定aes
映射時,此設置會自動應用於任何后續geom。 您指定了x
, y
和fill
。 對於geom_bar
,一切都很好。 對於geom_point
您重寫x
和y
,但fill
仍然映射到colorname
中不存在的pointdata
,因此錯誤。
如果你混合幾個數據框,這是推薦的方法:清空ggplot()
加上每個geom的特定aes
。
ggplot() +
geom_bar(data = bardata, aes(xname, yvalue, fill = factor(colorname)), stat = "identity") +
geom_point(data = pointdata, aes(xname, ypos, shape = factor(ptyname)))
另一種解決方案是將 inherit.aes=FALSE 添加到 geom_point 調用中。 然后分別確定點的美學。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.