wordcloud生成词云图(含形状、颜色设置)

本文详细介绍了如何使用Python的wordcloud库生成词云图,包括设置字体、停用词、蒙版、颜色等。通过示例展示了从词频统计到词云图的生成过程,并提供了两种不同的处理方式。此外,还讲解了如何自定义词云颜色,包括使用图像颜色和预设颜色列表。
摘要由CSDN通过智能技术生成

一、导入和主要方法

1、导入wordcloud包
生成词云图之后还要显示出来,所以还会用到matplotlib
如果要设置mask蒙版,还需要从imageio导入imread()函数
如果需要设置词云中字体的颜色,还会用到matplotlib中的colors

import wordcloud
import matplotlib.pyplot as plt
from imageio import imread
from matplotlib import colors

2、主要方法

wc = wordcloud.WordCloud(...)
wc.fit_words(frequencies) #根据词频生成词云图
wc.generate(text)  #根据文本生成词云

wc.to_file()
wc.to_array(filename)

其中“ 根据词频生成 ”和“ 根据文本生成 ”两种方法中只能选取一种。

(1)wordcloud.WordCloud()参数说明

  这个也是参数最多的地方

font_path : string 
		//字体路径,词云图默认不支持中文,所以一般都要设置该参数

stopwords :字符串列表
		//设置需要屏蔽的词,如果为空,则使用内置的STOPWORDS

mask : nd-array
		//如果不设置,则词云是正规矩形。
		//如果 mask 非空,设置的宽高值将被忽略,遮罩形状被 mask 取代。
		//一般结合imread(),将图片中不是白色的地方作为轮廓。
		
width : int 
		//输出的画布宽度,默认为400像素,越宽,词云中包含的关键词越多

height : int 
		//输出的画布高度,默认为200像素

prefer_horizontal : float (default=0.90) 
		//词语水平方向排版出现的频率,默认 0.9 (所以词语垂直方向排版出现频率为 0.1 )

max_words : number (default=200) 
		//要显示的词的最大个数
		
min_font_size : int (default=4) 
		//显示的最小的字体大小

colormap : string or matplotlib colormap, default=”viridis” 
		//给每个单词随机分配颜色,若指定color_func,则忽略该方法

background_color : color value (default=”black”) 
		//背景颜色,如background_color='white',背景颜色为白色。

max_font_size : int or None (default=None) 
		//显示的最大的字体大小
		
relative_scaling : float (default=.5) 
		//词频和字体大小的关联性

****************一些不常用的参数**************

color_func : callable, default=None 
		//生成新颜色的函数,如果为空,则使用 self.color_func

regexp : string or None (optional) 
		//使用正则表达式分隔输入的文本

font_step : int (default=1) 
		//字体步长,如果步长大于1,会加快运算但是可能导致结果出现较大的误差。

scale : float (default=1)
		//按照比例进行放大画布,如设置为1.5,则长和宽都是原来画布的1.5倍。

其中也写参数的具体设置在后面的例子中看。

(2)wc.fit_words(frequencies)

frequencies是一个字典,键为单词,值为出现的次数

(3)wc.generate(text)

text没啥好说的,就是一段文字

二、实例

包括了,字体设置、颜色设置、蒙版设置、

1、例一:wc.fit_words(frequencies)先去停用词

from  wordcloud import WordCloud
import jieba
from collections import Counter
from imageio import imread
import matplotlib.pyplot as plt

"""获取文本内容"""
with open("济南的冬天.txt","r",encoding="utf-8") as fp:
    content = fp.read()
words_temp = jieba.lcut(content)
words = []
"""读取停用词"""
with open("C:/停用词/哈工大停用词.txt","r",encoding="utf-8") as fp:
    stopwords = [s.rstrip() for s in fp.readlines()]

"""去掉切分词语中的停用词"""
for w in words_temp:
    if w not in stopwords:
        words.append(w)
        
frequency = dict(Counter(words))	#去停用词之后的词频统计结果

