Гистограмма, представляющая долю разных групп на другом графике с помощью ggplot - PullRequest
0 голосов
/ 05 августа 2020

Я хотел бы создать несколько штриховых диаграмм, где я бы представлял 4 разные категории, которые сами по себе распространяются на 4 другие категории.

У меня есть этот пример df:

structure(list(type = c("NE18", "NE18", "NE18", "NE18", "NE18", 
"NE18", "NE18", "NE18", "NE18", "NE18", "NE18", "NE18", "NE18", 
"NE18", "NE18", "NE18", "NE18", "NE18", "NE18", "NE18", "NE18", 
"NE18", "NE18", "NE18", "NE18", "NE21", "NE21", "NE21", "NE21", 
"NE21", "NE21", "NE21", "NE21", "NE21", "NE21", "NE21", "NE21", 
"NE21", "NE21", "NE21", "NE21", "NE21", "NE21", "NE21", "NE21", 
"NE21", "NE21", "NE21", "NE21", "NE21", "NA", "NA", "NA", "NA", 
"NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", 
"NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "SA", 
"SA", "SA", "SA", "SA", "SA", "SA", "SA", "SA", "SA", "SA", "SA", 
"SA", "SA", "SA", "SA", "SA", "SA", "SA", "SA", "SA", "SA", "SA", 
"SA", "SA"), score = c("R score = 0.96", "R score = 0.96", "R score = 0.96", 
"R score = 0.96", "R score = 0.96", "R score = 0.96", "R score = 0.96", 
"0.9 > R score >= 0.8", "R score = 0.96", "R score = 0.96", "R score = 0.96", 
"R score = 0.96", "R score = 0.96", "R score = 0.96", "R score = 0.96", 
"0.5 > R score >= 0.2", "R score = 0.96", "R score = 0.96", "R score = 0.96", 
"0.5 > R score >= 0.2", "R score = 0.96", "R score = 0.96", "R score = 0.96", 
"R score = 0.96", "R score = 0.96", "R score = 0.96", "R score = 0.96", 
"R score = 0.96", "R score = 0.96", "R score = 0.96", "R score = 0.96", 
"R score = 0.96", "0.9 > R score >= 0.8", "R score = 0.96", "R score = 0.96", 
"R score = 0.96", "R score = 0.96", "R score = 0.96", "R score = 0.96", 
"R score = 0.96", "0.5 > R score >= 0.2", "R score = 0.96", "R score = 0.96", 
"R score = 0.96", "0.5 > R score >= 0.2", "R score = 0.96", "R score = 0.96", 
"R score = 0.96", "R score = 0.96", "R score = 0.96", "R score = 0.96", 
"R score = 0.96", "R score = 0.96", "0.8 > R score >= 0.7", "R score = 0.96", 
"R score = 0.96", "R score = 0.96", "0.9 > R score >= 0.8", "R score = 0.96", 
"R score = 0.96", "R score = 0.96", "R score = 0.96", "R score = 0.96", 
"R score = 0.96", "R score = 0.96", "R score = 0.96", "R score = 0.96", 
"R score = 0.96", "R score = 0.96", "R score = 0.96", "R score = 0.96", 
"R score = 0.96", "R score = 0.96", "R score = 0.96", "R score = 0.96", 
"R score = 0.96", "R score = 0.96", "R score = 0.96", "R score = 0.96", 
"R score = 0.96", "R score = 0.96", "0.8 > R score >= 0.7", "R score = 0.96", 
"0.8 > R score >= 0.7", "R score = 0.96", "R score = 0.96", "R score = 0.96", 
"R score = 0.96", "R score = 0.96", "R score = 0.96", "R score = 0.96", 
"0.8 > R score >= 0.7", "R score = 0.96", "R score = 0.96", "R score = 0.96", 
"R score = 0.96", "0.8 > R score >= 0.7", "R score = 0.96", "R score = 0.96", 
"R score = 0.96")), row.names = c("1", "2", "3", "4", "5", "6", 
"7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", 
"18", "19", "20", "21", "22", "23", "24", "25", "11000", "2620", 
"3100", "4100", "5100", "6100", "787", "8100", "9100", "10100", 
"11100", "12100", "13100", "14100", "15100", "16100", "17100", 
"18100", "19100", "20100", "21100", "22100", "23100", "24100", 
"25100", "46", "2002", "2057", "2223", "2391", "2459", "2509", 
"2533", "2029", "2062", "2089", "2102", "2131", "2139", "2159", 
"2179", "2192", "2201", "2252", "2265", "2282", "2302", "2335", 
"2346", "2362", "1410", "1411", "1412", "1413", "1414", "1415", 
"1416", "1417", "1418", "1419", "1420", "1421", "1422", "1423", 
"1424", "1425", "1426", "1427", "1428", "1448", "1449", "1450", 
"1451", "1452", "1453"), class = "data.frame")

