当前位置:   article > 正文

wordcloud竖排实战_imagefont.transposedfont()

imagefont.transposedfont()

0. 需求

        要做特定mask形状的古诗词的词云,需要竖排。但wordcloud的竖排文字都是左转90度躺平的。

        搜了csdn博客和c一下,没有找到可用的代码。只有一个博客说可以给每个字添加'\n',看原理和效果图应该是失败了。

1. 思路

        a. mask图片可以预先左转90度,等词云图片生成后,再右转90度恢复。这个可以在使用wordcloud的前后实施。

        b. 实际需求转变为生成全部为正常的水平方向的词云,但每个字左转90度。

        c. 解读wordcloud.py后,采用给WordCloud类增加一个参数vert,并修改init()、generate_from_frequencies()、to_image()这三个成员函数。

2. 核心代码

2.0 环境

win10+python3.9+wordcloud1.8.1

预先下载一个中文TrueType字体库,并在wordcloud.py里设置FONT_PATH

FONT_PATH = os.environ.get('FONT_PATH', os.path.join(FILE, 'fangsong_GB2312.ttf'))

2.1 mask图片的转向

注意:PIL中 Transpose.ROTATE_90 已代替 ROTATE_90

  1. from PIL import Image
  2. from wordcloud import WordCloud
  3. img=Image.open(os.path.join(path,'shape_heart.png'))
  4. if vert :
  5. img=img.transpose(Image.Transpose.ROTATE_90)
  6. shape_mask = np.array(img)
  7. '''
  8. # get wordcloud (透明背景,粉色)
  9. wc = WordCloud(background_color=None, mode='RGBA', scale=1.0, vert=vert,
  10. color_func=lambda *args, **kwargs: "pink",max_font_size=22,min_font_size=14,
  11. prefer_horizontal=1, contour_color=None, mask=shape_mask)
  12. wc.generate(text)
  13. img=wc.to_image()
  14. '''
  15. if vert:
  16. img=img.transpose(Image.Transpose.ROTATE_270)
  17. # 保存词云图
  18. img.save(fOut)

2.2  init()

增加class 参数 vert

  1. def __init__(self, font_path=None, width=400, height=200, margin=2,
  2. ranks_only=None, prefer_horizontal=.9, mask=None, scale=1,
  3. color_func=None, max_words=200, min_font_size=4,
  4. stopwords=None, random_state=None, background_color='black',
  5. max_font_size=None, font_step=1, mode="RGB",
  6. relative_scaling='auto', regexp=None, collocations=True,
  7. colormap=None, normalize_plurals=True, contour_width=0,
  8. contour_color='black', repeat=False,
  9. include_numbers=False, vert=False,min_word_length=0, collocation_threshold=30):

赋值 

self.vert = vert

2.3 generate_from_frequencies()

这是generate系列函数的最底层,
包括安排布局,把获得的x,y=np.array(result),存于layout的position,
修改它的目的在于适应字体转向后的高宽差异。

  1. # get size of resulting text
  2. box_size = draw.textsize(word, font=transposed_font)
  3. # find possible places using integral image:
  4. result = occupancy.sample_position(box_size[1] + self.margin,
  5. box_size[0] + self.margin,
  6. random_state)

修改为

  1. # get size of resulting text
  2. box_w,box_h = draw.textsize(word, font=transposed_font)
  3. if self.vert and orientation==None:
  4. font_w,font_h = font.getsize("国")
  5. box_w = box_w *font_h//font_w
  6. box_h = box_h *font_w//font_h
  7. # find possible places using integral image:
  8. result = occupancy.sample_position(box_h + self.margin,
  9. box_w + self.margin,
  10. random_state)

 其中获取字体高宽信息使用了font.getsize("国"),font为

  1. from PIL import ImageFont
  2. font = ImageFont.truetype(self.font_path, font_size)

2.4 to_image()

这个是实际输出的函数

  1. for (word, count), font_size, position, orientation, color in self.layout_:
  2. font = ImageFont.truetype(self.font_path,
  3. int(font_size * self.scale))
  4. transposed_font = ImageFont.TransposedFont(
  5. font, orientation=orientation)
  6. pos = (int(position[1] * self.scale),
  7. int(position[0] * self.scale))
  8. draw.text(pos, word, fill=color, font=transposed_font)

修改为

  1. for (word, count), font_size, position, orientation, color in self.layout_:
  2. font = ImageFont.truetype(self.font_path,
  3. int(font_size * self.scale))
  4. font_w,font_h = font.getsize("国")
  5. transposed_font = ImageFont.TransposedFont(font, orientation=orientation)
  6. vert90_font = ImageFont.TransposedFont(font, orientation=Image.ROTATE_90)
  7. x = int(position[0]* self.scale)
  8. y = int(position[1]* self.scale)
  9. if not self.vert or orientation!=None:
  10. draw.text((y,x), word, fill=color, font=transposed_font)
  11. else :
  12. for i in range(len(word)):
  13. draw.text((y+font_h*i, x), word[i], fill=color, font=vert90_font)

3. 实践效果

vert=False

vert=True

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/531967
推荐阅读
相关标签
  

闽ICP备14008679号