Облако слов в R с двумя отдельными значениями

Как новичок в R, я работаю над созданием облака слов, которое показывает две переменные: frequency и rating. Используя общую таблицу, я хочу отобразить гипотетическое количество колледжей (шрифт = от большого к меньшему по количеству) по штатам и гипотетический средний рейтинг колледжа.

  • 1 = зеленый (хорошо),
  • 3 = желтый (средний),
  • 5 = красный (плохой)

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

State   Colleges    Rating
Alabama        220      1
Alaska         100      3
Arizona         50      5
Arkansas       275      1
California     155      3
Colorado        68      5
Connecticut    235      1
Delaware       189      3
Florida         32      5
Georgia        219      1
Hawaii         117      3
Idaho           63      5
Illinois       264      1
Indiana        167      3
Iowa            76      5
Kansas         287      1
Kentucky       178      3
Louisiana       67      5
Maine          246      1
Maryland       169      3
Massachusetts   46      5
Michigan       225      1
Minnesota      132      3
Mississippi     23      5
Missouri       219      1
Montana        194      3
Nebraska        97      5

Ниже мой очень простой скрипт:

library(wordcloud)
library(rcolorbrewer)

data <- read.csv("wordcloud.csv", header = T)
pal <- brewer.pal(9, "RdYlGn")
wordcloud(data$State, data$Colleges, scale = c(4,1), colors = pal, rot.per=.5)

Приведенный выше сценарий позволяет размеру текста отражать количество колледжей, но я не могу связать цветовую шкалу от 1 = зеленый (хороший) до 3 = желтый (средний) до 5 = красный (плохой). Любые предложения приветствуются.


person csv2004    schedule 16.03.2016    source источник


Ответы (2)


В таких случаях также есть возможность построить сравнительное облако.

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

library(reshape2)
df1 <- dcast(df1,State + Colleges ~ Rating, value.var = "Colleges")

Затем выполняем несколько стандартных операций по подготовке подходящей матрицы:

rownames(df1) <- df1[,1] #use name of States as row names
df1 <- df1[,-c(1,2)] #remove "States" and "Colleges" column
df1[is.na(df1)] <- 0  #set NA values to zero
df1 <- as.matrix(df1) #convert into matrix
colnames(df1) <- c("good", "average", "bad")

Наконец, мы можем построить облако сравнения и назначить цвета группам по своему желанию:

library(wordcloud)
comparison.cloud(df1,max.words=Inf,random.order=FALSE, scale = c(4,.5), 
                     title.size = 1,  colors=c("green","orange","red"))

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

данные

df1 <- structure(list(State = structure(1:27, .Label = c("Alabama", 
"Alaska", "Arizona", "Arkansas", "California", "Colorado", "Connecticut", 
"Delaware", "Florida", "Georgia", "Hawaii", "Idaho", "Illinois", 
"Indiana", "Iowa", "Kansas", "Kentucky", "Louisiana", "Maine", 
"Maryland", "Massachusetts", "Michigan", "Minnesota", "Mississippi", 
"Missouri", "Montana", "Nebraska"), class = "factor"), Colleges = c(220L, 
100L, 50L, 275L, 155L, 68L, 235L, 189L, 32L, 219L, 117L, 63L, 
264L, 167L, 76L, 287L, 178L, 67L, 246L, 169L, 46L, 225L, 132L, 
23L, 219L, 194L, 97L), Rating = c(1L, 3L, 5L, 1L, 3L, 5L, 1L, 
3L, 5L, 1L, 3L, 5L, 1L, 3L, 5L, 1L, 3L, 5L, 1L, 3L, 5L, 1L, 3L, 
5L, 1L, 3L, 5L)), .Names = c("State", "Colleges", "Rating"), 
class = "data.frame", row.names = c(NA, -27L))
person RHertel    schedule 17.03.2016

Вы можете назначить цвета вручную и добавить ordered.colors=T

wordcloud(data$State, data$Colleges, 
scale = c(4,1), 
colors = rep(c("green", "yellow", "red"), 9), 
rot.per=.5, 
ordered.colors=T)

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

person erc    schedule 17.03.2016
comment
Я ценю ввод - он работает, но если я изменю порядок (т.е. сначала все 1, затем все 2 и т. д.), зеленый-желтый-красный будет продолжать цикл и не будет следовать значению в этом столбце. Я все еще возиться с этим. Еще раз спасибо-вы очень помогли - person csv2004; 17.03.2016
comment
Конечно, порядок зависит от порядка строк, но если вы измените его, вы все равно можете использовать подход в моем ответе, если вы затем соответствующим образом отрегулируете порядок цветов, например. до rep(c("green", "yellow", "red"), each=9) - person erc; 17.03.2016
comment
Сегодня я разговаривал с коллегой и придумал следующее: vec ‹- vector() for(i in 1:nrow(data)){ if(data[i,3]==1){ }} for(i in 1:nrow(data)){ if(data[i,3]==1){ vec[i]=green} if(data[i,3]==3){ vec[i]=yellow} if (данные[i,3]==5){ vec[i]=красный} } - person csv2004; 19.03.2016