我在将第二个密度图添加到现有的密度+直方图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。不知何故,第二个密度图的添加影响了第一个密度图的合并。但是,原始图的密度部分似乎不受影响。
谁能启发我如何还原为原始直方图?
答案 0 :(得分:1)
不知道为什么会发生这种情况,但这是可能的绕过。事实证明,使用binwidth
而不是bins
时,不会发生您描述的行为。因此,一种方法是根据所需的箱数预先计算合适的箱宽度:
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
应该绘制该图: