R - ggplot2: область тени под кривой на основе категорий данных - PullRequest
2 голосов
/ 23 марта 2019

У меня есть этот фрейм данных df:

         POFD       POD
1  0.00000000 0.1666667
2  0.01449275 0.1666667
3  0.02898551 0.1666667
4  0.02898551 0.3333333
5  0.04347826 0.3333333
6  0.05797101 0.3333333
7  0.07246377 0.3333333
8  0.08695652 0.3333333
9  0.08695652 0.5000000
10 0.10144928 0.5000000
11 0.10144928 0.6666667
12 0.10144928 0.8333333
13 0.11594203 0.8333333
14 0.13043478 0.8333333
15 0.14492754 0.8333333
16 0.15942029 0.8333333
17 0.31884058 0.8333333
18 0.33333333 0.8333333
19 0.34782609 0.8333333
20 0.34782609 1.0000000
21 0.40579710 1.0000000
22 0.42028986 1.0000000
23 0.43478261 1.0000000
24 0.44927536 1.0000000
25 0.46376812 1.0000000

Я строю сюжет POFD ~ POD. На графике цвета точек соответствуют их уровню в POD. Первая проблема заключается в том, что я хочу закрасить область под каждым сегментом тем же цветом, что и точки сегмента. Я пытался применить решение, предложенное в этом вопросе . Но это не работает. Затененная область всех сегментов выделена серым цветом. Вторая проблема заключается в том, что я попытался определить цвета с помощью моей переменной cols, но цвета не меняются. Вот мой код:

df$fCategory <- factor(POD)
n.fCategory  <- length(unique(POD))
cols <- brewer.pal(n.fCategory, "Set3")
p.roc <- ggplot(data = df, mapping = aes(x = POFD, y = POD, colour = fCategory)) + 
         geom_line(color=rgb(0,0,0, alpha=0.5), size = 1) +
         geom_point(size=4, alpha=0.5) +
         scale_colour_discrete(drop=TRUE, 
                               limits = levels(df$fCategory)) +
         geom_ribbon(aes(x = POFD, ymax = POD), ymin=0, alpha=0.3) +
         scale_fill_manual(values = cols) +
         theme_bw() + theme(panel.border = element_blank(), panel.grid.major = element_blank(),
              panel.grid.minor = element_blank(), axis.line = element_line(colour = "black"))

Спасибо за вашу помощь enter image description here.

Ответы [ 2 ]

3 голосов
/ 23 марта 2019

Полигоны имеют два цветовых свойства: color (для цвета контура) и fill (для цвета интерьера). Эти цвета могут быть разными, и вы должны указать оба явно.


library("tidyverse")

df <- structure(list(POFD = c(
  0, 0.01449275, 0.02898551, 0.02898551,
  0.04347826, 0.05797101, 0.07246377, 0.08695652, 0.08695652, 0.10144928,
  0.10144928, 0.10144928, 0.11594203, 0.13043478, 0.14492754, 0.15942029,
  0.31884058, 0.33333333, 0.34782609, 0.34782609, 0.4057971, 0.42028986,
  0.43478261, 0.44927536, 0.46376812
), POD = c(
  0.1666667, 0.1666667,
  0.1666667, 0.3333333, 0.3333333, 0.3333333, 0.3333333, 0.3333333,
  0.5, 0.5, 0.6666667, 0.8333333, 0.8333333, 0.8333333, 0.8333333,
  0.8333333, 0.8333333, 0.8333333, 0.8333333, 1, 1, 1, 1, 1, 1
)), row.names = c(
  NA,
  -25L
), class = c("tbl_df", "tbl", "data.frame"))


df <- df %>%
  mutate(category = factor(POD))

ggplot(data = df,
       mapping = aes(x = POFD, y = POD,
                     colour = category, fill = category)) +
  geom_point(size=4, alpha=0.5) +
  geom_ribbon(aes(x = POFD, ymax = POD), ymin=0, alpha=0.3)

Создано в 2019-03-23 ​​пакетом представ. (v0.2.1)

1 голос
/ 23 марта 2019

Вот одна идея. Мы можем преобразовать точки в полигоны как объект sf, а затем использовать ggplot и geom_sf для построения графика данных. Для этого подхода требуется пакет tidyverse и sf для создания пространственных данных.

library(tidyverse)
library(sf)

# Split the data frame based on POD
df_list1 <- df %>% split(f = .$POD) 

# Change POD to be 0, and reverse the order of POFD
df_list2 <- df_list1 %>% map(~mutate(.x, POD = 0) %>% arrange(desc(POFD)))

# Combine df_list1 and df_list2
df_sfc <- map2(df_list1, df_list2, bind_rows) %>%
  # Repeat the first row of each subset
  # After this step, the points needed to create a polygons are ready
  map(~slice(.x, c(1:nrow(.x), 1))) %>%
  # Create polygons as sfg object
  map(~st_polygon(list(as.matrix(.x)))) %>%
  # Convert to sfc object
  st_sfc() 

# Create nested df2 and add df_sfc as the geometry column
# df2 is an sf object
df2 <- df %>%
  mutate(POD = as.factor(POD)) %>%
  group_by(POD) %>%
  nest() %>%
  mutate(geometry = df_sfc)

# Use ggplot and geom_sf to plot df2 with fill = POD
ggplot(df2) + geom_sf(aes(fill = POD))

enter image description here

И мы можем изменить цвет заливки с помощью scale_fill_brewer, если захотим.

ggplot(df2) +
  geom_sf(aes(fill = POD)) +
  scale_fill_brewer(type = "qual", palette = "Set3")

enter image description here

DATA

df <- read.table(text = "         POFD       POD
1  0.00000000 0.1666667
                 2  0.01449275 0.1666667
                 3  0.02898551 0.1666667
                 4  0.02898551 0.3333333
                 5  0.04347826 0.3333333
                 6  0.05797101 0.3333333
                 7  0.07246377 0.3333333
                 8  0.08695652 0.3333333
                 9  0.08695652 0.5000000
                 10 0.10144928 0.5000000
                 11 0.10144928 0.6666667
                 12 0.10144928 0.8333333
                 13 0.11594203 0.8333333
                 14 0.13043478 0.8333333
                 15 0.14492754 0.8333333
                 16 0.15942029 0.8333333
                 17 0.31884058 0.8333333
                 18 0.33333333 0.8333333
                 19 0.34782609 0.8333333
                 20 0.34782609 1.0000000
                 21 0.40579710 1.0000000
                 22 0.42028986 1.0000000
                 23 0.43478261 1.0000000
                 24 0.44927536 1.0000000
                 25 0.46376812 1.0000000",
                 header = TRUE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...