У меня 2 столбцы. Мне нужно 4 отдельных штриховых графика, по 1 для каждого уникального score из столбца score (они не должны быть все представлены на одном рисунке). Каждый из этих 4 столбцов должен состоять из 4 столбцов, по одному для каждого отдельного уникального значения, которое у меня есть в столбце type. Предполагается, что столбчатый график представляет долю данных в столбце type, что означает, что через мои 4 столбца итого type == NE18 должно быть 100% et c.

Для лучшего понимания я суммировал эту информацию в такой таблице:

      score
type   0.5 > R score >= 0.2 0.8 > R score >= 0.7 0.9 > R score >= 0.8 R score = 0.96
  NA                      0                    4                    4             92
  NE18                    8                    0                    4             88
  NE21                    8                    0                    4             88
  SA                      0                   16                    0             84

Дело в том, что у меня есть не знаю, как это сделать с ggplot2 с помощью geom_bar(), так как мне нужно представить это в нескольких независимых штриховых диаграммах. Я думаю, мне нужно предоставить ggplot мои данные df, а не сводную таблицу. Я попытался преобразовать таблицу в df и использовать ее для использования ggplot, но все же я не могу сгруппировать свои данные

Мне не удалось найти что-то подобное ни в другом сообщении, ни в ggplot документация.

Например, если я сделаю это:

list_score <- unique(df$score)

for (my_score in list_score){
my_plot <- ggplot(df[which(df$score == my_score),], aes(x=type)) + 
  geom_bar(aes(y = (..count..)/sum(..count..))) +
  ggtitle(my_score) +
  geom_text(stat='count', aes(group=type, label=..count../sum(..count..)), position = position_stack(vjust = 0.5))
print(my_plot)
}

Я получаю процентное соотношение, рассчитанное на цифре, что означает, что сумма NE18 + NE21 + NA + SA = 1, что не то, что я хочу

Надеюсь, я ясен

Изменить:

Вот моя сводная таблица

structure(list(type = structure(c(1L, 2L, 3L, 4L, 1L, 2L, 3L, 
4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L), .Label = c("NA", "NE18", 
"NE21", "SA"), class = "factor"), score = structure(c(1L, 1L, 
1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L), .Label = c("0.5 > R score >= 0.2", 
"0.8 > R score >= 0.7", "0.9 > R score >= 0.8", "R score = 0.96"
), class = "factor"), Freq = c(0, 8, 8, 0, 4, 0, 0, 16, 4, 4, 
4, 0, 92, 88, 88, 84)), class = "data.frame", row.names = c(NA, 
-16L))

Я близок к тому, что хочу здесь. Но я не могу иметь дело с метками:

ggplot(df, aes(x = score)) + 
  geom_bar(aes(y = ..prop.., group = type, fill = type), position = position_dodge()) +
  geom_text(stat = "count", aes(group = type, label = ..prop..), size = 3, position = position_dodge(width = 1))

Мне нужно сочетание этих двух графиков, где метки не мешают моей оси Y:

enter image description here

введите описание изображения здесь

1 Ответ

1 голос
/ 05 августа 2020

Вот решение, наиболее ценное для собственного пользователя, который обманул код, чтобы построить график:

library(tidyverse)
#Data
my_table <- structure(list(type = structure(c(1L, 2L, 3L, 4L, 1L, 2L, 3L, 
4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L), .Label = c("NA", "NE18", 
"NE21", "SA"), class = "factor"), score = structure(c(1L, 1L, 
1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L), .Label = c("0.5 > R score >= 0.2", 
"0.8 > R score >= 0.7", "0.9 > R score >= 0.8", "R score = 0.96"
), class = "factor"), Freq = c(0, 8, 8, 0, 4, 0, 0, 16, 4, 4, 
4, 0, 92, 88, 88, 84)), class = "data.frame", row.names = c(NA, 
-16L))

Следующий код:

my_tot <- c() 
type <- c() 
for (my_type in unique(my_table$type)){ 
  my_tot <- c(my_tot,sum(my_table[my_table$type == my_type,"Freq"]))
  type <- c(type, my_type) 
  } 

df_tot <- data.frame(type,my_tot) 
my_table <- merge(my_table,df_tot) 
my_table$Label <- my_table$Freq/my_table$my_tot 

ggplot(my_table, aes(x = score,y=Freq,group = type, fill = type)) +
  geom_bar(,stat='identity',position = position_dodge()) +
  geom_text(aes(label=ifelse(Label==0,NA,Label)),position = position_dodge(1),vjust=-0.5)

Результат:

введите описание изображения здесь

...