Wordcloud - 多个实例之间的相对字体大小?

Wordcloud - relative font size amongst multiple instances?

我正在使用 wordcloud==1.8.1 渲染具有多个词云的图,
每个都在条形图中成为一个条形。

基本上只是添加一些这样的子图:

subplot = plt.subplot(1, len(ontologies), i, anchor='S')
subplot.set_title(title, size=10, y=-0, pad=-25)
subplot.set_ymargin(50)
plt.plot()
cloud = WordCloud(
    font_path=f'{current_dir}/assets/source-sans-pro.ttf',
    background_color='white',
    width=width,
    height=height,
    # max_words=30,
    prefer_horizontal=0.99,
    color_func=lambda *args, **kwargs: colors[ontology_name]
)
plt.imshow(cloud.generate_from_frequencies(
    frequencies
    #max_font_size=200,
    #min_font_size=10,
))
plt.axis("off")

是否有可能在 所有 词云中获得正确的相对字体大小?在同一个词云中,它们只是相对于彼此的那一刻。

我尝试根据频率动态设置 min_font_sizemax_font_size,但这些似乎并没有影响关系...

因此,如果一个词在文档中出现的频率是其他任何词的 10 倍,我希望它的字体比所有其他词大 10 倍。无论在哪个wordcloud.

frequencies 将只是单词出现总数的字典:

文字云 1 (200x400) {'word1': 10, 'word2': 40}
文字云 2 (200x600) {'word3': 20, 'word4': 80}
文字云 2 (200x800) {'word5': 40, 'word6': 160}

那么,如何从中创建 3 个词云并保持比例,以便词云 3 中的 word6 比词云 1 中的 word1 大 16 倍?

我能够为玩具示例获得所需的结果,但我不能 100% 确定当图像变得更加拥挤时这是否适用于较大的集合,并且它很可能会因您的垂直条而失败示例(也许将 prefer_horizontal 设置为较低的值 0.1 在这种情况下可能会有所帮助,旋转大部分单词)。

需要注意以下几点:

  • relative_scaling 设置为 1 以便字体大小与频率成正比(每个文档)。
  • 使图像足够宽,以便最大的单词能够在整个长度上适合图像(否则可能会缩小)
  • font_step 设置为 0 以防止在第一次尝试时单词不适合时字体减小(参见 source

以下示例说明了这一点(颜色和单词位置是随机选择的,因此您的结果会有所不同,但大小和大小比例应与示例输出中的相同):

import matplotlib.pyplot as plt
import wordcloud

wl1 = {'word1': 10, 'word2': 40}
wl2 = {'word3': 20, 'word4': 80}
wl3 = {'word5': 40, 'word6': 160}

# get max word count per list
w1 = max((v for k,v in wl1.items()))
w2 = max((v for k,v in wl2.items()))
w3 = max((v for k,v in wl3.items()))

# get total max for scaling factor among lists
w_max = max(w1, w2, w3)

height = 400
kwargs = {'relative_scaling': 1, 'height': height, 'width': 4*height,
          'prefer_horizontal': 1, 'font_step': 0 }

wc1 = (wordcloud.WordCloud(**kwargs)
       .generate_from_frequencies(wl1, max_font_size=w1/w_max*height))
wc2 = (wordcloud.WordCloud(**kwargs)
       .generate_from_frequencies(wl2, max_font_size=w2/w_max*height))
wc3 = (wordcloud.WordCloud(**kwargs)
       .generate_from_frequencies(wl3, max_font_size=w3/w_max*height))


fig, axes = plt.subplots(3, layout='constrained', figsize=(10,8))
for ax, wc in zip(axes.flat, (wc1, wc2, wc3)):
    ax.imshow(wc.to_image())
    ax.axis('off')