其实带刻度的蜘蛛图网上也有不少资料,我这个也是参照别人的资料来做的,不管咋样,还是记上吧。

先上图

1、构造dataset

private DefaultCategoryDataset createDataSet2(Map<String, Map<String, Object>> resultMap, List<String> dimNameList) {DefaultCategoryDataset dataset = new DefaultCategoryDataset();//创建默认的种类数据类型就可以了,蜘蛛图的每个维度可以看成一种类型Set<String> keySet = resultMap.keySet();for(String key : keySet){Map<String,Object> infoMap = resultMap.get(key);String vendorCode = key.split("&")[0];String vendorName = key.split("&")[1];for(String dimName : dimNameList){if(infoMap.get(dimName)==null){continue;}double score = (Double) infoMap.get(dimName);dataset.addValue(score, vendorName.trim()      +"("+vendorCode.trim()+")", dimName);}}return dataset;
}

2、因为jfreechart默认的蜘蛛图内容区域对象是不带刻度的,所以我们扩展一个好了,写一个扩展类继承SpiderWebPlot,主要是重写drawLabel方法,这个网上很多地方都有。

public class SpiderWebPlotExpand extends SpiderWebPlot{private static final long serialVersionUID = 4005814203754627127L;  private int ticks = DEFAULT_TICKS;   private static final int DEFAULT_TICKS = 5;   private NumberFormat format = NumberFormat.getInstance();   private static final double PERPENDICULAR = 90;   private static final double TICK_SCALE = 0.015;   private int valueLabelGap = DEFAULT_GAP;   private static final int DEFAULT_GAP = 10;   private static final double THRESHOLD = 15;   public SpiderWebPlotExpand(CategoryDataset createCategoryDataset) {   super(createCategoryDataset);   }   @Override   protected void drawLabel(final Graphics2D g2, final Rectangle2D plotArea, final double value,   final int cat, final double startAngle, final double extent) {   super.drawLabel(g2, plotArea, value, cat, startAngle, extent);   final FontRenderContext frc = g2.getFontRenderContext();   final double[] transformed = new double[2];   final double[] transformer = new double[2];   final Arc2D arc1 = new Arc2D.Double(plotArea, startAngle, 0, Arc2D.OPEN);   for (int i = 1; i <= ticks; i++) {   final Point2D point1 = arc1.getEndPoint();   final double deltaX = plotArea.getCenterX();   final double deltaY = plotArea.getCenterY();   double labelX = point1.getX() - deltaX;   double labelY = point1.getY() - deltaY;   final double scale = ((double) i / (double) ticks);   final AffineTransform tx = AffineTransform.getScaleInstance(scale, scale);   final AffineTransform pointTrans = AffineTransform.getScaleInstance(scale + TICK_SCALE, scale + TICK_SCALE);   transformer[0] = labelX;   transformer[1] = labelY;   pointTrans.transform(transformer, 0, transformed, 0, 1);   final double pointX = transformed[0] + deltaX;   final double pointY = transformed[1] + deltaY;   tx.transform(transformer, 0, transformed, 0, 1);   labelX = transformed[0] + deltaX;   labelY = transformed[1] + deltaY;   double rotated = (PERPENDICULAR);   AffineTransform rotateTrans = AffineTransform.getRotateInstance(Math.toRadians(rotated), labelX, labelY);   transformer[0] = pointX;   transformer[1] = pointY;   rotateTrans.transform(transformer, 0, transformed, 0, 1);   final double x1 = transformed[0];   final double y1 = transformed[1];   rotated = (-PERPENDICULAR);   rotateTrans = AffineTransform.getRotateInstance(Math.toRadians(rotated), labelX, labelY);   rotateTrans.transform(transformer, 0, transformed, 0, 1);   final Composite saveComposite = g2.getComposite();   g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1.0f));   g2.draw(new Line2D.Double(transformed[0], transformed[1], x1, y1));   if (startAngle == this.getStartAngle()) {   final String label = format.format(((double) i / (double) ticks) * this.getMaxValue());   final LineMetrics lm = getLabelFont().getLineMetrics(label, frc);   final double ascent = lm.getAscent();   if (Math.abs(labelX - plotArea.getCenterX()) < THRESHOLD) {   labelX += valueLabelGap;   labelY += ascent / (float) 2;   } else if (Math.abs(labelY - plotArea.getCenterY()) < THRESHOLD) {   labelY += valueLabelGap;   } else if (labelX >= plotArea.getCenterX()) {   if (labelY < plotArea.getCenterY()) {   labelX += valueLabelGap;   labelY += valueLabelGap;   } else {   labelX -= valueLabelGap;   labelY += valueLabelGap;   }   } else {   if (labelY > plotArea.getCenterY()) {   labelX -= valueLabelGap;   labelY -= valueLabelGap;   } else {   labelX += valueLabelGap;   labelY -= valueLabelGap;   }   }   g2.setPaint(getLabelPaint());   g2.setFont(getLabelFont());   g2.drawString(label, (float) labelX, (float) labelY);   }   g2.setComposite(saveComposite);   }   }   }

