目录
-
安装 Pyecharts
-
准备词云数据
-
基本词云图绘制
-
自定义词云图样式
-
使用自定义图片形状
-
从文本生成词频数据
-
常见问题与技巧
-
完整示例
1. 安装 Pyecharts
首先,确保你的环境中已经安装了 Pyecharts。如果未安装,可以通过 pip 安装:
bash
pip install pyecharts
Pyecharts 有两个大版本(v0.5.X 和 v1),它们之间不兼容。v0.5.X 已经停止维护,新版本默认安装 v1(要求 Python 3.6+),因此建议使用 v1 版本。
2. 准备词云数据
词云图需要的数据是一个包含词语及其权重(如频率)的列表,每个元素是一个元组 (词, 权重),或者是一个字典格式。权重值越大,显示的词语字体就越大。
# 示例数据,支持列表嵌套元组形式
data_pairs = [
('Python', 1000),
('数据可视化', 618),
('Pyecharts', 438),
('词云图', 405),
('数据分析', 246),
('机器学习', 210),
('大数据', 140),
('人工智能', 100)
]
# 若原始数据为字典形式,可转换为上述格式
word_frequencies = {
"Python": 100,
"Java": 80,
"C++": 60,
"JavaScript": 50,
"数据分析": 90,
"机器学习": 70,
"人工智能": 85,
"深度学习": 75,
"区块链": 40,
"大数据": 60
}
data_pairs = list(word_frequencies.items()) # 转换为统一格式
3. 基本词云图绘制
使用 Pyecharts 中的 WordCloud 类可以轻松创建词云图。
from pyecharts.charts import WordCloud
from pyecharts import options as opts
# 初始化词云图
wordcloud = WordCloud()
# 配置数据参数
wordcloud.add(
series_name="", # 系列名称(可选)
data_pair=data_pairs, # 词频数据
word_size_range=[20, 100], # 字号范围
shape="circle", # 形状:圆形
)
# 设置全局配置
wordcloud.set_global_opts(
title_opts=opts.TitleOpts(title="基本词云图示例"), # 图表标题
)
# 设置系列样式
wordcloud.set_series_opts(
label_opts=opts.LabelOpts(is_show=False), # 隐藏标签
)
# 输出HTML文件
wordcloud.render("basic_wordcloud.html")
# Jupyter Notebook中直接显示
# wordcloud.render_notebook()
运行上述代码后,会生成一个名为 basic_wordcloud.html 的文件,用浏览器打开即可查看交互式词云图。
4. 自定义词云图样式
Pyecharts 提供了丰富的参数来自定义词云图的样式。
链式调用写法(更简洁)
custom_wc = (
WordCloud()
.add(
series_name="自定义词云",
data_pair=data_pairs,
word_size_range=[15, 80], # 字体大小范围
shape="cardioid", # 心形轮廓
word_gap=10, # 词间距
rotate_step=45, # 旋转角度增量
textstyle_opts=opts.TextStyleOpts(
color=None, # 默认随机配色
font_family="Microsoft YaHei", # 指定字体
font_size=None # 字体大小随权重变化
),
emphasis_shadow_blur=10, # 悬停阴影模糊度
emphasis_shadow_color="rgba(0, 0, 0, 0.5)" # 阴影颜色
)
.set_global_opts(
title_opts=opts.TitleOpts(
title="个性化词云图",
title_textstyle_opts=opts.TextStyleOpts(font_size=30, color="#333"),
pos_left="center",
pos_top="top"
),
tooltip_opts=opts.TooltipOpts(is_show=True) # 启用提示框
)
.set_series_opts(
label_opts=opts.LabelOpts(
is_show=True,
position="inside",
font_size=12,
formatter="{b}", # 显示词语文本
rotate=30, # 标签旋转
font_family="Arial"
)
)
)
custom_wc.render("custom_wordcloud.html")
5. 使用自定义图片形状
除了内置形状,Pyecharts 还支持使用自定义图片作为词云轮廓。
from pyecharts.globals import SymbolType
# 使用内置钻石形状创建词云
diamond_wc = (
WordCloud()
.add("", data_pairs, word_size_range=[20, 100], shape=SymbolType.DIAMOND)
.set_global_opts(title_opts=opts.TitleOpts(title="钻石形状词云"))
)
diamond_wc.render("diamond_wordcloud.html")
# 使用自定义图片作为词云轮廓
# 建议使用背景单一、对比度高的图片(支持jpg/jpeg/png/ico等格式)
custom_shape_wc = (
WordCloud()
.add(
"",
data_pairs,
word_size_range=[20, 100],
mask_image="path/to/your/image.png", # 替换为实际图片路径
# 注意:使用mask_image后通常无需再指定shape参数
)
.set_global_opts(title_opts=opts.TitleOpts(title="自定义形状词云"))
)
custom_shape_wc.render("custom_shape_wordcloud.html")
from pyecharts.globals import SymbolType
# 使用内置符号形状(例如钻石)
shape_wc = (
WordCloud()
.add("", data_pairs, word_size_range=[20, 100], shape=SymbolType.DIAMOND)
.set_global_opts(title_opts=opts.TitleOpts(title="钻石形状词云"))
)
shape_wc.render("shape_wordcloud.html")
# 使用本地图片作为轮廓 (注意:图片背景最好单一,对比度高)
# 支持 jpg, jpeg, png, ico 等格式
image_shape_wc = (
WordCloud()
.add(
"",
data_pairs,
word_size_range=[20, 100],
mask_image="path/to/your/image.png", # 替换为你的图片路径
# 注意:使用了 mask_image 后,shape 参数通常就不需要了
)
.set_global_opts(title_opts=opts.TitleOpts(title="自定义图片形状词云"))
)
image_shape_wc.render("image_shape_wordcloud.html")
注意:使用 mask_image 参数时,首次渲染可能会遇到词云图空白的情况,这是 ECharts 底层库的一个已知问题,刷新浏览器页面通常即可正常显示。
6. 从文本生成词频数据
在实际应用中,我们通常需要从大段文本(如文章、评论)中提取关键词并统计词频来生成数据。
import jieba # 中文分词工具
from collections import Counter
# 安装jieba: pip install jieba
def generate_word_freq_from_text(text_path, stopwords_path=None, top_n=200):
"""
统计文本文件中词语出现频率
:param text_path: 待处理文本文件路径
:param stopwords_path: 停用词文件路径(可选)
:param top_n: 返回高频词数量
:return: 词频列表 [('词语', 频次), ...],按频次降序排列
"""
# 读取文本内容
with open(text_path, 'r', encoding='utf-8') as f:
text = f.read().replace('\n', '').replace(' ', '')
# 中文分词处理
seg_list = jieba.cut(text)
# 加载停用词表
stopwords = set()
if stopwords_path:
with open(stopwords_path, 'r', encoding='utf-8') as f:
stopwords = {line.strip() for line in f}
# 过滤停用词并统计词频
words = [word for word in seg_list
if word not in stopwords and len(word) > 1] # 过滤单字词
word_freq = Counter(words)
# 返回最高频的top_n个词
return word_freq.most_common(top_n)
# 使用示例
# word_freq = generate_word_freq_from_text('文本.txt', '停用词.txt')
# 获取的词频数据可用于生成词云
7. 常见问题与技巧
-
数据格式:确保数据格式是
[('词1', 权重1), ('词2', 权重2), ...]或由字典.items()转换而来的类似形式。 -
形状选择:
shape参数支持多种内置形状,如'circle','cardioid','diamond','triangle','star','pentagon'等。 -
样式调整:
-
word_size_range:控制最小和最大字体大小。 -
word_gap:控制词与词之间的间距。 -
rotate_step:控制词语旋转的最大角度。
-
-
交互功能:Pyecharts 生成的 HTML 词云图是交互式的,鼠标悬停可以查看词语的权重。
8. 完整示例
下面是一个结合了上述步骤的完整示例:
from pyecharts.charts import WordCloud
from pyecharts import options as opts
import jieba
import collections
# 1. 准备词频数据
word_freq = {
'Python': 1000, '数据可视化': 618, 'Pyecharts': 438, '词云图': 405,
'数据分析': 246, '机器学习': 210, '大数据': 140, '人工智能': 100,
'编程': 95, '开发': 88, '学习': 85, '教程': 80, '代码': 75, '算法': 70
}
word_pairs = list(word_freq.items())
# 2. 构建词云图
wordcloud = (
WordCloud()
.add(
series_name="技术词云",
data_pair=word_pairs,
word_size_range=[15, 80],
shape="diamond",
word_gap=15,
rotate_step=20,
textstyle_opts=opts.TextStyleOpts(font_family="Microsoft YaHei")
)
.set_global_opts(
title_opts=opts.TitleOpts(
title="技术关键词词云",
title_textstyle_opts=opts.TextStyleOpts(font_size=20)
),
tooltip_opts=opts.TooltipOpts(is_show=True, background_color="rgba(0,0,0,0.7)")
)
.set_series_opts(label_opts=opts.LabelOpts(is_show=True, position="inside", formatter="{b}"))
)
# 3. 生成HTML文件
wordcloud.render("technology_wordcloud.html")
print("词云图已保存为 technology_wordcloud.html")
8万+

被折叠的 条评论
为什么被折叠?