font = "C:/Fonts/AaMingYueJiuLinTian.ttf"
mask_image = imread("20160303160528046.png")

wc = WordCloud(font_path=font,
              background_color="white",
              mask=mask_image)

wc.fit_words(frequency)#基于前面的词频统计

plt.imshow(wc)
plt.axis("off")
plt.show()
wc.to_file("C:/Users/lenovo/Desktop/pic/6.png")

在这里插入图片描述
上例是手动先去除掉分词结果中的停用词,然后统计词频,再直接画图。
下面这个例子,没有手动去除停用词,直接统计词频,但是在WordCloud函数中设置了stopwords参数,这样更加方便,而且和上面的方法使用的还是同一个停用词表。(但是画出的图好像不大一样)

2、例二:wc.fit_words(frequencies)在WordCloud()中去停用词

"""获取文本内容"""
with open("济南的冬天.txt","r",encoding="utf-8") as fp:
    content = fp.read()
words = jieba.lcut(content)

"""读取停用词"""
with open("C:/停用词/哈工大停用词.txt","r",encoding="utf-8") as fp:
    stopwords = [s.rstrip() for s in fp.readlines()]
        
frequency = dict(Counter(words)) #没有去掉停用词的词频统计

font = "C:/Fonts/AaMingYueJiuLinTian.ttf"
mask_image = imread("20160303160528046.png")

wc = WordCloud(font_path=font,
              background_color="white",
              mask=mask_image,
              stopwords=stopwords)	#加载停用词

wc.fit_words(frequency)

plt.imshow(wc)
plt.axis("off")
plt.show()
wc.to_file("C:/Users/lenovo/Desktop/pic/6.png")

在这里插入图片描述
小总结:wc.fit_words(frequencies)逻辑:

  1. 分词(加载用户词典、去停用词)、统计词频
  2. 生成wordcloud对象
  3. 处理(plt画图、保存图像)

3、例三:wc.generate(text)

"""获取文本内容"""
with open("济南的冬天.txt","r",encoding="utf-8") as fp:
    content = fp.read()
    
font = "C:/Fonts/AaMingYueJiuLinTian.ttf"
mask_image = imread("20160303160528046.png")

wc = WordCloud(font_path=font,
              background_color="white",
              mask=mask_image)

wc.generate(content)

plt.imshow(wc)
plt.axis("off")
plt.show()
wc.to_file("C:/Users/lenovo/Desktop/pic/7.png")

在这里插入图片描述
在上例中,我也尝试了在WordCloud()方法中设置了stopwords参数,但是一点效果也没有。

小总结:wc.generate(text)处理逻辑

  1. 读取文本
  2. 生成WordCloud对象
  3. 处理(展示、保存)

三、颜色设置

最后再来看看词云的颜色设置,默认情况下,词云的颜色是随机的;

方法一:

wordcloud.ImageColorGenerator(image, default_color=None)返回一个颜色生成器,把这个值赋值给WordCloud()中的color_func参数,效果就是单词的颜色和图像中对应位置的色彩一样。
也可以使用colormap参数手动设置需要使用的颜色,

方法二:

WordCloud()的colormap参数值需要使用matplotlib的colors库中的ListedColormap方法。要注意方法一和二的两个参数值不能同时使用。

方法一:

from  wordcloud import ImageColorGenerator

font = "C:/Fonts/AaMingYueJiuLinTian.ttf"
mask_image = imread("20160303160528046.png")

bg_color = ImageColorGenerator(mask_image, default_color=None)
wc = WordCloud(font_path=font,
              background_color="white",
              mask=mask_image,
              color_func=bg_color)


wc.fit_words(frequency)

plt.imshow(wc)
plt.axis("off")
plt.show()
wc.to_file("C:/Users/lenovo/Desktop/pic/8.png")

在这里插入图片描述

方法二

from matplotlib import colors

color_list = ['#FF0000','#a41a1a']#建立颜色数组
colormap = colors.ListedColormap(color_list)#调用
#再把这个放到WordCloud()中的colormap参数值就行了

