R wordcloud: изменяющийся цвет определенной частоты c - PullRequest
0 голосов
/ 06 марта 2020

У меня есть облако слов, где многие из элементов имеют частоту 1, но все равно важно, чтобы они отображались. Мне бы хотелось, чтобы эти результаты с частотой 1 отображались случайным образом с использованием градиента цвета (например, оттенков серого), чтобы каждый отдельный элемент с частотой 1 было легче читать, а все, что больше 1, получало бы обозначенный цвет (я буду заранее знать количество уникальных частот. Например, в данных ниже: 1, 2, 3, 9, 16).

Мой фрейм данных упоминания2 выглядит примерно так:

id  n   mention
1   1   las vísceras
2   1   museo de vivos
3   1   el hormiguero
4   1   las plataformas
5   1   lejos
6   1   madrileña
7   1   madrileñas
8   1   matritenses
9   2   esta ciudad
10  2   la gran ciudad
11  2   madrileño
12  2   sí mismas
13  3   una ciudad
14  9   aquí
15  10  madrid
16  16  la ciudad
17  1   ratonera
18  1   los madriles
19  1   allá
20  1   nuestra ciudad

Пока у меня есть это, которое делает то, что я хочу, за исключением того, что все элементы с частотой 1 имеют одинаковый серый цвет, и я хочу, чтобы их было легче читать, изменяя их тональность случайным образом ( назначая набор цветов вручную или используя установленный градиент или диапазон):


wordcloud(words = mentions2, freq = mentions2$n, min.freq = 1,rot.per=0,colors = c("grey28","firebrick1", "firebrick2","firebrick3","firebrick3", "firebrick4"))

Я не уверен, как поступить с теми, кто имеет частоту один отдельно от тех, которые имеют более высокие частоты. Есть мысли?

Редактировать: Следуя совету, приведенному здесь: Настроенное облако слов в двух разных цветах в R , я смог разделить свой фрейм данных на две части: частоту 1 и частоту> 1. Но я все еще не могу понять, как применить к ним два отдельных цветовых правила:

  • частота 1: назначать цвета случайным образом (например, разные тона прохладных тонов)
  • частота > 1: назначить цвета в соответствии с частотой (например, градиент теплых цветов)
freq1<-  mentions2[ which(mentions2$n == 1) ,]
freq2<- mentions2[ which(mentions2$n >= 2) ,]
AllWords = rbind(freq1, freq2)
 Colors = c(rep("blue", nrow(freq1)), rep("red", nrow(freq2)))

 wordcloud(words = AllWords$mentions, freq = AllWords$n, min.freq = 1,rot.per=0,colors=Colors, ordered.colors=TRUE)

Редактировать 2: Спасибо Армандо за подсказку о том, что wordcloud не обладает гибкостью Мне нужно назначить цвета на основе переменной, кроме частоты. В конечном итоге я использовал wordcloud2, добавив столбец «color» в свой фрейм данных, и я случайным образом назначил цвет для всех моих результатов «частоты = 1»:

 colors<-c("#666666","#777777","#888888","#222222","#555555","#444444","#333333","#222222","#111111","#000000")

nummentions1<-count(madridmentions2[madridmentions2$n==1,])

mentions2[mentions2$n==1,]$color <-sample(colors,1,size=as.numeric(nummentions1))

mentions2[madridmentions2$n>=2,]$color <- "#db0030"

wordcloud2(data=mentions2, color = mentions2$color, backgroundColor = "white",rotateRatio=0,shape = 'circle',fontFamily = 'Helvetica')

1 Ответ

1 голос
/ 06 марта 2020

То, что вы спрашиваете, невозможно с wordcloud, потому что опция цвета принимает только вектор цветов, который пакет автоматически установит в соответствии с частотами.

Я предлагаю вам использовать более гибкий пакет wordcloud2, который обеспечивает большую гибкость. В следующем коде я покажу вам, как использовать серую последовательность для 1 частоты и желто-красную последовательность для других значений. Поскольку fontsize уже показывает частоты, вы можете использовать случайные цвета по умолчанию, которые есть в информационном пакете https://cran.r-project.org/web/packages/wordcloud2/vignettes/wordcloud.html Пример:

library(wordcloud2)    
library(scales)

cloud <- demoFreq[1:500,]
freqs <- unique(cloud$freq)[order(unique(cloud$freq))]

cloud$color=""
cloud[cloud$freq==1,]$color <- scales::seq_gradient_pal(low="#F0F0F0", high="#252525",space = "Lab")(seq(0,1,length.out=sum(cloud$freq==1)))

cols <- scales::seq_gradient_pal(low="yellow", high="red",space = "Lab")(seq(
  0,1,
  length.out=(length(freqs)-1)))

for (i in 2:length(freqs)){
  cloud[cloud$freq==freqs[i],]$color <- cols[i-1]
}

wordcloud2(demoFreq, color = cloud$color, backgroundColor = "pink")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...