簡體   English   中英

添加第二個密度圖會取消第一個直方圖中的分箱

[英]Adding second density plot undoes binning in first histogram plot

我在將第二個密度圖添加到現有密度 + 直方圖 ggplot 時遇到了一些問題。 也就是說,當我從另一個數據源添加第二個密度圖時,它會改變第一個圖的直方圖中的 bin 數量。

這是玩具數據/情節來說明我的問題

# data
df <- data.frame(var1=rnorm(1e4,0,1), var2=rnorm(1e4,5,1))

# create plot function
plotFunct <- function(data, varName, nBins) {
  p <- ggplot(data, aes_string(x=varName)) + 
              geom_histogram(aes(y=..density..), bins = nBins, fill = "white", colour = "black") +
              geom_density(fill = "#FF6666", alpha = .3)
  return(p)
}

# Now we run the function specifying 40 bins
p <- plotFunct(df, "var1", 40) 
p

在此處輸入圖片說明

所以一切正常。

接下來創建要添加到第一個圖形的第二個數據集...

outsideData <- data.frame(outside = rnorm(1e5, -2, 25))

...並將其添加到第一個圖中。 此數據具有更廣泛的傳播范圍,因此為了使圖形更易於理解,我們將使用coord_cartesian()函數將其限制在預先指定的范圍內

p2 <- p + geom_density(data = outsideData, aes(x=outside), colour = "green") + coord_cartesian(xlim = c(-5,5))

p2

在此處輸入圖片說明

第二個密度圖是綠色的。 請注意,添加的結果是第一個密度圖中的直方圖只有一個 bin,而不是我們最初指定的 40 個 bin。 不知何故,第二個密度圖的添加影響了第一個的分箱。 但是,原始圖的密度部分似乎不受影響。

誰能啟發我如何恢復到原始直方圖?

不知道為什么會發生這種情況,但這里有一個可能的旁路。 事實證明,使用binwidth而不是bins時不會發生您描述的行為。 因此,一種方法是根據所需的 bin 數量預先計算合適的 bin 寬度:

library(ggplot2)
library(ggplot2)

# data
df <- data.frame(var1 = rnorm(1e4, 0, 1), var2 = rnorm(1e4, 5, 1))

# create plot function
plotFunct <- function(data, varName, nBins) {
  vn <- as.name(varName)
  cuts <- pretty(data[,varName], nBins)
  binWidth <- abs(cuts[1]-cuts[2])
  cat("using ", nBins, "bins converted into binwidth", binWidth, "\n\n")
  p <- ggplot(data) +
    geom_histogram(
      aes(x = !!vn, y = ..density..),
      binwidth = binWidth,
      fill = "white",
      colour = "black"
    ) +
    geom_density(aes(x=!!vn), fill = "#FF6666", alpha = .3)
  return(p)
}

# Now we run the function specifying 40 bins
p <- plotFunct(df, "var1", 40)
p

outsideData <- data.frame(outside = rnorm(1e5,-2, 25))

p2 <-
  p + geom_density(
    inherit.aes = FALSE,
    data = outsideData,
    aes(x = outside),
    colour = "green"
  ) + coord_cartesian(xlim = c(-5, 5))

p2

應該制作這個情節:

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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