使用kennycason.kumo.WordCloud For JAVA 制作词云图

官网:https://kennycason.com/posts/2014-07-03-kumo-wordcloud.html  

一:添加POM文件

		<!-- 词云 -->
		<dependency>
			<groupId>com.kennycason</groupId>
			<artifactId>kumo-core</artifactId>
			<version>1.27</version>
		</dependency>
		<dependency>
			<groupId>com.kennycason</groupId>
			<artifactId>kumo-tokenizers</artifactId>
			<version>1.27</version>
		</dependency>

 二:词云图方法生成

import cn.hutool.core.lang.UUID;
import com.kennycason.kumo.CollisionMode;
import com.kennycason.kumo.WordCloud;
import com.kennycason.kumo.WordFrequency;
import com.kennycason.kumo.bg.CircleBackground;
import com.kennycason.kumo.font.KumoFont;
import com.kennycason.kumo.image.AngleGenerator;
import com.kennycason.kumo.nlp.FrequencyAnalyzer;
import com.kennycason.kumo.nlp.tokenizers.ChineseWordTokenizer;
import com.kennycason.kumo.palette.LinearGradientColorPalette;
import com.kennycason.kumo.placement.RectangleWordPlacer;
import com.*.*.bigdata.dto.GxyItemData;
import com.*.*.bigdata.entity.SchoolGeneralDataEntity;
import com.*.*.bigdata.utils.AutoReport.CreateSchoolReportV4;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.system.ApplicationHome;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import java.awt.*;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.Field;
import java.net.URL;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.*;
import java.util.List;

/**
 * ClasseName: WordCloud
 *
 * @Author: 李指导
 * @Create: 2024/01/09 - 12:44
 * @Version: v1.0
 * Description: 通过com.kennycason生成词云图
 **/
public class WordCloudUtils {
    private static final Logger logger= LoggerFactory.getLogger(WordCloudUtils.class);

    public static final String PATH = "src/main/resources/image/";
        public static void main(String[] args) throws IOException, IllegalAccessException {
            //GxyItemData 为我自己的对象 这里可以根据实际情况切换
            List<GxyItemData> list = new ArrayList<>();
            GxyItemData data = new GxyItemData();

            data.setName("张三");
            data.setName2("一年级");
            data.setValue2("25");
            data.setValue1("100");
            data.setValue4(new double[] {100});
            GxyItemData data2 = new GxyItemData();

            data2.setName("李四");
            data2.setName2("二年级");
            data2.setValue2("74");
            data2.setValue1("200");
            data2.setValue4(new double[] {100});
            GxyItemData data3 = new GxyItemData();

            data3.setName("王五");
            data3.setName2("三年级");
            data3.setValue2("60");
            data3.setValue1("300");
            data3.setValue4(new double[] {100});
            list.add(data);list.add(data2);list.add(data3);


            GxyItemData dataa = new GxyItemData();

            dataa.setName("马六");
            dataa.setName2("一年级");
            dataa.setValue2("45");
            dataa.setValue1("220");
            dataa.setValue4(new double[] {100});
            GxyItemData dataa2 = new GxyItemData();

            dataa2.setName("九七");
            dataa2.setName2("二年级");
            dataa2.setValue2("14");
            dataa2.setValue1("1200");
            dataa2.setValue4(new double[] {100});
            GxyItemData dataa3 = new GxyItemData();

            dataa3.setName("勾八");
            dataa3.setName2("三年级");
            dataa3.setValue2("40");
            dataa3.setValue1("2100");
            data.setValue4(new double[] {100});
            list.add(dataa);list.add(dataa2);list.add(dataa3);

            WordCloudUtils wordCloudUtils =new WordCloudUtils();
            wordCloudUtils.createWordCountPic(list);
        }
    /**
     * 制作词云图方法
     * **/
    public  String createWordCountPic(List<GxyItemData> list) throws IOException {
        //是一个用于分析文本中词频的工具类
        FrequencyAnalyzer frequencyAnalyzer = new FrequencyAnalyzer();
        //设置要返回的词频数量,这里设置为 600
        frequencyAnalyzer.setWordFrequenciesToReturn(600);
        //设置词的最小长度,这里设置为 2,表示忽略长度小于 2 的词。
        frequencyAnalyzer.setMinWordLength(2);
        //设置词的分词器,这里使用了中文的分词器 ChineseWordTokenizer,用于将中文文本拆分成单个词语。
        frequencyAnalyzer.setWordTokenizer(new ChineseWordTokenizer());
        // 可以直接从文件中读取
        List<WordFrequency> wordFrequencies = new ArrayList<>();
        // 用词语来随机生成词云
        Collections.sort(list, Comparator.comparing(GxyItemData::getValue2).reversed());
        //这里换成自己对象当中的参数,name和value
        list.forEach(c->{
            wordFrequencies.add(new WordFrequency(c.getName(),Integer.parseInt(c.getValue2())));
        });
        //设置图片分辨率
        Dimension dimension = new Dimension(300, 300);
        //此处的设置采用内置常量即可,生成词云对象
        WordCloud wordCloud = new com.kennycason.kumo.WordCloud(dimension, CollisionMode.PIXEL_PERFECT);
        //词频的背景为白色
        wordCloud.setBackgroundColor(Color.WHITE);
        //调节词云的稀疏程度,越高越稀疏
        wordCloud.setPadding(0);
        //字号的大小范围,最小是多少,最大是多少
        //wordCloud.setFontScalar(new LinearFontScalar(10, 200));
        //设置词云显示的三种颜色,越靠前设置表示词频越高的词语的颜色
        //wordCloud.setColorPalette(new ColorPalette(15));
        wordCloud.setColorPalette(new LinearGradientColorPalette(new Color(90,174,243), new Color(251,110,108), new Color(254,182,77), 30, 30));
        // 设置字体 //此处不设置会出现中文乱码 字体设置为仿宋
        wordCloud.setKumoFont(new KumoFont(new Font("楷体", Font.BOLD, 25)));
        // 设置偏转角,角度为0时,字体都是水平的
        wordCloud.setAngleGenerator(new AngleGenerator(2,2,2));
        wordCloud.setBackground(new CircleBackground(100));
        wordCloud.build(wordFrequencies);
        //生成词云图路径
        UUID uuid = UUID.randomUUID();
        String hexString = uuid.toString().replace("-", "").substring(0,32);

        //获取编译路径,这里运行后会写到改目录下,可以自定义一个目录,
        String targetPath = "./output/";
        //String targetPath = this.getClass().getResource("/").getPath()
        String path = targetPath+hexString+".png";

        // windows目录符号 \\  , 提交到linux 要改成 //
        File filePath = new File(targetPath+File.separator);
        if(!filePath.exists()){
            filePath.mkdirs();
        }
        wordCloud.writeToFile(path);
        return path;
    }

}

测试运行结果:

生产运行结果:

 可以单独设置纬度高的词语颜色,字体稀疏度和字体的旋转角度, 都在代码当中,如果有比较好的修改建议,可以评论区留言,一起学习

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

c语言-字符串函数(库函数使用)和模拟实现

文章目录 前言一、库函数strcat()介绍1.1 strcat()介绍1.2 模拟实现strcat() 总结 前言 在写c语言基础系列文章时&#xff0c;介绍了字符串函数strlen(),strcpy(),strcmp()的使用和模拟实现。 本篇文章继续探讨其他字符串函数的使用以及模拟实现。 一、库函数strcat()介绍 1.…

螺旋数字矩阵 - 华为OD统一考试

OD统一考试(C卷) 分值: 100分 题解: Java / Python / C++ 题目描述 疫情期间,小明隔离在家,百无聊赖,在纸上写数字玩。他发明了一种写法: 给出数字个数n和行数m (0 < n <= 999,0 < m <= 999),从左上角的1开始,按照顺时针螺旋向内写方式,依次写出2,3……

RabbitMQ(十一)队列的扩展属性(Arguments)

目录 一、简介二、队列扩展属性清单三、代码示例3.1 实现方式一&#xff1a;channel.queueDeclare()3.2 实现方式二&#xff1a;QueueBuilder.build() 一、简介 RabbitMQ 允许用户在声明队列、交换机或绑定时设置 扩展属性&#xff08;Arguments&#xff09;&#xff0c;这些扩…

求阶乘(优化版)

✨欢迎来到脑子不好的小菜鸟的文章✨ &#x1f388;创作不易&#xff0c;麻烦点点赞哦&#x1f388; 所属专栏&#xff1a;刷题 我的主页&#xff1a;脑子不好的小菜鸟 文章特点&#xff1a;关键点和步骤讲解放在 代码相应位置 明天考试&#xff0c;今天复习&#xff0c;复习…

2.2.3机器学习—— 判定梯度下降是否收敛 + α学习率的选择

2.2.3 判定梯度下降是否收敛 α学习率的选择 2.1、 判定梯度下降是否收敛 有两种方法&#xff0c;如下图&#xff1a; 方法一&#xff1a; 如图&#xff0c;随着迭代次数的增加&#xff0c;J(W,b)损失函数不断下降当 iterations 300 之后&#xff0c;下降的就不太明显了 / …

2024年【安全员-B证】试题及解析及安全员-B证模拟试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 安全员-B证试题及解析参考答案及安全员-B证考试试题解析是安全生产模拟考试一点通题库老师及安全员-B证操作证已考过的学员汇总&#xff0c;相对有效帮助安全员-B证模拟试题学员顺利通过考试。 1、【多选题】《北京市…

Angular学习第二天--问题记录

一、问题 1.用脚手架搭建完项目之后&#xff0c;缺少app.modules.ts文件&#xff0c; 2.解决办法&#xff1a; 在终端继续输入命令 ng new 项目名称 --no-standalone --routing --ssrfalse 3.完整目录&#xff1a; 二、问题 1.问题来源&#xff0c;源代码&#xff1a; <fo…

Goby高级食用指南

