如何在JFreeChart散点图中创建空心形状 [英] How to create hollow shapes in JFreeChart Scatter Plot

查看:73
本文介绍了如何在JFreeChart散点图中创建空心形状的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用的JFreeChart版本:1.5.0

我尝试以下方法在散点图中获得空心形状:

PlotFrame.java 文件内容:

  package javaapplication1;导入javax.swing.JFrame;导入org.jfree.chart.ChartFactory;导入org.jfree.chart.ChartPanel;导入org.jfree.chart.JFreeChart;导入org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;导入org.jfree.data.xy.XYDataset;导入org.jfree.data.xy.XYSeries;导入org.jfree.data.xy.XYSeriesCollection;/**** @作者tarik*/公共类PlotFrame扩展了javax.swing.JFrame {公共静态void main(String [] argv){PlotFrame plotFrame = new PlotFrame();plotFrame.setVisible(true);}/***创建新表格PlotFrame*/公共PlotFrame(){this.setLocationRelativeTo(null);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);JFreeChart图表= createChart();ChartPanel面板=新的ChartPanel(图表);this.add(panel);盒();}私人JFreeChart createChart(){//创建数据集XYDataset数据集= createDataset();//创建图表JFreeChart图表= ChartFactory.createScatterPlot(男孩VS女孩体重比较图","X轴","Y轴",数据集);XYLineAndShapeRenderer渲染器=(XYLineAndShapeRenderer)chart.getXYPlot().getRenderer();//renderer.setBaseShapesFilled(false);renderer.setUseFillPaint(false);退货图表}私人XYDataset createDataset(){XYSeriesCollection数据集=新的XYSeriesCollection();//男孩(年龄,体重)系列XYSeries series1 =新的XYSeries(男孩");series1.add(1,72.9);series1.add(2,81.6);series1.add(3,88.9);series1.add(4,96);series1.add(5,102.1);series1.add(6,108.5);series1.add(7,113.9);series1.add(8,119.3);series1.add(9,123.8);series1.add(10,124.4);dataset.addSeries(series1);//女孩(年龄,体重)系列XYSeries series2 =新的XYSeries("Girls");series2.add(1,72.5);series2.add(2,80.1);series2.add(3,87.2);series2.add(4,94.5);series2.add(5,101.4);series2.add(6,107.4);series2.add(7,112.8);series2.add(8,118.2);series2.add(9,122.9);series2.add(10,123.4);dataset.addSeries(series2);返回数据集;}} 

它不起作用,形状仍然被填充.

解决方案

回想一下 Graphics2D 可以 draw()形状的轮廓以及 fill()内部.通过将渲染限制为 draw(),@ micro的

其他更改:

经测试:

  import java.awt.Dimension;导入java.awt.EventQueue;导入javax.swing.JFrame;导入org.jfree.chart.ChartFactory;导入org.jfree.chart.ChartPanel;导入org.jfree.chart.JFreeChart;导入org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;导入org.jfree.data.xy.XYDataset;导入org.jfree.data.xy.XYSeries;导入org.jfree.data.xy.XYSeriesCollection;/*** @请参阅https://stackoverflow.com/q/58812592/230513* @作者垃圾桶* @作者tarik*/公共类PlotFrame扩展了javax.swing.JFrame {公共静态void main(String [] argv){EventQueue.invokeLater(new Runnable(){@Override公共无效run(){PlotFrame plotFrame = new PlotFrame();plotFrame.setLocationRelativeTo(null);plotFrame.setVisible(true);}});}/***创建新表格PlotFrame*/公共PlotFrame(){this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);JFreeChart图表= createChart();ChartPanel面板=新的ChartPanel(图表){@Override公共维度getPreferredSize(){返回新的Dimension(640,480);}};this.add(panel);this.pack();}私人JFreeChart createChart(){//创建数据集XYDataset数据集= createDataset();//创建图表JFreeChart图表= ChartFactory.createScatterPlot(男孩VS女孩体重比较图","X轴","Y轴",数据集);XYLineAndShapeRenderer渲染器=(XYLineAndShapeRenderer)chart.getXYPlot().getRenderer();renderer.setDefaultShapesFilled(false);renderer.setUseFillPaint(false);退货图表}私人XYDataset createDataset(){XYSeriesCollection数据集=新的XYSeriesCollection();//男孩(年龄,体重)系列XYSeries series1 =新的XYSeries(男孩");series1.add(1,72.9);series1.add(2,81.6);series1.add(3,88.9);series1.add(4,96);series1.add(5,102.1);series1.add(6,108.5);series1.add(7,113.9);series1.add(8,119.3);series1.add(9,123.8);series1.add(10,124.4);dataset.addSeries(series1);//女孩(年龄,体重)系列XYSeries series2 =新的XYSeries("Girls");series2.add(1,72.5);series2.add(2,80.1);series2.add(3,87.2);series2.add(4,94.5);series2.add(5,101.4);series2.add(6,107.4);series2.add(7,112.8);series2.add(8,118.2);series2.add(9,122.9);series2.add(10,123.4);dataset.addSeries(series2);返回数据集;}} 

JFreeChart version used: 1.5.0

I tried the following to obtain hollow shapes in a scatter plot:

PlotFrame.java file content:

package javaapplication1;


import javax.swing.JFrame;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

/**
 *
 * @author tarik
 */
public class PlotFrame extends javax.swing.JFrame {    
    public static void main(String[] argv) {
        PlotFrame plotFrame = new PlotFrame();
        plotFrame.setVisible(true);
    }


    /**
     * Creates new form PlotFrame
     */
    public PlotFrame() {    
        this.setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JFreeChart chart = createChart();    
        ChartPanel panel = new ChartPanel(chart);

        this.add(panel);
        pack();
    }

    private JFreeChart createChart() {
        // Create dataset  
        XYDataset dataset = createDataset();

        // Create chart  
        JFreeChart chart = ChartFactory.createScatterPlot(
                "Boys VS Girls weight comparison chart",
                "X-Axis", "Y-Axis", dataset);

        XYLineAndShapeRenderer renderer = (XYLineAndShapeRenderer) chart.getXYPlot().getRenderer();
        //renderer.setBaseShapesFilled(false); 
        renderer.setUseFillPaint(false);

        return chart;
    }

    private XYDataset createDataset() {
        XYSeriesCollection dataset = new XYSeriesCollection();

        //Boys (Age,weight) series  
        XYSeries series1 = new XYSeries("Boys");
        series1.add(1, 72.9);
        series1.add(2, 81.6);
        series1.add(3, 88.9);
        series1.add(4, 96);
        series1.add(5, 102.1);
        series1.add(6, 108.5);
        series1.add(7, 113.9);
        series1.add(8, 119.3);
        series1.add(9, 123.8);
        series1.add(10, 124.4);

        dataset.addSeries(series1);

        //Girls (Age,weight) series  
        XYSeries series2 = new XYSeries("Girls");
        series2.add(1, 72.5);
        series2.add(2, 80.1);
        series2.add(3, 87.2);
        series2.add(4, 94.5);
        series2.add(5, 101.4);
        series2.add(6, 107.4);
        series2.add(7, 112.8);
        series2.add(8, 118.2);
        series2.add(9, 122.9);
        series2.add(10, 123.4);

        dataset.addSeries(series2);

        return dataset;
    }
}

It did not work, the shapes are still filled.

解决方案

Recall that Graphics2D can draw() the outline of a Shape as well as fill() its interior. By limiting rendering to draw(), @micro's approach is sound in this regard, but it assumes version 1.0.19. When migrating to version 1.5 and later, note that "many methods getBaseXXX()/setBaseXXX() have been renamed setDefaultXXX()/getDefaultXXX()." The correct formulation is illustrated below:

renderer.setDefaultShapesFilled(false); 
renderer.setUseFillPaint(false);

Other changes:

As tested:

import java.awt.Dimension;
import java.awt.EventQueue;
import javax.swing.JFrame;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

/**
 * @see https://stackoverflow.com/q/58812592/230513
 * @author trashgod
 * @author tarik
 */
public class PlotFrame extends javax.swing.JFrame {    
    public static void main(String[] argv) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                PlotFrame plotFrame = new PlotFrame();
                plotFrame.setLocationRelativeTo(null);
                plotFrame.setVisible(true);
            }
        });
    }

    /**
     * Creates new form PlotFrame
     */
    public PlotFrame() {    
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JFreeChart chart = createChart();    
        ChartPanel panel = new ChartPanel(chart){
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(640, 480);
            }
        };
        this.add(panel);
        this.pack();
    }

    private JFreeChart createChart() {
        // Create dataset  
        XYDataset dataset = createDataset();

        // Create chart  
        JFreeChart chart = ChartFactory.createScatterPlot(
                "Boys VS Girls weight comparison chart",
                "X-Axis", "Y-Axis", dataset);

        XYLineAndShapeRenderer renderer = (XYLineAndShapeRenderer) chart.getXYPlot().getRenderer();
        renderer.setDefaultShapesFilled(false); 
        renderer.setUseFillPaint(false);

        return chart;
    }

    private XYDataset createDataset() {
        XYSeriesCollection dataset = new XYSeriesCollection();

        //Boys (Age,weight) series  
        XYSeries series1 = new XYSeries("Boys");
        series1.add(1, 72.9);
        series1.add(2, 81.6);
        series1.add(3, 88.9);
        series1.add(4, 96);
        series1.add(5, 102.1);
        series1.add(6, 108.5);
        series1.add(7, 113.9);
        series1.add(8, 119.3);
        series1.add(9, 123.8);
        series1.add(10, 124.4);

        dataset.addSeries(series1);

        //Girls (Age,weight) series  
        XYSeries series2 = new XYSeries("Girls");
        series2.add(1, 72.5);
        series2.add(2, 80.1);
        series2.add(3, 87.2);
        series2.add(4, 94.5);
        series2.add(5, 101.4);
        series2.add(6, 107.4);
        series2.add(7, 112.8);
        series2.add(8, 118.2);
        series2.add(9, 122.9);
        series2.add(10, 123.4);

        dataset.addSeries(series2);

        return dataset;
    }
}

这篇关于如何在JFreeChart散点图中创建空心形状的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