【问题标题】:Creating wordclouds with Altair使用 Altair 创建词云
【发布时间】:2018-09-09 01:01:03
【问题描述】:

如何使用 Altair 创建 wordcloud? Vega 和 vega-lite 提供了我过去成功使用的 wordcloud 功能。 因此,如果我理解正确,应该可以从 Altair 访问它并且 我更喜欢用 Python 而不是嵌入的 JSON 来表达可视化。 我见过的所有 Altair 示例都涉及标准图表类型,例如 散点图和条形图。 我没有看到任何涉及词云、网络、树状图等的内容。

更具体地说,我将如何在 Altair 中表达或至少近似以下 Vega 可视化?

def wc(pages, width=2**10.5, height=2**9.5):
 return {
  "$schema": "https://vega.github.io/schema/vega/v3.json",
  "name": "wordcloud",
  "width": width,
  "height": height,
  "padding": 0,
  "data" : [
      {
          'name' : 'table',
          'values' : [{'text': pg.title, 'definition': pg.defn, 'count': pg.count} for pg in pages)]
      }
  ],
  "scales": [
    {
      "name": "color",
      "type": "ordinal",
      "range": ["#d5a928", "#652c90", "#939597"]
    }
  ],
  "marks": [
    {
      "type": "text",
      "from": {"data": "table"},
      "encode": {
        "enter": {
          "text": {"field": "text"},
          "align": {"value": "center"},
          "baseline": {"value": "alphabetic"},
          "fill": {"scale": "color", "field": "text"},
          "tooltip": {"field": "definition", "type": "nominal", 'fontSize': 32}
        },
        "update": {
          "fillOpacity": {"value": 1}
        },
      },
      "transform": [
        {
          "type": "wordcloud",
          "size": [width, height],
          "text": {"field": "text"},
          #"rotate": {"field": "datum.angle"},
          "font": "Helvetica Neue, Arial",
          "fontSize": {"field": "datum.count"},
          #"fontWeight": {"field": "datum.weight"},
          "fontSizeRange": [2**4, 2**6],
          "padding": 2**4
        }
      ]
    }
  ],
}

Vega(wc(pages))

【问题讨论】:

  • 在 python 中生成词云的一个不错的基于非 vega 的替代方案是 word_cloud
  • @JamesDraper 谢谢。我使用word_cloud 来创建静态图像。我正在尝试创建交互式词云,其中的词是可点击的或与它们相关的工具提示,afaik word_cloud 不支持,但 vega 支持。
  • 我想了很多,但我只是想我会把链接放在那里以防万一。

标签: word-cloud tag-cloud vega vega-lite altair


【解决方案1】:

Altair 的 API 建立在 Vega-Lite 语法之上,它仅包含 Vega 中可用的绘图类型的一个子集。词云无法在 Vega-Lite 中创建,因此无法在 Altair 中创建。

【讨论】:

    【解决方案2】:

    非常尊重@jakevdp,您可以通过识别词云图表的元素涉及:

    1. 单词及其各自数量的数据集
    2. text_marks 用每个单词编码,并且可以根据数量选择大小和/或颜色
    3. “随机”在二维空间中分布 text_marks。

    分配标记的一个简单选项是向数据添加额外的“x”和“y”列,每个元素都是您选择的 x 和 y 域范围内的随机样本:

    import random
    def shuffled_range(n): return random.sample(range(n), k=n)
    n = len(words_and_counts)  # words_and_counts: a pandas data frame
    x = shuffled_range(n)
    y = shuffled_range(n)
    
    data = words_and_counts.assign(x=x, y=y)
    

    这并不完美,因为它没有明确防止单词重叠,但您可以使用 n 并运行几次随机数生成,直到找到令人愉悦的布局。

    这样准备好数据后,您可以像这样指定词云元素:

    base = alt.Chart(data).encode(
        x=alt.X('x:O', axis=None),
        y=alt.Y('y:O', axis=None)
    ).configure_view(strokeWidth=0)  # remove border
    
    word_cloud = base.mark_text(baseline='middle').encode(
        text='word:N',
        color=alt.Color('count:Q', scale=alt.Scale(scheme='goldred')),
        size=alt.Size('count:Q', legend=None)
    )
    

    这是应用于Vega docs 中使用的同一数据集的结果:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-08
      • 2019-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多