Luk*_*ker 4 r ggplot2 density-plot
我试图找出为什么沿 x 轴出现一条紫色线,该线与我的图例中的“Prypchan,Lida”颜色相同。我查看了数据,没有发现任何问题。
ggplot(LosDoc_Ex, aes(x = LOS)) +
geom_density(aes(colour = AttMD)) +
theme(legend.position = "bottom") +
xlab("Length of Stay") +
ylab("Distribution") +
labs(title = "LOS Analysis * ",
caption = "*exluding Residential and WSH",
color = "Attending MD: ")
Run Code Online (Sandbox Code Playgroud)

通常我会等待一个可重现的示例,但在这种情况下,我想说底层的解释确实非常简单:
geom_density()创建一个多边形,而不是一条线。
使用 ggplot2 自己的包中的示例数据集,我们可以观察密度图下方的相同直线,覆盖 x 轴和 y 轴。线条的颜色仅取决于哪个图位于其余图之上:
p <- ggplot(diamonds, aes(carat, colour = cut)) +
geom_density()
Run Code Online (Sandbox Code Playgroud)
解决方法 1:您可以自己手动计算新数据框中每个颜色组的密度值,并使用geom_line()以下命令绘制结果geom_density():
library(dplyr)
library(tidyr)
library(purrr)
diamonds2 <- diamonds %>%
nest(-cut) %>%
mutate(density = map(data, ~density(.x$carat))) %>%
mutate(density.x = map(density, ~.x[["x"]]),
density.y = map(density, ~.x[["y"]])) %>%
select(cut, density.x, density.y) %>%
unnest()
ggplot(diamonds2, aes(x = density.x, y = density.y, colour = cut)) +
geom_line()
Run Code Online (Sandbox Code Playgroud)
解决方法 2:或者您可以获取原始绘图生成的数据,并使用绘制该geom_line()数据。不过,颜色需要重新映射到图例值:
lp <- layer_data(p)
if(is.factor(diamonds$cut)) {
col.lev = levels(diamonds$cut)
} else {
col.lev = sort(unique(diamonds$cut))
}
lp$cut <- factor(lp$group, labels = col.lev)
ggplot(lp, aes(x = x, y = ymax, colour = cut)) +
geom_line()
Run Code Online (Sandbox Code Playgroud)
有两个简单的解决方法。首先,如果您只想要线条而不需要填充区域,则可以简单地使用geom_line()密度统计数据:
library(ggplot2)
ggplot(diamonds, aes(x = carat, y = stat(density), colour = cut)) +
geom_line(stat = "density")
Run Code Online (Sandbox Code Playgroud)

请注意,为了使其发挥作用,我们需要将y美学设置为stat(density)。
其次,如果您希望填充线条下方的区域,可以使用geom_density_line()ggridges 包。它的工作原理与此完全相同geom_density(),但绘制的是一条线(下面有填充区域)而不是多边形。
library(ggridges)
ggplot(diamonds, aes(x = carat, colour = cut, fill = cut)) +
geom_density_line(alpha = 0.2)
Run Code Online (Sandbox Code Playgroud)

由reprex 包(v0.2.1)于 2018-12-14 创建