条件词云 R

Conditional wordcloud R

我已经搜索了几个小时了,我已经很接近了,但我就是无法让它工作。 基本上,我有一个词频,我想用它来构建词云。但是,我想为绘制的颜色添加一些含义。出于这个原因,我在我的 data.frame 中添加了第三列,用于调整要在 wordcloud 中使用的颜色。

在下面的示例中,您会看到“差异”列是每个城市之间的人口差异阈值 (6)。

我希望绿色和红色能够反映每个城市的人口与阈值之间的差异大小(这要感谢这里的 post),棘手的一点是我想城市的人口等于具有特定颜色(灰色,“#c5c5c5”)的阈值,而我就是做不到。

library(wordcloud)
library(tm)

DF <- data.frame(
city = c("New York","Barcelona","Paris","Rome","London", "Brussels", "Leeds", "Berlin"),
pop = c(12,7,5,7,6,2,0.8,6),
diff= c(6,1,-1,1,0,-4,-5.2,0))


custColorPal <- colorRampPalette(c("#ff0000","#00cc00"))

color_range_number <- length(unique(DF$diff))

colors <- custColors[factor(DF$diff)]
custColors <- custColorPal(color_range_number)

wordcloud(DF$city, DF$pop, colors=custColors, min.freq = 0.1, ordered.colors=FALSE)

在上面的例子中,我希望两个城市是灰色的,三个是绿色的,三个是红色的。

第二次尝试: 我已经设法(在 jazzurro 的帮助下)为流行等于阈值灰色的城市名称着色。但是,如果您 运行 下面的代码,您会看到一些奇怪的东西。基本上,我们应该只得到一个红色城市名称,而现在我们有几个(我已经更改了初始值来测试它)。我知道渐变是均匀分布的,但如果在一个方向上拉伸值,它就不起作用。

有没有办法同时使用两种渐变?一个大于零,另一个小于零(或任何其他值)?

DF <- data.frame(
  city = c("New York","Barcelona","Paris","Rome","London", "Brussels", "Leeds", "Berlin"),
  pop = c(12,7,5,7,6,2,0.8,6),
  diff= c(20,1,10,1,0,7,-0.2,0))
DF$city<-as.character(DF$city)

custColorPal <- colorRampPalette(c("#ff0000","#00cc00"))
color_range_number <- length(unique(DF$diff))
custColors <- custColorPal(color_range_number)
colors <- custColors[factor(DF$diff)]

DF<-cbind(DF,colors)

DF$colors<-as.character(DF$colors)

DF<-transform(DF, colors = case_when(
  diff == 0 ~ "#c5c5c5", 
  TRUE   ~ colors
))

wordcloud(DF$city, DF$pop, colors=DF$colors, min.freq = 0.1, ordered.colors=TRUE)

提前感谢任何指点

干杯

根据您的评论,我想到了以下想法。我不知道你的实际数据。您仍然需要考虑如何调整此代码。我修改了你原来的DF;我更改了 diff 中的值。在当前数据中,最大值为 90,最小值为 -95。首先,我使用 colorRampPalette() 创建了 0-100 的颜色。同样,我为 -1 到 -100 创建了颜色。我结合了这两个向量。请注意,灰色出现了两次。这就是为什么您在 mycolors 行中看到 [-1] 的原因。您需要考虑如何根据您的实际数据创建颜色。颜色准备好后,我在数据集中创建了一个新列。基本上,我使用 diff 来识别 case_when 中颜色的索引号。最后,我画了词云。希望大家根据自己的数据调整这段代码。

library(tidyverse)
library(wordcloud)

DF <- data.frame(city = c("New York","Barcelona","Paris","Rome","London", "Brussels", "Leeds", "Berlin"),
                 pop = c(12, 7, 5, 7, 6, 2, 0.8, 6),
                 diff = c(60, 20, -30, 90, 0, -10, -95, 0))

# Create gradient colors for positive and negative numbers.

positive_color_palette <- colorRampPalette(colors = c("green", "gray"), space = "Lab")(100)
negative_color_palette <- colorRampPalette(colors = c("gray", "red"), space = "Lab")(101)

mycolors <- c(positive_color_palette, negative_color_palette[-1])

# Color index begins with the highest value (100) to the lowest (-100).
# Gray colors is at the 100th position in mycolors
# Assign colors based on this knowledge.

mutate(DF,
       colors = case_when(100 + diff > 100 ~ mycolors[100 - diff],
                          100 + diff < 100 ~ mycolors[100 - diff],
                          100 + diff == 100 ~ mycolors[100])) -> res


wordcloud(words = res$city, freq = res$pop, colors = res$colors,
          min.freq = 0.1, random.order = FALSE, ordered.colors = TRUE)