3、创建chart

private JFreeChart createChart2(DefaultCategoryDataset dataSet) {SpiderWebPlotExpand plot = new SpiderWebPlotExpand(dataSet);JFreeChart chart = new JFreeChart("维度得分分析", plot);  return chart;
}

这次就比较简单了,因为网上例子不少,记在这里只是给自己以后查找方便,哈

jfreechart学习笔记三 带刻度的蜘蛛图相关推荐

  1. K8S 学习笔记三 核心技术 Helm nfs prometheus grafana 高可用集群部署 容器部署流程

    K8S 学习笔记三 核心技术 2.13 Helm 2.13.1 Helm 引入 2.13.2 使用 Helm 可以解决哪些问题 2.13.3 Helm 概述 2.13.4 Helm 的 3 个重要概念 ...

  2. 学习笔记:带你十天轻松完成 Go 微服务系列(二)- 服务拆分

    学习笔记:带你十天轻松搞定 Go 微服务系列(二) 1.学习课程 2.服务拆分 2.1 按业务服务拆分 2.2 按调用方式拆分 3.创建项目目录 3.1 在 code 中新建项目 3.2 创建 mal ...

  3. TIVA_C学习笔记三

    TIVA_C学习笔记三 关于解决keil下不了的问题 通过摸索我有发现了另一种下载方式,使用Ti官方的软件LM Flash Programmer软件.但这个软件需要的是.bin文件,keil默认生成的 ...

  4. MySQL学习笔记(三)查询

    写在前面:本篇为作者自学总结,学习内容为课堂所学和网络学习笔记汇总,对于内容引用部分在文中和文末注明. 文章仅供参考,如需深入了解,请查阅MySQL参考手册.附上下载链接: 链接:https://pa ...

  5. 【AngularJs学习笔记三】Grunt任务管理器

    为什么80%的码农都做不了架构师?>>>    #0 系列目录# AngularJs学习笔记 [AngularJs学习笔记一]Bower解决js的依赖管理 [AngularJs学习笔 ...

  6. Hive学习笔记三之函数操作

    文章目录 5 函数 5.1 系统内置函数 5.2 常用内置函数 5.2.1 空字段赋值 5.2.2 CASE WHEN THEN ELSE END(类似于java中的switch case) 5.2. ...

  7. java学习笔记(三):前端miniUI控件库入门

    java学习笔记(三):前端miniUI控件库入门 最近在一家公司实习学习,一上来就需要学习了解相关的前端内容--miniUI.而这个内容自己本身并没有了解学习过,上手也是遇到了不少的问题,于是想把自 ...

  8. J2EE学习笔记三:EJB基础概念和知识 收藏

    J2EE学习笔记三:EJB基础概念和知识 收藏 EJB正是J2EE的旗舰技术,因此俺直接跳到这一章来了,前面的几章都是讲Servlet和JSP以及JDBC的,俺都懂一些.那么EJB和通常我们所说的Ja ...

  9. tensorflow学习笔记(三十二):conv2d_transpose (解卷积)

    tensorflow学习笔记(三十二):conv2d_transpose ("解卷积") deconv解卷积,实际是叫做conv_transpose, conv_transpose ...

最新文章

  1. 七天入门linux,RHCE认证学习笔记-第七天
  2. 总结vue中父向子,子向父以及兄弟之间通信的几种方式
  3. 【CyberSecurityLearning 18】ACL及实验演示
  4. CodeForces 258D Little Elephant and Broken Sorting(期望)
  5. Datalore:用于机器学习可视化的新Web方案!
  6. leetcode537. 复数乘法
  7. 《Dubbo迈出云原生重要一步-应用级服务发现解析》
  8. ceph怎么搭建文件存储_SUSE专家谈Ceph落地之最佳实践
  9. Updating Homebrew... ...长时间卡住的问题
  10. 国密算法-商密认证-硬件加密-同方TF32A09-32位高速加密芯片
  11. 人肉搜索、人肉语言及人肉程序设计
  12. 电力系统分析—潮流计算代码Python编程练习(基于极坐标形式的常规牛拉法)
  13. IDEA 2017 破解 license 激活
  14. koa2 请求转发实现
  15. CAD绘图软件_常用指令
  16. Android Launcher负一屏实现方案
  17. 建文高考成绩查询2021,2021届新高考语文强化模拟卷(三).pdf
  18. 新手入门必懂:关于西瓜视频广告,你不可不知的基础知识
  19. 【智能制造】工业软件:智能制造的大脑
  20. Android 实现三色渐变背景

热门文章

  1. jQuery学习:点击 切换图片向左向右移动类似
  2. 解除加密PDF的限制编辑功能
  3. Hadoop生态系统详解
  4. WOJ1206-QQ军棋
  5. 数码产品交易微信小程序的设计与实现
  6. 计算机和网络技术的主要应用,计算机网络技术的应用及发展
  7. 【二】Html5的浏览器支持
  8. qcc304x笔记之音频链路(chain)机制(十八)
  9. js实现对数据进行筛选
  10. 2004.09.18,Sat - 国耻日