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

LOS Анализ Док

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

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)

Другие вопросы по тегам