簡體   English   中英

將其他數據集中的點添加到 ggplot2

[英]Adding points from other dataset to ggplot2

關於這個主題已經有很多問題了,但我找不到一個能回答我具體問題的問題。

我有一個barplot (見下面的testplot1testplot3 )繪制一個數據集(下面的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也將嘗試映射colornamefill的審美,但沒有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。 您指定了xyfill 對於geom_bar ,一切都很好。 對於geom_point您重寫xy ,但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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM