2014-02-25 1 views
1

의 축 라인의 끝에 화살표를 넣어 I가 다음과 같은 줄거리 : 나는 리더십 라인 및 성능 라인의 끝에 화살표를 넣어 어떻게JFreeChart를 어떻게 산포도

Scatter plot

? 여기

는 데모 코드 : 나는 http://www.jfree.org/jfreechart/api/javadoc/org/jfree/chart/annotations/XYPointerAnnotation.html에서 클래스 XYPointerAnnotation을 발견했습니다

import java.awt.BasicStroke; 
import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.GradientPaint; 
import java.awt.Paint; 
import java.awt.Shape; 
import java.awt.geom.Ellipse2D; 
import java.util.*; 
import javax.swing.JFrame; 
import org.jfree.chart.*; 
import org.jfree.chart.axis.NumberAxis; 
import org.jfree.chart.plot.PlotOrientation; 
import org.jfree.chart.plot.XYPlot; 
import org.jfree.chart.renderer.xy.XYItemRenderer; 
import org.jfree.data.xy.XYDataset; 
import org.jfree.data.xy.XYSeries; 
import org.jfree.data.xy.XYSeriesCollection; 

public class Test extends JFrame { 

    private static final int N = 3; 
    private static final int SIZE = 345; 
    private static final String title = "Scatter Plot Demo"; 
    private final XYSeries series = new XYSeries("0"); 

    protected Map<String, Color> colors = new HashMap<String, Color>(); 
    protected Map<Integer, Shape> shapes = new HashMap<Integer, Shape>(); 
    private Color bckColor1 = Color.decode("#4282CE"); 
    private Color bckColor2 = Color.decode("#9BC1FF"); 
    public static final Shape BASE_SHAPE = new Ellipse2D.Float(0, 0, 12, 12); 

    public Test(String s) { 
     super(s); 
     colores.put("0", Color.decode("#FFAC59")); //Orange 
     colores.put("1", Color.decode("#D6FC93"));//Clear green 
     colores.put("2", Color.decode("#C0E975"));//Dark green 

     for(int i = 0; i < 3; i++) 
      shapes.put(i, BASE_SHAPE); 

     final ChartPanel chartPanel = createDemoPanel(); 
     chartPanel.setPreferredSize(new Dimension(SIZE, SIZE)); 
     this.add(chartPanel, BorderLayout.CENTER); 
    } 

    protected void processPlot(XYPlot plot) { 
     Paint p = new GradientPaint(0,0,bckColor1,0,0,bckColor2); 
     Color axisColor = Color.decode("#DD0010"); //Red 

     NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis(); 
     rangeAxis.setTickLabelsVisible(false); 
     rangeAxis.setMinorTickMarksVisible(false); 
     rangeAxis.setTickMarksVisible(false); 
     rangeAxis.setAxisLinePaint(axisColor); 
     rangeAxis.setAxisLineStroke(new BasicStroke(2)); 

     NumberAxis domainAxis = (NumberAxis) plot.getDomainAxis(); 
     domainAxis.setTickLabelsVisible(false); 
     domainAxis.setMinorTickMarksVisible(false); 
     domainAxis.setTickMarksVisible(false); 
     domainAxis.setAxisLinePaint(axisColor); 
     domainAxis.setAxisLineStroke(new BasicStroke(2)); 

     plot.setBackgroundPaint(p); 
     plot.setDomainGridlinesVisible(false); 
     plot.setRangeGridlinesVisible(false); 
    } 

    private ChartPanel createDemoPanel() { 
     JFreeChart jfreechart = ChartFactory.createScatterPlot(
      title, "Performance", "Leadership", createSampleData(), 
      PlotOrientation.VERTICAL, true, true, false); 

     XYPlot plot = (XYPlot) jfreechart.getPlot(); 
     XYItemRenderer renderer = (XYItemRenderer) plot.getRenderer(); 
     renderer.setBaseShape(BASE_SHAPE); 

     processPlot(plot); 
     XYDataset cd = (XYDataset)plot.getDataset(); 

     if (cd != null) { 
      int rc = cd.getSeriesCount(); 
      for (int i = 0; i < rc; i++) { 
       String key = (String) cd.getSeriesKey(i); 

       Color color = colors.get(key); 
       Paint p = new GradientPaint(0, 0, color.brighter() 
         , 0, 0, color.darker()); 

       renderer.setSeriesPaint(i, p); 
       renderer.setSeriesOutlinePaint(i, color); 
       renderer.setSeriesShape(i, BASE_SHAPE); 
      } 
     } 

     return new ChartPanel(jfreechart); 
    } 

    private XYDataset createSampleData() { 
     XYSeriesCollection xySeriesCollection = new XYSeriesCollection(); 

     for (int i = 0; i < N; i++) { 
      series.add(randomDouble(0D, 100D) 
        , randomDouble(0D, 100D)); 
     } 
     xySeriesCollection.addSeries(series); 
     return xySeriesCollection; 
    } 

    private double randomDouble(double min, double max) { 
     Random r = new Random(); 
     double randomValue = min + (max - min) * r.nextDouble(); 
     return randomValue; 
    } 

    public static void main(String args[]) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       Test demo = new Test(title); 
       demo.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       demo.pack(); 
       demo.setLocationRelativeTo(null); 
       demo.setVisible(true); 
      } 
     }); 
    } 

,하지만하지 축 라인 만 플롯 내에서 작동합니다.

감사합니다.

답변

1

RIGHTWARDS ARROW (U+2192) →을 축 레이블에 추가하십시오.

JFreeChart jfreechart = ChartFactory.createScatterPlot(
    title, "Performance →", "Leadership →", createSampleData(), 
    PlotOrientation.VERTICAL, true, true, false); 

image

+0

음 ... 축선이 아닌 화살표를 넣는 독창적 인 방법처럼 보입니다. – dovahkiin

+0

'drawAxisLine()'을 오버라이드 할 수는 있지만 시도하지는 않았습니다. – trashgod

1

내가 자바 jfree 작동하지 않습니다; 나는 그것을 Incanter를 통해 Clojure에서 사용한다. 의심의 여지없이 당신은이 질문에서 계속 움직였습니다.하지만 2.5 년 후에 아무도 대답하지 못했기 때문에, 나는 부분적으로 검증되지 않은 해결책을 제안 할 것입니다. 나는 순수 자바이 시도하지 않은,하지만 내가 Clojure의에서 jfree에 한 일을 자바로 번역입니다 :

여기 plot
plot.getDomainAxis().setPositiveArrowVisible(true); 
plot.getDomainAxis().setPositiveArrowVisible(true); 

코드에서 정의 된 XYPlot 개체입니다. 그러면 오른쪽 및 가로 축과 세로 축 위쪽에 화살표가 배치됩니다. 다른 쪽 끝에 화살촉을 넣으려면 setNegativeArrowVisible 방법이 있습니다. 당신의 예에서

,
rangeAxis.setPositiveArrowVisible(true); 
domainAxis.setPositiveArrowVisible(true); 

image

화살촉 그러나, 아주 작고, 교체는 새로운 Shape 객체를 코딩이 필요한 것으로 보인다.

관련 문제