Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JFreeChart:如何在散点图中的轴线末端放置箭头_Java_Jfreechart - Fatal编程技术网

Java JFreeChart:如何在散点图中的轴线末端放置箭头

Java JFreeChart:如何在散点图中的轴线末端放置箭头,java,jfreechart,Java,Jfreechart,我有以下情节: 我如何在领导路线和绩效路线的末尾放置箭头 以下是演示代码: 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.Shap

我有以下情节:

我如何在领导路线和绩效路线的末尾放置箭头

以下是演示代码:

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);
            }
        });
    }
import java.awt.BasicStroke;
导入java.awt.BorderLayout;
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.EventQueue;
导入java.awt.GradientPaint;
导入java.awt.Paint;
导入java.awt.Shape;
导入java.awt.geom.Ellipse2D;
导入java.util.*;
导入javax.swing.JFrame;
导入org.jfree.chart.*;
导入org.jfree.chart.axis.NumberAxis;
导入org.jfree.chart.plot.PlotOrientation;
导入org.jfree.chart.plot.XYPlot;
导入org.jfree.chart.renderer.xy.XYItemRenderer;
导入org.jfree.data.xy.XYDataset;
导入org.jfree.data.xy.XYSeries;
导入org.jfree.data.xy.XYSeriesCollection;
公共类测试扩展了JFrame{
私有静态最终整数N=3;
私有静态最终整数大小=345;
私有静态最终字符串title=“散点图演示”;
私有最终XYSeries=新XYSeries(“0”);
受保护的映射颜色=新HashMap();
受保护的映射形状=新建HashMap();
私有颜色bckColor1=Color.decode(“#4282CE”);
私有颜色bckColor2=Color.decode(“#9BC1FF”);
公共静态最终形状基础\ U形状=新的椭圆2d.浮动(0,0,12,12);
公共测试(字符串s){
超级(s);
colors.put(“0”,Color.decode(#FFAC59”);//橙色
colores.put(“1”,Color.decode(#D6FC93”);//纯绿色
colors.put(“2”,Color.decode(#C0E975”);//深绿色
对于(int i=0;i<3;i++)
形状。放置(i,基本形状);
最终ChartPanel ChartPanel=createDemoPanel();
chartPanel.setPreferredSize(新尺寸(尺寸,尺寸));
添加(chartPanel,BorderLayout.CENTER);
}
受保护的无效流程图(XYPlot){
油漆p=新的渐变油漆(0,0,bckColor1,0,0,bckColor2);
Color=Color.decode(#DD0010”);//红色
NumberAxis rangeAxis=(NumberAxis)plot.getRangeAxis();
rangeAxis.setTickLabelsVisible(假);
rangeAxis.setMinorTickMarksVisible(假);
rangeAxis.setTickMarksVisible(假);
rangeAxis.setAxisLinePaint(axisColor);
rangeAxis.setAxisLineStroke(新基本行程(2));
NumberAxis域轴=(NumberAxis)plot.getDomainAxis();
domainAxis.setTickLabelsVisible(false);
domainAxis.setMinorTickMarksVisible(false);
domainAxis.setTickMarksVisible(false);
domainAxis.setAxisLinePaint(axisColor);
setAxisLineStroke(新BasicStroke(2));
立根基面漆(p);
plot.setDomainGridlinesVisible(false);
plot.setRangeGridlinesVisible(false);
}
私有ChartPanel createDemoPanel(){
JFreeChart JFreeChart=ChartFactory.createScatterPlot(
标题,“绩效”、“领导力”,createSampleData(),
PlotOrientation.VERTICAL,true,true,false);
XYPlot=(XYPlot)jfreechart.getPlot();
XYItemRenderer=(XYItemRenderer)plot.getRenderer();
渲染器.setBaseShape(基本形状);
过程图(plot);
XYDataset cd=(XYDataset)plot.getDataset();
如果(cd!=null){
int rc=cd.getSeriesCount();
对于(int i=0;i
我发现类xypointeranotation在,但它只在plot内部工作,不适用于轴线

谢谢。

将a添加到轴标签

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

我在Java中不使用jfree;我在Clojure中通过白炽灯使用它。Dohvakin,毫无疑问,你已经从这个问题开始了,但由于2.5年后没有人回答,我将提出一个部分未经测试的解决方案。我还没有在纯Java中尝试过这一点,但这是我在Clojure中使用jfree所做工作的Java翻译:

plot.getDomainAxis().setPositiveArrowVisible(true);
plot.getDomainAxis().setPositiveArrowVisible(true);
这里的
plot
是在代码中定义的
XYPlot
对象。这将在水平轴的右侧和顶部以及垂直轴的顶端放置一个箭头。如果希望在另一端放置箭头,还可以使用
setNegativeArrowVisible
方法

以你为例,

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


然而,箭头非常小,替换它似乎需要编码一个新的
形状
对象。

Mmm…似乎是一种巧妙的方式来放置箭头,尽管不在轴线上。我可以覆盖
drawAxisLine()
,但我没有尝试过。