Java 改变散点图中点的形状

Java 改变散点图中点的形状,java,jfreechart,Java,Jfreechart,我要在JFreeChart散点图上绘制数千个点。 现在的问题是,我的程序正在用“正方形”绘制点,但我需要一些关于如何将点的形状从“正方形”更改为“点/圆”的帮助。 任何帮助都将不胜感激 //*我使用的是ShapeUtilities,但当我用于XYItemRenderer/XYDotRenderer时,它不会将点的形状更改为“DaignalCross”——如果代码中有任何错误,请进行任何更正。*/// import java.awt.Color; import java.awt.Dimension

我要在
JFreeChart
散点图上绘制数千个点。 现在的问题是,我的程序正在用“正方形”绘制点,但我需要一些关于如何将点的
形状从“正方形”更改为“点/圆”的帮助。
任何帮助都将不胜感激

//*我使用的是ShapeUtilities,但当我用于XYItemRenderer/XYDotRenderer时,它不会将点的形状更改为“DaignalCross”——如果代码中有任何错误,请进行任何更正。*///

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Shape;
import java.util.*;
import javax.swing.JPanel;
import org.jfree.chart.*;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYItemRenderer;
import org.jfree.chart.renderer.xy.XYDotRenderer;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;
import org.jfree.util.ShapeUtilities;

public class SPlotfinal extends ApplicationFrame {

    public SPlotfinal(String s) {
        super(s);
        JPanel jpanel = createDemoPanel();
        jpanel.setPreferredSize(new Dimension(500, 270));
        setContentPane(jpanel);
    }

    public static JPanel createDemoPanel() {

        JFreeChart jfreechart = ChartFactory.createScatterPlot("Scatter Plot Demo",
            "X", "Y", samplexydataset2(), PlotOrientation.VERTICAL, true, true, false);
        Shape cross = ShapeUtilities.createDiagonalCross(3, 1);

        XYPlot xyPlot = (XYPlot) jfreechart.getPlot();
        XYItemRenderer renderer = xyPlot.getRenderer();
        renderer.setBaseShape(cross);
        renderer.setBasePaint(Color.red);
        //changing the Renderer to XYDotRenderer
        //xyPlot.setRenderer(new XYDotRenderer());
        XYDotRenderer xydotrenderer = new XYDotRenderer();
        xyPlot.setRenderer(xydotrenderer);
        xydotrenderer.setSeriesShape(0, cross);

        xyPlot.setDomainCrosshairVisible(true);
        xyPlot.setRangeCrosshairVisible(true);

        return new ChartPanel(jfreechart);
    }

    private static XYDataset samplexydataset2() {
        int cols = 20;
        int rows = 20;
        double[][] values = new double[cols][rows];

        XYSeriesCollection xySeriesCollection = new XYSeriesCollection();
        XYSeries series = new XYSeries("Random");
        Random rand = new Random();
        for (int i = 0; i < values.length; i++) {
            for (int j = 0; j < values[i].length; j++) {
                double x = Math.round(rand.nextDouble() * 500);
                double y = Math.round(rand.nextDouble() * 500);

                series.add(x, y);
            }
        }
        xySeriesCollection.addSeries(series);
        return xySeriesCollection;
    }

