ggplot2 - выделить область между двумя geom_circle - PullRequest
2 голосов
/ 05 мая 2020

Я столкнулся с проблемой, когда мне нужно наложить слои двух графиков, представляющих собой диаграмму рассеяния и кольцевую диаграмму.

При использовании обычной кольцевой диаграммы в ggplot2 масштаб полностью изменяется, и я не могу накладывать слои диаграмма рассеяния по нему.

Мое решение состояло в том, чтобы создать два круга с помощью geom_circle и выделить / заштриховать область между кругами, однако я изо всех сил пытаюсь заставить его работать.

Это может быть не идеальное решение, поэтому мы будем очень благодарны за любые советы на данном этапе.

    #
    # load packages
    #

    library(tidyverse)        
    library(ggplot2)
    library(ggforce)


    #
    # create test data 
    #

    x <- c(5,-3,2,-1,7,-1, 4,-6)
    y <- c(3, 5,8,-2,3, 2,-7,-1)
    instance <- c('Positive','Positive','Positive','Positive','Negative', 'Negative', 'Negative','Negative')
    df <- data.frame(x, y, instance)
    df_circle_1 <- data.frame(x=0,y=0, r=5)
    df_circle_2 <- data.frame(x=0,y=0, r=7)


    #
    # create circle plot - 1
    #

    p <- ggplot() + geom_circle(data=df_circle_1, 
                                aes(x0=x,
                                    y0=y,
                                    r=r), 
                                linetype="dashed", 
                                size=1,
                                colour="darkgrey")

    #
    # add circle plot - 2
    #

    p <- p + geom_circle(data=df_circle_2, 
                                aes(x0=x,
                                    y0=y,
                                    r=r), 
                                linetype="dashed", 
                                size=1,
                                colour="darkgrey")



    #
    # add scatterplot 
    #

    p <- p + geom_point(data=df, 
                        aes(x, 
                            y, 
                            color=instance,
                            shape=instance),
                        size=3,) +

      scale_x_continuous(breaks=seq(-10, 10, by=1), limits=c(-10,10)) + 
      scale_y_continuous(breaks=seq(-10, 10, by=1), limits=c(-10,10)) +

      geom_vline(xintercept = 0, linetype = 1) +
      geom_hline(yintercept = 0, linetype = 1) +

      theme(legend.title=element_blank(), 
            panel.grid.minor = element_blank(), 
            axis.title.y=element_text(angle=360,vjust=0.5))

    #
    # display chart 
    #

    p

График, который я пытаюсь воспроизвести

enter image description here

График, созданный моим кодом

enter image description here

1 Ответ

1 голос
/ 05 мая 2020

Хакерское предложение для проблемы затенения области: заполнение большого круга зеленым, заполнение маленького круга белым и установка панели сверху:

p <- ggplot() + 
  geom_circle(data=df_circle_2, 
              aes(x0=x,
                  y0=y,
                  r=r), 
              linetype="dashed", 
              fill = "green",
              size=1,
              colour="darkgrey")+ 
  geom_circle(data=df_circle_1, 
                            aes(x0=x,
                                y0=y,
                                r=r), 
                            linetype="dashed", 
                            fill = "white",
                            size=1,
                            colour="darkgrey")+ 

  theme_bw() +theme(
  panel.ontop = TRUE,
  panel.background = element_rect(fill = NA)
)+  geom_point(data=df, 
             aes(x, 
                 y, 
                 color=instance,
                 shape=instance),
             size=3,) 
p

enter image description here

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...