Групповой график в ggplot

У меня есть файл опроса, в котором строка представляет собой вопрос наблюдения и столбца.

Вот некоторые поддельные данные, которые они видят:

People,Food,Music,People P1,Very Bad,Bad,Good P2,Good,Good,Very Bad P3,Good,Bad,Good P4,Good,Very Bad,Very Good P5,Bad,Good,Very Good P6,Bad,Good,Very Good 

Моя цель – создать такой сюжет с ggplot2 .

  • Я абсолютно не забочусь о цветах, дизайне и т. Д.
  • Сюжет не соответствует поддельным данным

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

Вот мои поддельные данные:

 raw <- read.csv("http://pastebin.com/raw.php?i=L8cEKcxS",sep=",") raw[,2]<-factor(raw[,2],levels=c("Very Bad","Bad","Good","Very Good"),ordered=FALSE) raw[,3]<-factor(raw[,3],levels=c("Very Bad","Bad","Good","Very Good"),ordered=FALSE) raw[,4]<-factor(raw[,4],levels=c("Very Bad","Bad","Good","Very Good"),ordered=FALSE) 

Но если я выберу Y как счетчик, то у меня возникнет проблема с выбором значений X и Group … Я не знаю, смогу ли я добиться успеха, не используя reshape2 … Я тоже устал использовать перемасштабирование с расплавом функция. Но я не понимаю, как его использовать …

    Сначала вам нужно получить подсчеты для каждой категории, т. Е. Сколько Bads и Goods и так далее для каждой группы (Food, Music, People). Это будет сделано так:

     raw <- read.csv("http://pastebin.com/raw.php?i=L8cEKcxS",sep=",") raw[,2]<-factor(raw[,2],levels=c("Very Bad","Bad","Good","Very Good"),ordered=FALSE) raw[,3]<-factor(raw[,3],levels=c("Very Bad","Bad","Good","Very Good"),ordered=FALSE) raw[,4]<-factor(raw[,4],levels=c("Very Bad","Bad","Good","Very Good"),ordered=FALSE) raw=raw[,c(2,3,4)] # getting rid of the "people" variable as I see no use for it freq=table(col(raw), as.matrix(raw)) # get the counts of each factor level 

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

     Names=c("Food","Music","People") # create list of names data=data.frame(cbind(freq),Names) # combine them into a data frame data=data[,c(5,3,1,2,4)] # sort columns # melt the data frame for plotting data.m <- melt(data, id.vars='Names') # plot everything ggplot(data.m, aes(Names, value)) + geom_bar(aes(fill = variable), position = "dodge", stat="identity") 

    Это то, что вам нужно?

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

    Чтобы немного разъяснить, в многострочной панели ggplot у вас был фрейм данных, который выглядел следующим образом:

     > head(df) ID Type Annee X1PCE X2PCE X3PCE X4PCE X5PCE X6PCE 1 1 A 1980 450 338 154 36 13 9 2 2 A 2000 288 407 212 54 16 23 3 3 A 2020 196 434 246 68 19 36 4 4 B 1980 111 326 441 90 21 11 5 5 B 2000 63 298 443 133 42 21 6 6 B 2020 36 257 462 162 55 30 

    Поскольку у вас есть числовые значения в столбцах 4-9, которые позже будут построены на оси y, это можно легко преобразовать с reshape и построением графика.

    Для нашего текущего набора данных нам было нужно что-то подобное, поэтому мы использовали freq=table(col(raw), as.matrix(raw)) чтобы получить это:

     > data Names Very.Bad Bad Good Very.Good 1 Food 7 6 5 2 2 Music 5 5 7 3 3 People 6 3 7 4 

    Представьте, что у вас есть Very.Bad , Bad , Good и т. Д. Вместо X1PCE , X2PCE , X3PCE . См. Сходство? Но сначала нам нужно было создать такую ​​структуру. Следовательно, freq=table(col(raw), as.matrix(raw)) .

    Давайте будем гением компьютера.