font = "C:/Fonts/AaMingYueJiuLinTian.ttf"
mask_image = imread("20160303160528046.png")

wc = WordCloud(font_path=font,
              background_color="white",
              mask=mask_image,
              colormap=colormap)

wc.fit_words(frequency)

plt.imshow(wc)
plt.axis("off")
plt.show()
wc.to_file("C:/Users/lenovo/Desktop/pic/8.png")

在这里插入图片描述

### 回答1: MyBatis是一个流行的持久层框架,它可以将SQL语句和Java对象之间的映射关系定义在XML文件或注解中,并提供了丰富的查询语言和灵活的参数绑定方式。在使用MyBatis进行数据操作时,有时会遇到插入唯一异常的问题,下面让我们一起来看看如何解决这个问题。 1. 异常描述 当我们向数据库插入一条记录时,如果违反了唯一性约束,就会抛出插入唯一异常,如下所示: ``` ### Error updating database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry 'xxx' for key 'name_unique' ### The error may involve com.example.mapper.UserMapper.insert-Inline ### The error occurred while setting parameters ### SQL: insert into user(name, age) values (?, ?) ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry 'xxx' for key 'name_unique' ``` 其中,'xxx'表示违反唯一性约束的值,'name_unique'表示违反唯一性约束的字段名。 2. 解决方法 为了避免插入唯一异常,我们可以采取以下两种解决方法: 2.1 使用INSERT IGNORE语句 在MySQL中,可以使用INSERT IGNORE语句来向表中插入记录,如果遇到违反唯一性约束的情况,就会忽略该记录,而不是抛出异常。因此,我们可以将MyBatis的插入语句改为INSERT IGNORE语句,如下所示: ``` <insert id="insertUser" parameterType="com.example.entity.User"> INSERT IGNORE INTO user(name, age) VALUES (#{name}, #{age}) </insert> ``` 2.2 使用ON DUPLICATE KEY UPDATE语句 在MySQL中,还可以使用ON DUPLICATE KEY UPDATE语句来向表中插入记录,如果遇到违反唯一性约束的情况,就会更新该记录,而不是抛出异常。因此,我们可以将MyBatis的插入语句改为ON DUPLICATE KEY UPDATE语句,如下所示: ``` <insert id="insertUser" parameterType="com.example.entity.User"> INSERT INTO user(name, age) VALUES (#{name}, #{age}) ON DUPLICATE KEY UPDATE age = #{age} </insert> ``` 其中,ON DUPLICATE KEY UPDATE语句指定了更新操作的字段和值,这里我们只更新了年龄字段。 以上就是解决MyBatis插入唯一异常的两种方法,根据具体情况选择适合自己的方法即可。 ### 回答2: 在使用MyBatis进行插入操作时,可能会遇到插入唯一异常。该异常通常是由于数据库表的唯一约束导致的。 当我们向数据库表插入数据时,如果违反了唯一约束,数据库将抛出异常,表示插入失败。常见的唯一约束有主键约束、唯一索引等。 解决这个问题的方法有两种: 1. 在程序中进行唯一性校验:在执行插入操作之前,可以先查询数据库中是否已存在相同的数据。如果已存在,则不进行插入操作,避免了唯一异常的发生。这种方法比较消耗数据库资源,但可以保证数据的唯一性。 2. 使用数据库的"insert ignore"或"insert on duplicate key update"语句:这种方法是在插入操作时,使用特殊的语句来处理唯一异常。"insert ignore"语句会即使发生唯一异常,也不会抛出异常,而是直接忽略这条插入数据;"insert on duplicate key update"语句则是在发生唯一异常时,执行更新操作。这种方法相对较为简洁高效,但需要根据数据库的不同进行调整。 总结来说,解决MyBatis插入唯一异常的方法有多种,可以通过程序中进行唯一性校验,或者使用特殊的数据库插入语句来处理。需要根据具体情况选择最合适的方法来解决唯一异常问题。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值