欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

在这做一个词云图生成器来送给大家(附代码),建议收藏

程序员文章站 2022-07-09 19:31:47
前言 本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。 作者:雁陎 如果你处于想学Python或者正在学习Python,Python的教程不少了吧,但是是最新的吗?说不定你学了可能是两年前人家就学过的内容,在这小编分享一波2020 ......

前言

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。

作者:雁陎

如果你处于想学python或者正在学习python,python的教程不少了吧,但是是最新的吗?说不定你学了可能是两年前人家就学过的内容,在这小编分享一波2020最新的python教程。获取方式,私信小编 “ 资料 ”,即可免费获取哦!

前几天做ppt,要展示的内容有很多关键词,就想到了云字图这种玩意,没想到网上一搜,在线生成的网站要么需要付费,要么不支持指定形状生成,一气之下干脆自己写了一个。幸好python有这个库wordcloud,所以很快就实现了这个功能。后续优化了一下(渣优化),觉得基本能用了。

做好后的成果如下图:

在这做一个词云图生成器来送给大家(附代码),建议收藏

 

环境

所使用的版本为python3.6.5(anaconda)

  • wordcloud 云字图生成库
  • matplotlib 绘图库,常和numpy一起使用
  • numpy 数组函数库,矩阵运算必用
  • pil 图像操作模块
  • random 随机数模块
  • jieba 中文分词模块

代码

# -*- coding: utf-8 -*-
"""
created on fri sep 29 13:14:22 2019
        self.
@author: 雁陎
"""

from wordcloud import (wordcloud, imagecolorgenerator)
from matplotlib import pyplot as plt
import numpy as np
from pil import image
from random import randint
import jieba

lines=[]
with open('config.txt','r') as handler:
    lines = handler.readlines()

a,b = map(int,lines[3].split(','))  # 颜色h的范围
bgcolor = lines[7].strip('\n').lower()  # 背景颜色
if bgcolor == 'none':
    bgcolor = none
w,h = map(int,lines[9].split(',')) # 云字图尺寸

def font_select():
    font_input = lines[5].strip('\n')
    font_dict = {'微软雅黑':r'\msyh.ttc','楷体':r'\simkai.ttf','宋体':r'\simsun.ttc',
             '仿宋':r'\simfang.ttf','隶书':r'\simli.ttf','times new roman':r'times.ttf'}
    return r'c:\windows\fonts' + font_dict[font_input]   # 字体


def shape_judge():  # 判断用户选择的形状
    cloud_shape = lines[11].strip('\n').lower()  # 云字图形状
    if cloud_shape == 'rectangle':
        mask = none
    elif cloud_shape == 'round':
        x,y = np.ogrid[:w,:w]
        mask = 255*((x-w/2) ** 2 + (y-w/2) ** 2 > 4.2*w ** 2).astype(int) 
        # 以(w/2,w/2)为圆心,半径为4.2*w的圆,255不知道干什么的,但是必须有
    else:
        mask = np.array(image.open(r"shape.jpg"))
    return mask


def color_judge():   
    font_color_input = int(lines[1].strip('\n'))
    if font_color_input == 1:
        random_color = np.array(image.open(r"shape.jpg")) 
        return imagecolorgenerator(random_color)
        #字体颜色为背景图片的颜色
    else:
        def random_color_func(word=none, font_size=none, position=none, 
                              orientation=none, font_path=none, random_state=none):
            h,s,l = randint(a,b),randint(80,100),randint(25,50)
                # h即表示颜色的取值范围,我们可以谷歌colour picker 查看各颜色的取值范围对应的h值
                # 然后在参数中设置 color_func = random_color_func即可令字按照该范围设定颜色
            return "hsl({}, {}%, {}%)".format(h, s, l)

def segment_words(text):
    article_contents = ""
    #使用jieba进行分词
    words = jieba.cut(text,cut_all=false)
    for word in words:
        #使用空格来分割词,否则词组仍是一起的
        article_contents += word+" "
    return article_contents
        
