Подтвердить что ты не робот

Групповой график в 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.

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

enter image description here

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

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... Я тоже устал использовать форму с функцией расплава. Но я не понимаю, как его использовать...

4b9b3361

Ответ 1

Сначала вам нужно получить подсчеты для каждой категории, т.е. сколько Плохих и Товаров и так далее для каждой группы (Еда, Музыка, Люди). Это будет сделано следующим образом:

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")

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

enter image description here

Чтобы немного разъяснить, в 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)).