Непреднамеренная линия по оси X графика плотности (r)

Я пытаюсь определить, почему вдоль оси X появляется фиолетовая линия того же цвета, что и «Припчан, Лида» из моей легенды. Я посмотрел на данные и не вижу там никаких проблем.

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: ")

Анализ LOS по документу


person Luke Baker    schedule 01.04.2018    source источник
comment
Добро пожаловать в переполнение стека! В нынешнем виде этот вопрос не по теме, поскольку он просит помощи в отладке без воспроизводимого примера. Соберите минимальный, полный и поддающийся проверке пример и отредактируйте свой вопрос, чтобы включить его. Вот несколько конкретных советов по R: stackoverflow.com/questions/5963269/   -  person De Novo    schedule 01.04.2018


Ответы (2)


Обычно я ждал воспроизводимого примера, но в этом случае я бы сказал, что основное объяснение действительно довольно простое:

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()

график с фреймом данных из исходного графика

person Z.Lin    schedule 02.04.2018
comment
Большое спасибо. Это мой первый пост о стеке, и в будущем я приведу воспроизводимый пример. Ваши обходные пути сработали отлично! - person Luke Baker; 03.04.2018
comment
Другой обходной путь — geom_density_line() из пакета ggridges. Я написал это, потому что устал искать обходные пути для этой проблемы. stackoverflow.com/a/53773892/4975218 - person Claus Wilke; 14.12.2018
comment
Или просто используйте geom_line() с stat = "density", если вам не нужна заполненная область. - person Claus Wilke; 14.12.2018

Есть два простых обходных пути. Во-первых, если вам нужны только линии, а не закрашенные области, вы можете просто использовать 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)

Создано 14 декабря 2018 г. с помощью пакета reprex (v0.2.1)

person Claus Wilke    schedule 14.12.2018