def segment_judge():  # 判断分词模式
    segment_mode = int(lines[13].strip('\n'))
    text=open(u'word.txt','r').read().lower()
    if segment_mode == 1:
        return text
    else:
        return segment_words(text)

stopwords = {'.',',','"',':','(',')','.','。','(',')','[',']','”','“','\n','\t',' '}

wordcloud= wordcloud(font_path=font_select(), background_color=bgcolor, mode="rgba", 
                     color_func = color_judge(),mask= shape_judge(),width=w, 
                     height=h,stopwords = stopwords,margin=2).generate(segment_judge())

# 你可以通过font path参数来设置字体集
# width, height, margin可以设置图片属性
# backgroud_color = "black",可以设定背景颜色,默认黑色,如果想要设定透明的可以按照上面代码做
# stopwords 停用词,即云字图中不展示的词组,如各种标点、换行。
 
plt.axis("off")  # 是否绘制坐标轴
plt.show()
wordcloud.to_file('wordcloud.png')

配置文件

为了方便用户(也就是我)使用,所以配置了一个config.txt文件(不要吐槽txt,纯小白~),代码中所有的输入均来自congfig。

# 1、字体颜色模式,可选:图片颜色(1,按照即选项6中picture模式的图片颜色进行绘制,选择模式1就无需改动选项2,同时需保持选项6为picture),自定义颜色(2,即自定义颜色的范围,需要设定选项2)
2
# 2、字体颜色h的取值范围,参见https://www.webfx.com/web-design/color-picker/
40,80
# 3、字体,可选:微软雅黑,楷体,宋体,仿宋,隶书,times new roman
微软雅黑
# 4、背景颜色,英文书写如white,默认为透明(none)
none
# 5、云字图尺寸,宽,高
1000,800
# 6、云字图形状,可选:方形(rectangle,尺寸为宽,高),圆形(round,尺寸为宽,宽),或图片形状(picture,按照同目录下shape.jpg的形状绘制,尺寸为图片尺寸)
picture
# 7、分词模式,可选:自定义模式(1,即按照你所给的词组进行绘制,词组之间用空格分隔),自动分词模式(2,即给定一段话,程序自动进行分词并按照频率进行绘制)
1

使用

你的项目目录中应该有以下文件:

云字图生成

config.txt

shape.jpg

word.txt

云字图生成.py

其中,shape.jpg是所选定的图片形状,在config中设定选项6为picture后会按照这个图片的形状来生成云字图。

shape最好背景为白色,这样效果最好。

说到这里,你能看出来文章开头的效果图是谁吗?

猜猜他是谁

常见问题

有个很常见的问题就是我的字体该如何配置,如果你实际操作起来就会发现,“诶我明明指向了font文件夹中的微软雅黑.ttf”,为什么报错说没有这个字体呢?

很简单,因为你在font中看到的字体名并不是它真正的字体名,比如“微软雅黑”实际上是“msyh”。那么我该如何查看它真实的文件名?一个方便的做法是把它复制到桌面上,它就会自动显示真正的名字了。

哦对了font文件夹的地址是c:\windows\fonts

地址栏拼接的时候报错

大家可以看到在拼接字体文件字符串的时候用的是r'c:\windows\fonts'+r'\simli.ttf'而非r'c:\windows\fonts\' & r'simli.ttf',因为当字符串最后一位是\时,无法对字符串进行拼接等操作,即使用r'转义也不行,会报错syntaxerror: eol while scanning string literal。这貌似是python的一个bug,解决方法如上,\放到第二个字符串开头即可。

如果你处于想学python或者正在学习python,python的教程不少了吧,但是是最新的吗?说不定你学了可能是两年前人家就学过的内容,在这小编分享一波2020最新的python教程。获取方式,私信小编 “ 资料 ”,即可免费获取哦!