Линия в верхней части графика плотности ребер обрезана - PullRequest
0 голосов
/ 27 апреля 2018

Почему верхняя часть участка обрезана и как это исправить? Я увеличил поля, и это не имело никакого значения.

enter image description here

См. Кривую за 1854 год, самый верх левого горба. Похоже, линия тоньше в верхней части горба. Для меня изменение размера на 0,8 не помогает.

Это код, необходимый для создания этого примера:

library(tidyverse)
library(ggridges)

t2 <-   structure(list(Date = c("1853-01", "1853-02", "1853-03", "1853-04", 
                                "1853-05", "1853-06", "1853-07", "1853-08", "1853-09", "1853-10", 
                                "1853-11", "1853-12", "1854-01", "1854-02", "1854-03", "1854-04", 
                                "1854-05", "1854-06", "1854-07", "1854-08", "1854-09", "1854-10", 
                                "1854-11", "1854-12"), t = c(-5.6, -5.3, -1.5, 4.9, 9.8, 17.9, 
                                                             18.5, 19.9, 14.8, 6.2, 3.1, -4.3, -5.9, -7, -1.3, 4.1, 10, 16.8, 
                                                             22, 20, 16.1, 10.1, 1.8, -5.6), year = c("1853", "1853", "1853", 
                                                                                                      "1853", "1853", "1853", "1853", "1853", "1853", "1853", "1853", 
                                                                                                      "1853", "1854", "1854", "1854", "1854", "1854", "1854", "1854", 
                                                                                                      "1854", "1854", "1854", "1854", "1854")), row.names = c(NA, -24L
                                                                                                      ), class = c("tbl_df", "tbl", "data.frame"), .Names = c("Date", 
                                                                                                                                                              "t", "year"))

# Density plot -----------------------------------------------
jj <- ggplot(t2, aes(x = t, y = year)) +
  stat_density_ridges(
    geom = "density_ridges_gradient",
    quantile_lines = TRUE,
    size = 1,
    quantiles = 2) +
  theme_ridges() +
  theme(
    plot.margin = margin(t = 1, r = 1, b = 0.5, l = 0.5, "cm") 
  )


# Build ggplot and extract data
d <- ggplot_build(jj)$data[[1]]

# Add geom_ribbon for shaded area
jj +
  geom_ribbon(
    data = transform(subset(d, x >= 20), year = group),
    aes(x, ymin = ymin, ymax = ymax, group = group),
    fill = "red",
    alpha = 0.5) 

Ответы [ 2 ]

0 голосов
/ 05 мая 2018

Некоторые комментаторы говорят, что они не могут воспроизвести эту проблему, но она действительно существует. Проще увидеть, увеличим ли мы размер строки:

library(ggridges)
library(ggplot2)
ggplot(iris, aes(x = Sepal.Length, y = Species)) + 
  geom_density_ridges(size = 2)

enter image description here

Это свойство того, как ggplot расширяет дискретные масштабы. Линия плотности выходит за пределы нормального аддитивного значения расширения, которое использует ggplot (величина которого представляет собой расстояние от базовой линии "setosa" до оси x). В этой ситуации ggplot расширяет ось дальше, но только точно до максимальной точки данных. Таким образом, половина линии проходит за область графика в этой максимальной точке, и эта половина обрезается.

В готовящемся выпуске ggplot2 2.3.0 (доступном в настоящее время через github) появятся два новых способа решения этой проблемы. Во-первых, вы можете установить clip = "off" в системе координат, чтобы линия могла выходить за пределы диапазона графика:

ggplot(iris, aes(x = Sepal.Length, y = Species)) + 
  geom_density_ridges(size = 2) +
  coord_cartesian(clip = "off")

enter image description here

Во-вторых, вы можете отдельно расширить нижнюю и верхнюю часть шкалы. Для дискретных шкал я предпочитаю аддитивное расширение, и я думаю, что в этом случае мы хотим сделать нижнее значение меньшим, чем значение по умолчанию, но верхнее значение немного больше:

ggplot(iris, aes(x = Sepal.Length, y = Species)) + 
  geom_density_ridges(size = 2) +
  scale_y_discrete(expand = expand_scale(add = c(0.2, 1.5)))

enter image description here

0 голосов
/ 28 апреля 2018

Добавление

scale_y_discrete(expand = c(0.01, 0))

сделал свое дело.

...