Goby高级食用指南 1.Goby POC2.自定义字典3.Goby插件生态 - 一些好用的插件分享FOFASubDomainsBruteExportCsvAWVSRedis-cliGoby4waf初级篇参考 - Goby基本使用 1.Goby POC Goby的漏洞模块包含官方自定义的一些初始POC: 红队版的POC会实时更新,普通版则不会 Goby的POC编写…

Helix QAC 2023.4 新版支持C++20语言,带来更多性能提升!

Helix QAC 2023.4 新增功能 Helix QAC 2023.4全面支持MISRA C:2023规则&#xff0c;涵盖100%的指南。此版本还加强了对C20语言的支持&#xff0c;改进了数据流分析性能&#xff0c;并在整个产品中增加了多项用户体验改进。 增强的C20支持 此版本新增了对以下语言特性的支持&a…

LeetCode-杨辉三角公式

杨辉三角公式 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/a225ff66061e4076924e3299b81b98d5.png /*** author wx* description 杨辉三角公式-标准* create 2023/12/26**/ public class Triangle {public static void main(String[] args) {List<List<I…

GPT大模型在生物、地球、农业、气象、生态、环境科学可以应用?

以ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diffusion、星火大模型、文心一言、千问为代表AI大语言模型带来了新一波人工智能浪潮&#xff0c;可以面向科研选题、思维导图、数据清洗、统计分析、高级编程、代码调试、算法学习、论文检索、写作、翻译、润色、文献辅助…

麒麟系统安装docker、mysql、clickhouse

1、查看麒麟系统版本信息 cat /etc/os-release 麒麟系统版本V10 64位操作系统 # uname -p x86_64 # uname -p aarch64 内核版本 # uname -r 4.19.90-24.4.v2101.ky10.x86_64 本操作为麒麟系统版本V10&#xff0c;x86_64操作系统 一&#xff0c;安装docker 文件&#xff1a…

Python自带爬虫库urllib使用大全

目录 一、urllib库简介 二、发送HTTP请求 三、处理响应 四、解析URLs 五、设置代理 六、总结 在Python中&#xff0c;urllib是一个用于处理URLs的内置库&#xff0c;它提供了用于构建、解析、发送和接收HTTP、HTTPS和其他URLs的强大工具。这个库是Python标准库的一部分&a…

Open CASCADE学习|创建拓朴

目录 1、创建点gp_Pnt 2、创建向量gp_Vec 3、创建边TopoDS_Edge 4、线网络TopoDS_Wire 5、面TopoDS_Face 6、体TopoDS_Shape OpenCascade中的拓朴实体如下图所示&#xff0c;其中Compound可以包含很多Solid&#xff1b;Solid由Shell包围而成&#xff1b;Shell由相连的Fac…

7 集中式日志和分布式跟踪

文章目录 日志聚合模式日志集中化的简单解决方案使用日志并输出分布式跟踪Spring Cloud Sleuth实现分布式跟踪 小结 前面的文章&#xff1a; 1、 1 一个测试驱动的Spring Boot应用程序开发 2、 2 使用React构造前端应用 3、 3 试驱动的Spring Boot应用程序开发数据层示例 4、…

设计模式-总述

设计模式简介 设计模式代表了最佳的实践&#xff0c;通常被有经验的面向对象的软件开发人员所采用。它是开发人员在软件开发过程中面临的一般问题的解决方案。这些方案是众多软件开发人员经过相当长的一段时间总结出来的。是一套被反复使用的&#xff0c;多数人知晓的&#xf…

在Linux中使用Apache HTTP服务器

Apache HTTP服务器&#xff0c;也被称为Apache&#xff0c;是全球使用最广泛的Web服务器软件之一。它以其稳定性、强大的功能和灵活性而闻名&#xff0c;尤其在Linux操作系统上表现得尤为出色。以下是关于如何在Linux中使用Apache HTTP服务器的详细指南。 1. 安装Apache 首先…

ORACLE RAC DG文件路径错乱解决办法

最近接手了一个客户的RAC-RAC dg环境的维护,登录上去之后发现dg延迟了8天,由于主库的空间非常紧张,归档日志早就删除了,所以准备使用rman基于scn点的备份恢复的方案恢复dg同步 在备份完成之后,使用新的控制文件进行数据恢复的时候报错datafile 43 not found: 检查了一下发现当…

Vue面试之虚拟DOM

Vue面试之虚拟DOM 什么是虚拟dom&#xff1f;虚拟dom是如何产生的&#xff1f;编写模板template模板编译Complie挂载Mounting 如何进行新旧Dom对比&#xff1f; 最近在整理一些前端面试中经常被问到的问题&#xff0c;分为vue相关、react相关、js相关、react相关等等专题&#…

信号浪涌保护器的原理和行业应用方案

信号浪涌保护器&#xff08;Surge Protective Device&#xff0c;简称SPD&#xff09;是一种用于限制信号线路中瞬态过电压和分泄浪涌电流的防雷装置&#xff0c;主要用于保护各类信号线路及设备的防雷安全。信号浪涌保护器的原理是利用气体放电管、压敏电阻、齐纳二极管等非线…