jfreechart學習筆記三 帶刻度的蜘蛛圖



 其實帶刻度的蜘蛛圖網上也有不少資料,我這個也是參照別人的資料來做的,不管咋樣,還是記上吧。

 

先上圖

 

 

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;
}

 這次就比較簡單了,因爲網上例子不少,記在這裏只是給自己以後查找方便,哈

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章