合理应用词云图,快速提升你的幻灯展示效果!|科研插图·24-09-08

news2024/11/15 6:49:38

小罗碎碎念

本期主题:词云图

这一期推文介绍一个非常具有实用价值的图——词云图,正好最近在准备开题答辩的PPT,顺手写一期推文,和大家分享一下。

R语言和Python的代码都准备了一份,其中Python的版本就是我用自己开始写推文以来所有推荐的期刊作为数据源,挑选了频率最高的20个期刊做的演示,大家也可以替换为自己的数据,去定制自己词云图!!

image-20240908095933209

image-20240908100021297


一、定义

词云(亦称为标签云或加权列表)是文本数据的可视化呈现。通常,词云中的词汇为单个词语,每个词语的重要性通过字体大小或颜色来展示。

以下是一个示例,展示了著名法国说唱艺术家Nekfeu在其几首歌曲中最常使用的词汇。


这段代码首先导入了所需的库,然后从GitHub加载了一个数据集。接下来,它过滤掉了不需要的单词,如数字、特殊字符和一些常见的停用词。然后,它使用wordcloud2库创建了一个词云图,显示了特定艺术家(nekfeu)的30个最低频单词。词云图的背景颜色为白色,单词颜色为#69b3a2。

# 导入所需的库
library(tidyverse) # 数据处理和可视化
library(hrbrthemes) # 用于美化ggplot2图形
library(tm) # 文本挖掘
library(proustr) # 提供普鲁斯特停用词列表

# 从GitHub加载数据集
data <- read.table("https://raw.githubusercontent.com/holtzy/data_to_viz/master/Example_dataset/14_SeveralIndepLists.csv", header=TRUE)
to_remove <- c("_|[0-9]|\\.|function|^id|script|var|div|null|typeof|opts|if|^r$|undefined|false|loaded|true|settimeout|eval|else|artist")
# 过滤掉不需要的单词
data <- data %>% filter(!grepl(to_remove, word)) %>% filter(!word %in% stopwords('fr')) %>% filter(!word %in% proust_stopwords()$word)

# 使用wordcloud2库创建词云
library(wordcloud2)

# 准备一个包含最常见单词的列表(前50个)
mywords <- data %>%
  filter(artist=="nekfeu") %>%
  dplyr::select(word) %>%
  group_by(word) %>%
  summarize(freq=n()) %>%
  arrange(freq) %>%
  tail(30) # 只保留频率最低的30个单词

# 创建词云图
wordcloud2(mywords,  minRotation = -pi/2, maxRotation = -pi/2,
         backgroundColor = "white", color="#69b3a2")

image-20240908092136630


二、用途

词云用于快速识别最突出的术语,并通过字母顺序定位某个术语以确定其相对重要性。它广泛应用于媒体领域,并为公众所熟知。

然而,词云作为一种信息传达方式,因其缺乏准确性而受到高度批评。这主要是由于以下两个主要原因:
面积作为数值的隐喻,对于人眼来说难以准确感知。因此,读者难以将单词的大小转换为精确的频率。

由于较长单词由更多字母组成,因此在构造上显得更大。这种偏差使得词云的准确性进一步降低。

一个有效的解决方案是使用条形图或棒棒糖图来替代。以下是一个使用与前一个图表相同数据的示例:


这段代码首先筛选出特定艺术家(nekfeu)的数据,然后计算每个单词的频率,并选择频率最低的30个单词。接下来,它使用ggplot2库创建了一个条形图,显示了这些单词及其频率。条形图的背景颜色为默认值,单词颜色为#69b3a2。通过应用theme_ipsum()主题,图形的外观得到了美化。最后,移除了次要和主要的网格线以及图例,并将x轴标签设置为空。

