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