使用 Altair 创建词云
Creating wordclouds with Altair
如何使用 Altair 创建词云?
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))
Altair 的 API 建立在 Vega-Lite 语法之上,它仅包括 Vega 中可用的绘图类型的一个子集。词云在Vega-Lite中无法创建,所以在Altair中也无法创建。
非常尊重@jakevdp,您可以在altair
中构建词云(或类似词云的东西),方法是认识到词云图表的元素涉及:
- 单词及其各自数量的数据集
- text_marks 用每个单词编码,并根据数量选择大小和/或颜色
- “随机”分布 text_marks 二维 space。
分配标记的一个简单选项是向数据添加一个额外的 '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 中使用的同一数据集的结果:
如何使用 Altair 创建词云? 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))
Altair 的 API 建立在 Vega-Lite 语法之上,它仅包括 Vega 中可用的绘图类型的一个子集。词云在Vega-Lite中无法创建,所以在Altair中也无法创建。
非常尊重@jakevdp,您可以在altair
中构建词云(或类似词云的东西),方法是认识到词云图表的元素涉及:
- 单词及其各自数量的数据集
- text_marks 用每个单词编码,并根据数量选择大小和/或颜色
- “随机”分布 text_marks 二维 space。
分配标记的一个简单选项是向数据添加一个额外的 '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 中使用的同一数据集的结果: