使用Python wordcloud库导出SVG词云为栅格格式,如何获取矢量版本?
你当前输出的SVG是嵌入了栅格位图的伪矢量文件,原因是wordcloud库默认生成的是PIL栅格图像对象,调用plt.imshow()绘图时,matplotlib会直接把位图嵌入到导出的SVG中,不是真正的矢量文本。
解决方案
我们可以直接读取wordcloud生成的文本布局属性,手动生成纯矢量SVG文件,不需要走matplotlib渲染流程,修改后代码如下:
import wikipedia import re from wordcloud import WordCloud, STOPWORDS import svgwrite # 需提前执行pip install svgwrite安装 # 文本处理逻辑和之前一致 wiki = wikipedia.page('Puzzle') text = wiki.content text = re.sub(r'==.*?==+', '', text) text = text.replace('\n', '') # 生成词云布局(仅需要布局数据,不需要渲染为栅格图像) wc_width = 3000 wc_height = 2000 wordcloud = WordCloud( width = wc_width, height = wc_height, random_state=1, background_color='black', colormap='Pastel1', collocations=False, stopwords = STOPWORDS ).generate(text) # 初始化矢量SVG对象 dwg = svgwrite.Drawing('cloud_test.svg', size=(wc_width, wc_height), profile='full') # 添加背景色 dwg.add(dwg.rect(insert=(0,0), size=(wc_width, wc_height), fill=wordcloud.background_color)) # 遍历所有词的布局信息写入SVG for (word, font_size, (x, y), angle, color) in wordcloud.layout_: # 如出现文字位置偏移,可调整y值为 y + font_size*0.8 适配不同字体的基线规则 text = dwg.text( word, insert=(x, y), fill=color, font_size=font_size, font_family='Arial', # 可替换为你需要的字体 text_anchor='start' ) # 处理旋转角度 if angle != 0: text.rotate(angle, center=(x, y)) dwg.add(text) # 保存纯矢量SVG文件 dwg.save()
上述代码生成的cloud_test.svg所有文字都是矢量格式,可直接编辑、无限放大不会失真。你如果需要调整字体、大小规则等,直接修改对应参数即可。
内容的提问来源于stack exchange,提问作者Katherine Elizabeth Kath
相关产品推荐
相关产品推荐

