Непреднамеренная линия по оси X графика плотности (r)
Я пытаюсь определить, почему у меня есть фиолетовая линия, появляющаяся вдоль оси х, того же цвета, что и "Припчан, Лида" из моей легенды. Я посмотрел на данные и не вижу там никаких проблем. Код ниже. Спасибо!
densityDoc <- 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: ")
densityDoc
1 ответ
Обычно я жду воспроизводимого примера, но в этом случае я бы сказал, что основное объяснение действительно довольно просто:
geom_density()
создает многоугольник, а не линию.
Используя образец набора данных из собственного пакета ggplot2, мы можем наблюдать ту же прямую линию под графиками плотности, охватывающую оси X и Y. Цвет линии просто зависит от того, какой сюжет находится над остальными:
p <- ggplot(diamonds, aes(carat, colour = cut)) +
geom_density()
Обходной путь 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()
Обходной путь 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()
Есть два простых обходных пути. Во-первых, если вы хотите только линии и не заполненные области, вы можете просто использовать geom_line()
со статистикой плотности:
library(ggplot2)
ggplot(diamonds, aes(x = carat, y = stat(density), colour = cut)) +
geom_line(stat = "density")
Обратите внимание, что для того, чтобы это работало, нам нужно установить 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)
Создано 2018-12-14 пакетом представлением (v0.2.1)