Как создать процентную форму с помощью ggplot - PullRequest
2 голосов
/ 17 января 2020

Есть ли способ, которым я мог бы сделать построенный в процентах график со слоем ggplot2 geom_rect()? У меня есть координаты, поэтому я создаю форму, у меня также есть моя переменная разделения t, теперь я хотел бы заполнить форму, основываясь на вхождении t. Другими словами, я хотел бы сделать столбчатую диаграмму с процентами, но вместо диаграммы пользовательскую форму (в моем случае, простые прямоугольники). Я много экспериментировал с position="fill", stat="identity" и их разновидностями, но безуспешно. Интересно, возможно ли это, и если да, то как я могу этого достичь?

df <- structure(list(x1 = c(4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 
3, 3), x2 = c(6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 4, 4, 4, 4, 4), y1 = c(3, 
3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1), y2 = c(5, 5, 5, 5, 
5, 5, 5, 5, 5, 5, 2, 2, 2, 2, 2), t = structure(c(1L, 1L, 1L, 
1L, 1L, 1L, 1L, 2L, 2L, 2L, 1L, 2L, 2L, 1L, 1L), .Label = c("a", 
"b"), class = "factor")), row.names = c("1", "2", "3", "4", "5", 
"6", "7", "8", "9", "10", "11", "12", "13", "14", "15"), class = "data.frame")

library(ggplot2)
ggplot() + 
    geom_rect(data=d, mapping=aes(xmin=x1, xmax=x2, ymin=y1, ymax=y2, fill = t))

ожидаемый результат enter image description here

Спасибо за потраченное время!

1 Ответ

3 голосов
/ 17 января 2020

Вот рабочий код для желаемого графика, потребовалось некоторое кодирование с использованием dplyr, но это сработало.

library(ggplot2)
library(tidyverse)

df1<-df %>%
  group_by(x1,y1,x2,y2,t) %>%
  count() %>% 
  ungroup() %>%
  group_by(x1,y1) %>%
  mutate(perc = n / sum(n),
         percLabel = paste(100 * perc,"%",sep = " "),
         transf = abs(x2-x1) * perc,
         newx1 = ifelse(t == "a", x1,x2-transf),
         newx2 = ifelse(t == "a", x1+transf,x2)) 


ggplot(df1,aes(xmin = newx1, 
               xmax = newx2, 
               ymin = y1, 
               ymax = y2, 
               fill = t)) + 
  geom_rect(col = "black") + 
  geom_text(aes(x = newx1 + ((newx2 - newx1)/2), 
                              y = y1 + ((y2 - y1)/2), 
                              label = percLabel)) + 
  labs(x="X",y="Y")

plot

...