    public static void main(String args[]) {
        SPlotfinal scatterplotdemo4 = new SPlotfinal("Scatter Plot Demo 4");
        scatterplotdemo4.pack();
        RefineryUtilities.centerFrameOnScreen(scatterplotdemo4);
        scatterplotdemo4.setVisible(true);
    }
}
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.Shape;
导入java.util.*;
导入javax.swing.JPanel;
导入org.jfree.chart.*;
导入org.jfree.chart.plot.PlotOrientation;
导入org.jfree.chart.plot.XYPlot;
导入org.jfree.chart.renderer.xy.XYItemRenderer;
导入org.jfree.chart.renderer.xy.XYDotRenderer;
导入org.jfree.data.xy.XYDataset;
导入org.jfree.data.xy.XYSeries;
导入org.jfree.data.xy.XYSeriesCollection;
导入org.jfree.ui.ApplicationFrame;
导入org.jfree.ui.RefineryUtilities;
导入org.jfree.util.ShapeUtilities;
公共类SPlotfinal扩展了ApplicationFrame{
公共SPlotfinal(字符串s){
超级(s);
JPanel JPanel=createDemoPanel();
jpanel.setPreferredSize(新尺寸(500270));
setContentPane(jpanel);
}
公共静态JPanel createDemoPanel(){
JFreeChart JFreeChart=ChartFactory.createScatterPlot(“散点图演示”,
“X”、“Y”、samplexydataset2()、PlotOrientation.VERTICAL、true、true、false);
形状交叉=形状属性。创建对角交叉(3,1);
XYPlot XYPlot=(XYPlot)jfreechart.getPlot();
XYItemRenderer=xyPlot.getRenderer();
渲染器。收进形状(十字);
渲染器.setBasePaint(颜色:红色);
//将渲染器更改为XYDotRenderer
//setRenderer(新的XYDotRenderer());
XYDotRenderer XYDotRenderer=新的XYDotRenderer();
setRenderer(xydotrenderer);
xydotrenderer.setSeriesShape(0,交叉);
xyPlot.setDomainCrosshairVisible(true);
xyPlot.SetRangeCroshairVisible(真);
返回新的图表面板(jfreechart);
}
私有静态XYDataset samplexydataset2(){
int cols=20;
int行=20;
double[][]值=新的double[cols][rows];
XYSeriesCollection XYSeriesCollection=新XYSeriesCollection();
XYSeries系列=新的XYSeries(“随机”);
Random rand=新的Random();
对于(int i=0;i
A继承自。可以替代以提供自己的形状

附录:这种方法的一个优点是,您可以为每个系列中的每个项目指定一个
形状

附录:要使用
ShapeUtilities.createDiagonalCross()
,请执行以下操作:

Shape cross = ShapeUtilities.createDiagonalCross(3, 1);
plot = (XYPlot) chart.getPlot();
renderer = plot.getRenderer();
renderer.setSeriesShape(0, cross);
// 5x5 red pixel circle
Shape shape  = new Ellipse2D.Double(0,0,5,5);
XYPlot xyPlot = (XYPlot) jFreeCHart.getPlot();
XYItemRenderer renderer = xyPlot.getRenderer();
renderer.setBaseShape(shape);
renderer.setBasePaint(Color.red);

// set only shape of series with index i
renderer.setSeriesShape(i, shape);
附录:只需切换到
setSeriesShape()
。另外,跳过
XYDotRenderer
Math.round()

导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.Shape;
导入java.util.*;
导入javax.swing.JPanel;
导入org.jfree.chart.*;
导入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;
导入org.jfree.ui.ApplicationFrame;
导入org.jfree.ui.RefineryUtilities;
导入org.jfree.util.ShapeUtilities;
公共类SPlotfinal扩展了ApplicationFrame{
公共SPlotfinal(字符串s){
超级(s);
JPanel JPanel=createDemoPanel();
jpanel.setPreferredSize(新维度(640480));
添加(jpanel);
}
公共静态JPanel createDemoPanel(){
JFreeChart JFreeChart=ChartFactory.createScatterPlot(
“散点图演示”、“X”、“Y”、samplexydataset2(),
PlotOrientation.VERTICAL,true,true,false);
形状交叉=形状属性。创建对角交叉(3,1);
XYPlot XYPlot=(XYPlot)jfreechart.getPlot();
xyPlot.setDomainCrosshairVisible(true);
xyPlot.SetRangeCroshairVisible(真);
XYItemRenderer=xyPlot.getRenderer();
渲染器.setSeriesShape(0,交叉);
渲染器.setSeriesPaint(0,颜色.红色);
返回新的图表面板(jfreechart);
}
私有静态XYDataset samplexydataset2(){
int cols=20;
int行=20;
double[][]值=新的double[cols][rows];
XYSeriesCollection XYSeriesCollection=新XYSeriesCollection();
XYSeries系列=新的XYSeries(“随机”);
Random rand=新的Random();
对于(int i=0;i
您可以获得绘图(对于本例
// 5x5 red pixel circle
Shape shape  = new Ellipse2D.Double(0,0,5,5);
XYPlot xyPlot = (XYPlot) jFreeCHart.getPlot();
XYItemRenderer renderer = xyPlot.getRenderer();
renderer.setBaseShape(shape);
renderer.setBasePaint(Color.red);

// set only shape of series with index i
renderer.setSeriesShape(i, shape);