# 准备一个包含最常见单词的列表(前30个)
data %>%
  filter(artist=="nekfeu") %>% # 筛选特定艺术家的数据
  dplyr::select(word) %>% # 选择单词列
  group_by(word) %>% # 按单词分组
  summarize(freq=n()) %>% # 计算每个单词的频率
  arrange(freq) %>% # 按频率排序
  tail(30) %>% # 选择频率最低的30个单词
  mutate(word=factor(word, word)) %>% # 将单词转换为因子,以便在ggplot中正确显示
  ggplot( aes(x=word, y=f5)) + # 使用ggplot创建图形,设置x轴为单词,y轴为频率
    geom_segment( aes(x=word ,xend=word, y=0, yend=freq), color="grey") + # 添加垂直线段,表示单词的频率
    geom_point(size=3, color="#69b3a2") + # 添加点,表示单词的频率
    coord_flip() + # 将x轴和y轴互换,使单词在水平方向上排列
    theme_ipsum() + # 应用hrbrthemes库中的主题
    theme(
      panel.grid.minor.y = element_blank(), # 移除次要网格线
      panel.grid.major.y = element_blank(), # 移除主要网格线
      legend.position="none" # 移除图例
    ) +
  xlab("") # 设置x轴标签为空

image-20240908092425207


三、变体

词云存在多种变体。形状常常被改变,有时会使用与主题相关的物体形状。此外,还可以调整文本的方向、字体、大小、颜色等。

这段代码首先筛选出特定艺术家(nekfeu)的数据,然后计算每个单词的频率,并选择频率最高的前200个单词。接下来,它使用wordcloud2库创建了一个词云图,显示了这些单词及其频率。词云图的形状为星形,背景颜色为白色,单词颜色为#69b3a2。

为了将词云图保存为图片,代码使用了webshot库。首先,它将词云图保存为一个临时的HTML文件。然后,使用webshot函数将HTML文件转换为PNG图片。图片的宽度、高度和延迟时间分别设置为700像素、700像素和5秒。


# 准备一个包含最常见单词的列表(前200个)
mywords <- data %>%
  filter(artist=="nekfeu") %>% # 筛选特定艺术家的数据
  dplyr::select(word) %>% # 选择单词列
  group_by(word) %>% # 按单词分组
  summarize(freq=n()) %>% # 计算每个单词的频率
  arrange(desc(freq)) %>% # 按频率降序排序
  head(200) # 选择频率最高的前200个单词

# 创建词云图
library(webshot) # 导入webshot库,用于将HTML图形转换为图片
#webshot::install_phantomjs() # 安装PhantomJS,用于渲染HTML图形(如果尚未安装)

# 生成词云图
my_graph=wordcloud2(mywords,  size=0.6, shape = 'star', backgroundColor = "white", color="#69b3a2")

library("htmlwidgets") # 导入htmlwidgets库,用于保存HTML图形
saveWidget(my_graph,"tmp.html", selfcontained = F) # 将词云图保存为临时HTML文件

# 将HTML图形转换为PNG图片
webshot("tmp.html","IMG/fig_1.png", delay =5, vwidth = 700, vheight=700)

image-20240908093529840


四、Python版本

4-1:方形版本

import pandas as pd
from wordcloud import WordCloud
import matplotlib.pyplot as plt

# 读取Excel文件
file_path = '/Users/luoxiaoluotongxue/Desktop/master_record/科研绘图/每日科研绘图/24-09/期刊统计.xlsx'  # 替换为你的Excel文件路径
df = pd.read_excel(file_path)

# 确保数据只有一列
if df.shape[1] != 1:
    raise ValueError("Excel文件必须只包含一列数据")

# 获取频率最高的十个值
top_ten = df.iloc[:, 0].value_counts().head(20)  # 确保选择正确的列

# 将频率最高的十个值转换为字符串形式
top_ten_str = ' '.join([f"{word} {freq}" for word, freq in top_ten.items()])

# 生成词云图
wordcloud = WordCloud(width=800, height=400, background_color='white', max_words=20).generate(top_ten_str)

# 显示词云图
plt.figure(figsize=(12, 6))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')  # 不显示坐标轴
plt.show()

# 保存词云图
wordcloud.to_file('wordcloud.png')

wordcloud


4-2:圆形版本

import numpy as np
import pandas as pd
from wordcloud import WordCloud
import matplotlib.pyplot as plt
from PIL import Image

# 读取Excel文件
file_path = '/Users/luoxiaoluotongxue/Desktop/master_record/科研绘图/每日科研绘图/24-09/期刊统计.xlsx'  # 替换为你的Excel文件路径
df = pd.read_excel(file_path)

