簡體   English   中英

JFreeChart:如何在散點圖中將箭頭放在軸線的末端

[英]JFreeChart: How to put arrows at the end of axis lines in scatter plot

我有以下情節:

散點圖

如何在領導線和績效線的末端放置箭頭?

這是一個演示代碼:

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

我在http://www.jfree.org/jfreechart/api/javadoc/org/jfree/chart/annotations/XYPointerAnnotation.html上找到了XYPointerAnnotation類,但它僅在繪圖內有效,而不適用於軸線。

謝謝。

在軸標簽上添加一個RIGHTWARDS ARROW (U+2192) →

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

圖片

我不使用Java中的jfree。 我通過Incanter在Clojure中使用它。 毫無疑問,您已經擺脫了這個問題,dohvakiin,但是由於2.5年后沒有人回答,因此我將提出一種未經測試的解決方案。 我沒有在純Java中嘗試過此操作,但這是將我在Clojure中使用jfree完成的工作翻譯成Java:

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

這里plot是您的代碼中定義的XYPlot對象。 這將在水平軸的右側和右側以及垂直軸的頂端放置一個箭頭。 如果要在另一端使用箭頭,則還有一個setNegativeArrowVisible方法。

在您的示例中

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

圖片

但是,箭頭很小,要替換它,似乎需要對新的Shape對象進行編碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM