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_size
和 max_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')
我正在使用 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_size
和 max_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')