# 确保数据只有一列
if df.shape[1] != 1:
    raise ValueError("Excel文件必须只包含一列数据")

# 获取频率最高的十个值
top_ten = df.iloc[:, 0].value_counts().head(20)  # 确保选择正确的列

# 将频率最高的十个值转换为字符串形式
top_ten_str = ' '.join([f"{word} {freq}" for word, freq in top_ten.items()])

# 创建一个圆形的二值图像
x, y = np.ogrid[:800, :400]
mask = (x - 400) ** 2 + (y - 200) ** 2 > 200 ** 2
mask = 255 * mask.astype(int)

# 生成圆形词云图
wordcloud = WordCloud(width=800, height=400, background_color='white', max_words=20, mask=mask).generate(top_ten_str)

# 显示词云图
plt.figure(figsize=(12, 6))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')  # 不显示坐标轴
plt.show()

# 保存词云图
wordcloud.to_file('circular_wordcloud.png')

circular_wordcloud

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2115619.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

复制PPT模板

文章目录 环境需求步骤参考 环境 Windows 11 家庭中文版WPS Office&#xff1a;2024夏季更新 (17827) 注&#xff1a;查看WPS Office版本的方法&#xff1a; 点击左上角的“WPS Office”图标&#xff0c;然后点击右上角的三条横线&#xff0c;在弹出菜单中&#xff0c;选择“…

仕考网:公务员面试流程介绍

通知进面信息——资格审查——面试签到——抽签候考 面试形式&#xff1a; 面试分为结构化和无领导小组两种形式 1.在结构化面试中&#xff0c;当轮到某位考生时&#xff0c;引导员将在候考室宣布其编号&#xff0c;随后考生跟随引导人员前往考场入口。考生在开始考试时需回…

Origin画图——怎么才能使折线图更好看

1.这是化的原始图&#xff0c;看着也不错&#xff0c;但是总觉得缺少什么东西 2.下面就来对其进行改造&#xff0c;首先改的是坐标轴和标签。刻度的显示&#xff0c;网格线取消&#xff0c;坐标轴上轴右轴的刻度取消&#xff0c;字体的大小与style改成Arial。 3.对图层底色…

oc打包:权限弹窗无法正常弹出

