【问题标题】:Wordcloud showing colour based on continous metadata in RWordcloud 基于 R 中的连续元数据显示颜色
【发布时间】:2017-05-10 13:48:18
【问题描述】:

我正在创建一个单词云,其中单词的大小基于频率,但我希望将单词的颜色映射到第三个变量(压力,即与每个单词相关的压力量,数值或连续变量)。

我尝试了以下,它只给了我两种不同的颜色(黄色和紫色)​​,而我想要更光滑的东西。我想要一些颜色范围,例如从绿色变为红色的调色板。

df = data.frame(word = c("calling", "meeting", "conference", "contract", "negotiation", "email"),
n = c(20, 12, 4, 8, 10, 43),
stress = c(23, 30, 15, 40, 35, 15))
df = tbl_df(df) 
wordcloud(words = df$word, freq = df$n, col = df$stress)

有谁知道如何处理这种连续的元数据并在压力增加时为单词平滑地改变颜色?谢谢!

【问题讨论】:

  • 这样的? wordcloud(words = df$word, freq = df$n, col = brewer.pal(9,"BuGn"))
  • 将 RColorBrewer 与 brew 一起使用
  • @jazzurro。但是颜色强度/类型并没有映射到变量应力,是吗?
  • 那么像这样? df %>% arrange(stress) -> foo ; wordcloud(words = foo$word, freq = foo$stress, scale = c(4, 0.5), col = brewer.pal(6,"YlOrRd"), ordered.colors = T)。我正在创建一个原型。所以你可能需要做更多。这个想法是您使用scale 设置字体大小。然后,您在freq 中使用stress。我按stress 重新排列了您的数据顺序。接触具有最高的价值,它接收最深的颜色。您可能想为 stress 创建一些组作为新变量,并考虑如何分配颜色。
  • wordcloud(words = foo$word, freq = foo$n, scale = c(8, 1), col = brewer.pal(6,"YlOrRd"), ordered.colors = T) 这似乎对你有利。

标签: r colors text-mining word-cloud color-palette


【解决方案1】:

或者更自动的东西,而不是指定确切的阈值和颜色:

library(RColorBrewer)
library(wordcloud2)

mydf = data.frame(word = c("calling", "meeting", "conference", "contract", "negotiation",
                       "email", "friends", "chat", "text", "deal",
                       "business", "promotion", "discount", "users", "family"),
              n = c(20, 12, 4, 8, 10, 43, 33, 5, 47, 28, 12, 9, 50, 31, 22),
              stress = c(23, 30, 15, 40, 35, 15, 30, 18, 10, 5, 29, 38, 45, 8, 3))

color_range_number <- length(unique(mydf$stress))
color <- colorRampPalette(brewer.pal(9,"Blues")[3:7])(color_range_number)[factor(mydf$stress)]

wordcloud2(mydf, color=color)

所以大小由'n'决定,颜色的深浅由'stress'决定。

[3:7] 用于调整色标范围。 1 最亮,9 最暗。

您可以通过以下方式检查其他调色板选项:

display.brewer.all()

【讨论】:

    【解决方案2】:

    这是一个潜在的解决方案。您想为您的任务使用 wordcloud2 包。然后,我想你可以解决你的问题。由于我不知道你的真实数据,所以我创建了一个示例数据来演示原型。

    如果您有很多单词,我不确定添加带有连续变量(重音)的颜色是否是个好主意。您可以做的一件事是使用cut() 创建一个新的组变量。通过这种方式,您可以减少在图形中使用的颜色数量。在这里,我创建了一个名为 color 的新列,其中包含来自 viridis 包的五种颜色。

    当您使用wordcloud2() 时,您只需要提供两件事。一个是数据,另一个是颜色。字体大小反映单词的频率,无需指定。

    mydf = data.frame(word = c("calling", "meeting", "conference", "contract", "negotiation",
                               "email", "friends", "chat", "text", "deal",
                               "business", "promotion", "discount", "users", "family"),
                      n = c(20, 12, 4, 8, 10, 43, 33, 5, 47, 28, 12, 9, 50, 31, 22),
                      stress = c(23, 30, 15, 40, 35, 15, 30, 18, 10, 5, 29, 38, 45, 8, 3))
    
    
              word  n stress
    1      calling 20     23
    2      meeting 12     30
    3   conference  4     15
    4     contract  8     40
    5  negotiation 10     35
    6        email 43     15
    7      friends 33     30
    8         chat  5     18
    9         text 47     10
    10        deal 28      5
    11    business 12     29
    12   promotion  9     38
    13    discount 50     45
    14       users 31      8
    15      family 22      3
    
    library(dplyr)
    library(wordcloud2)
    library(viridis)
    
    mutate(mydf, color = cut(stress, breaks = c(0, 10, 20, 30, 40, Inf),
                 labels = c("#FDE725FF", "#73D055FF", "#1F968BFF",
                            "#2D708EFF", "#481567FF"),
                 include.lowest = TRUE)) -> temp
    
    wordcloud2(data = temp, color = temp$color)
    

    【讨论】:

    • 效果很好,我使用了更连续的调色板,看起来很漂亮!
    • @BenjaminTelkamp 我很高兴这个想法对你有用!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-20
    • 1970-01-01
    • 1970-01-01
    • 2016-01-15
    • 2019-07-07
    相关资源
    最近更新 更多