条件词云 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)
我已经搜索了几个小时了,我已经很接近了,但我就是无法让它工作。 基本上,我有一个词频,我想用它来构建词云。但是,我想为绘制的颜色添加一些含义。出于这个原因,我在我的 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)