在遇到编写了权限无法弹出弹窗时,需要查看是不是调用时机不对,这里直接教万能改法。 将权限获取方法编写在applicationDidBecomeActive 进入前台的生命周期接口中,如下: if (@available(iOS 14, *)) {NSLog<

基于yolov5的水稻叶病害检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv5的水稻叶病害检测系统是一种利用深度学习技术实现的高效、准确的病害识别工具。该系统采用YOLOv5算法&#xff0c;该算法以其高效的检测速度和良好的识别准确性在目标检测领域广受好评。 该系统能够实时处理水稻叶片的图像数据&#xff0c;快速准确地…

SpringBoot登录退出|苍穹外卖登录退出分析

文章目录 概要整体流程注意事项一、拦截路径二、token三、注册防止用户重复提交 苍穹外卖登录退出分析注意解决JWT退出后依然有效的问题 概要 结合Spring Boot和Vue3实现安全的用户登录和退出功能&#xff0c;并使用拦截器、JWT和Redis缓存来提高系统的安全性和性能。 整体流…

NC 合并二叉树

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 描述 已知两颗二叉…

【魔法 / NOI】

题目 思路 动态规划&#xff1a; 状态定义&#xff1a; f [ k ] [ i ] [ j ] 对应使用了不超过 k 次魔法&#xff0c;从 i 到 j 的路径集合 f[k][i][j] 对应使用了不超过k次魔法&#xff0c;从i到j的路径集合 f[k][i][j]对应使用了不超过k次魔法&#xff0c;从i到j的路径集合 状…

驱动(RK3588S)第八课时:平台设备总线

目录 目标一、平台设备总线的概念1、什么是平台设备总线2、平台设备总线 platform 的匹配3、设备树和平台设备总线的关系&#xff0c;以及匹配 二、平台设备总线的函数接口1、注册设备端的资源信息2、设备端提供的资源的信息3、注销申请的设备端的资源4、驱动端的函数&#xff…

如何做好网络安全

随着互联网技术的飞速发展&#xff0c;网站已成为企业对外展示、交流和服务的重要窗口。然而&#xff0c;随之而来的网站安全问题也日益凸显&#xff0c;给企业的业务发展和用户数据安全带来了巨大威胁。因此&#xff0c;高度重视网站安全已成为网络安全的首要任务。今天我们就…

【Effective Java】多构造器参数使用构建器 (快速上手)

Java系列文章目录 补充内容 Windows通过SSH连接Linux 第一章 Linux基本命令的学习与Linux历史 文章目录 Java系列文章目录一、前言二、学习内容&#xff1a;2.1 为什么引入构建器2.2 建造者模式2.2.1书中的例子2.2.2 例子加上有效性检查 三、问题描述四、解决方案&#xff1a;…

如何对列表、字符串进行分组

如何对列表、字符串进行分组 1、效果 2、代码 使用python自带库collections中的Counter函数即可实现 代码如下: # -*- coding: utf-8 -*-""" @contact: @file: test.py @time: 2024/9/8 11:18 @author: LDC """ from collections import Co…

Vivado时序报告之Report pulse width详解

目录 一、前言 二、Report pulse width 2.1 Report pulse width 2.2 配置界面 2.3 分析结果 一、前言 在进行时序分析时&#xff0c;除了slack的分析&#xff0c;还存在pulse width的检查&#xff0c;下面将对pulse width检查进行详细说明。在report timing summary报告中…

《粮食科技与经济》是什么级别的期刊?是正规期刊吗?能评职称吗?

​问题解答 问&#xff1a;《粮食科技与经济》是不是核心期刊&#xff1f; 答&#xff1a;不是&#xff0c;是知网收录的第一批认定学术期刊。 问&#xff1a;《粮食科技与经济》级别&#xff1f; 答&#xff1a;省级。主管单位&#xff1a; 湖南省粮食和物资储备局 …

C#发送正文带图片带附件的邮件

1&#xff0c;开启服务&#xff0c;获取授权码。以QQ邮箱为例&#xff1a; 点击管理服务&#xff0c;进入账号与安全页面 2&#xff0c;相关设置参数&#xff0c;以QQ邮箱为例&#xff1a; 登录时&#xff0c;请在第三方客户端的密码输入框里面填入授权码进行验证。&#xff0…

日语输入法平假名和片假名切换

在学日语输入法的时候&#xff0c;我们在使用罗马音输入的时候&#xff0c;在进行平假名和片假名切换&#xff1a; 1、使用电脑在打字&#xff0c;日语输入法切换的时候使用 Shift Alt 如果日语输入法显示为 A 需要切换为 あ的话可以按Caps Lock键 。&#xff08;相当于中文…

【LeetCode】 Z 字形变换

1. 题目 2. 分析 充分地思考问题&#xff0c;然后得出抽象解&#xff0c;最后再写代码。 本题初看是有点儿麻烦的&#xff0c;因为有个N型的变换&#xff0c;但是如果把这个N型压缩一下&#xff0c;其实就是考虑每行放什么值的问题。那么问题就简化成当前的字符串的字符需要放…

C++中的一个标准输出流——cout

目录 开头1.什么是cout?2.C中的一个标准输出流——cout的实际应用打印“Hello, world!”打印大方块打印一个变量 下一篇博客要说的东西 开头 大家好&#xff0c;我叫这是我58。今天&#xff0c;我们要学一下关于C中的一个标准输出流——cout的一些知识。 1.什么是cout? cou…

react js 笔记 3

起因&#xff0c; 目的: 专注。 学习 react js 的时候&#xff0c; 就专注这一方面 &#xff0c;其他都不要碰。 比如&#xff0c; python, C语言&#xff0c; R, 都不看。 只看 js.专注&#xff0c;减少来回切换。 重复。 自己写的笔记&#xff0c;需要反复多看几遍&#xff…

如何使用正则表达式替换字符串中的特定位置数字

如何使用正则表达式替换字符串中的特定位置数字 1、效果 把字符串中的第一个123替换掉: 2、代码 使用正则中的sub函数: re.sub(pattern,repl,string,count=0,flags=0) pattern:表示需要匹配的模式,即需要被替换的字符或字符串。 repl:表示替换后的字符串或函数,用于…