如何在JFreeChart散点图中创建空心形状 [英] How to create hollow shapes in JFreeChart Scatter Plot
问题描述
使用的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的
其他更改:
-
覆盖
getPreferredSize()
来设置图表的初始首选大小./p>
经测试:
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:
Construct and manipulate Swing GUI objects only on the event dispatch thread.
Override
getPreferredSize()
to set the chart's initial preferred size.
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屋!