如何在JFreechart中获得点的钻石形状 [英] How to get diamond shape for points in JFreechart

查看:444
本文介绍了如何在JFreechart中获得点的钻石形状的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要在JFreechart中的Timeseries上获得A钻石形状,但我无法做到。有人可以指导一下代码应该添加到下面的代码中以实现Diamond形状点以及如何更改线条的颜色吗?



(该程序使用rs和stmt以及从DB派生的其他东西,并在其他地方定义。该程序现在正常工作,唯一的问题是它看起来非常无聊。)

  TimeSeries s1 = new TimeSeries(Technology,Day.class); 
TimeSeries s2 = new TimeSeries(Entertainment,Day.class);
TimeSeries s3 = new TimeSeries(Soap,Day.class);
TimeSeries s4 =新的TimeSeries(Music,Day.class);
TimeSeries s5 =新的TimeSeries(Native,Day.class);
TimeSeries s6 =新的TimeSeries(Specialty,Day.class);
TimeSeries s7 =新的TimeSeries(Science,Day.class);

SimpleDateFormat sdf = new SimpleDateFormat(yyyy-MM-dd);
日期plotdate;


if(!(combo_individualid.getModel()。getSize()== 0)){
String sql =
+SELECT *
+FROM`customerbasetag`
+WHERE`individual_idindividual` =?;

try {
stmt = conn.prepareStatement(sql);
stmt.setString(1,combo_individualid.getSelectedItem()。toString());
rs = stmt.executeQuery();

while(rs.next()){

try {
plotdate = sdf.parse(rs.getString(session_date));

s1.add(new Day(plotdate),new Integer(Integer.parseInt(rs.getString(technology))));
s2.add(new Day(plotdate),new Integer(Integer.parseInt(rs.getString(entertainment))));
s3.add(new Day(plotdate),new Integer(Integer.parseInt(rs.getString(soap))));
s4.add(new Day(plotdate),new Integer(Integer.parseInt(rs.getString(music))));
s5.add(new Day(plotdate),new Integer(Integer.parseInt(rs.getString(native))));
s6.add(new Day(plotdate),new Integer(Integer.parseInt(rs.getString(special))));
s7.add(new Day(plotdate),new Integer(Integer.parseInt(rs.getString(science))));


} catch(ParseException ex){
JOptionPane.showMessageDialog(null,
Parse Exception+ ex.getMessage());
}
}
} catch(SQLException ex){
JOptionPane.showMessageDialog(null,
会话期间出错+ ex.getMessage());
}


/ *注意:此处绘制图表* /
TimeSeriesCollection dataset = new TimeSeriesCollection();
dataset.addSeries(s1);
dataset.addSeries(s2);
dataset.addSeries(s3);
dataset.addSeries(s4);
dataset.addSeries(s5);
dataset.addSeries(s6);
dataset.addSeries(s7);
JFreeChart chart = ChartFactory.createTimeSeriesChart(
TS Chart,Date,Value,dataset,true,true,false);

XYPlot plot =(XYPlot)chart.getPlot();
plot.setBackgroundPaint(Color.lightGray);
plot.setDomainGridlinePaint(Color.white);
plot.setRangeGridlinePaint(Color.white);
plot.setAxisOffset(new RectangleInsets(5.0,5.0,5.0,5.0));
plot.setDomainCrosshairVisible(true);
plot.setRangeCrosshairVisible(true);

ChartFrame f =新ChartFrame(个人选择评估,图表);
f.setVisible(true);
f.setSize(800,600);
f.setLocationRelativeTo(null);

} else {

JOptionPane.showMessageDialog(null,Please Select a Individual);
}

我已经更新了代码,但它仍然无法正常工作,而且我一直在旧图表回来了。下面是代码。

  TimeSeriesCollection dataset = new TimeSeriesCollection(); 
dataset.addSeries(s1);
dataset.addSeries(s2);
dataset.addSeries(s3);
dataset.addSeries(s4);
dataset.addSeries(s5);
dataset.addSeries(s6);
dataset.addSeries(s7);
JFreeChart chart = ChartFactory.createTimeSeriesChart(个人id的时间序列图表:+ combo_individualid.getSelectedItem()。toString(),Date,Value,dataset,true,true,false);



Shape theShape = ShapeUtilities.createDiamond(1);


XYPlot plot =(XYPlot)chart.getPlot();
plot.setBackgroundPaint(Color.lightGray);
plot.setDomainGridlinePaint(Color.white);
plot.setRangeGridlinePaint(Color.white);
plot.setAxisOffset(new RectangleInsets(5.0,5.0,5.0,5.0));
plot.setDomainCrosshairVisible(true);
plot.setRangeCrosshairVisible(true);



XYItemRenderer renderer = plot.getRenderer();

renderer.setSeriesShape(0,theShape);
renderer.setSeriesShape(1,theShape);
renderer.setSeriesShape(2,theShape);
renderer.setSeriesShape(3,theShape);
renderer.setSeriesShape(4,theShape);
renderer.setSeriesShape(5,theShape);
renderer.setSeriesShape(6,theShape);





ChartFrame f =新ChartFrame(个人选择评估,图表);
f.setVisible(true);
f.setSize(800,600);
f.setLocationRelativeTo(null);


解决方案

  import java.awt.Dimension; 
import java.util.Random;
import javax.swing.JFrame;
import org.jfree.chart。*;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.time.Day;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;
import org.jfree.data.xy.XYDataset;
import org.jfree.util.ShapeUtilities;

/ ** @see https://stackoverflow.com/a/14822991/230513 * /
公共类测试{

private static final int N = 16;
private static final随机随机= new Random();

private static XYDataset createDataset(){

final TimeSeries series = new TimeSeries(Data);
日当前=新日();
for(int i = 0; i< N; i ++){
series.add(current,Math.abs(random.nextGaussian()));
current =(Day)current.next();
}
返回新的TimeSeriesCollection(系列);
}

private static JFreeChart createChart(final XYDataset dataset){
JFreeChart chart = ChartFactory.createTimeSeriesChart(
Test,Day,Value, dataset,false,false,false);
XYPlot plot =(XYPlot)chart.getPlot();
XYLineAndShapeRenderer r =(XYLineAndShapeRenderer)plot.getRenderer();
r.setSeriesShape(0,ShapeUtilities.createDiamond(5));
r.setSeriesShapesVisible(0,true);
返回图表;
}

public static void main(String [] args){

JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
XYDataset dataset = createDataset();
JFreeChart chart = createChart(dataset);
ChartPanel chartPanel = new ChartPanel(图表){

@Override
public Dimension getPreferredSize(){
return new Dimension(630,480);
}
};
f.add(chartPanel);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
}


I need to get A diamond shapes on my Timeseries in JFreechart, but I am unable to do it. Can someone please guide as to what code should be added to the code below to achieve the Diamond shape points and also how to change colours of the lines?

(The program uses rs and stmt and other things which are derived from the DB and are defined somewhere else. The program works properly right now, only problem is that it looks super boring.)

TimeSeries s1 = new TimeSeries("Technology", Day.class);
TimeSeries s2 = new TimeSeries("Entertainment", Day.class);
TimeSeries s3 = new TimeSeries("Soap", Day.class);
TimeSeries s4 = new TimeSeries("Music", Day.class);
TimeSeries s5 = new TimeSeries("Native", Day.class);
TimeSeries s6 = new TimeSeries("Speciality", Day.class);
TimeSeries s7 = new TimeSeries("Science", Day.class);

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date plotdate;


if (!(combo_individualid.getModel().getSize() == 0)) {
    String sql = ""
            + "SELECT * "
            + "FROM   `customerbasetag` "
            + "WHERE  `individual_idindividual` =? ";

    try {
        stmt = conn.prepareStatement(sql);
        stmt.setString(1, combo_individualid.getSelectedItem().toString());
        rs = stmt.executeQuery();

        while (rs.next()) {

            try {
                plotdate = sdf.parse(rs.getString("session_date"));

                s1.add(new Day(plotdate), new Integer(Integer.parseInt(rs.getString("technology"))));
                s2.add(new Day(plotdate), new Integer(Integer.parseInt(rs.getString("entertainment"))));
                s3.add(new Day(plotdate), new Integer(Integer.parseInt(rs.getString("soap"))));
                s4.add(new Day(plotdate), new Integer(Integer.parseInt(rs.getString("music"))));
                s5.add(new Day(plotdate), new Integer(Integer.parseInt(rs.getString("native"))));
                s6.add(new Day(plotdate), new Integer(Integer.parseInt(rs.getString("speciality"))));
                s7.add(new Day(plotdate), new Integer(Integer.parseInt(rs.getString("science"))));


            } catch (ParseException ex) {
                JOptionPane.showMessageDialog(null,
                    "Parse Exception" + ex.getMessage());
            }
        }
    } catch (SQLException ex) {
        JOptionPane.showMessageDialog(null,
            "Error During Session Select" + ex.getMessage());
    }


    /*NOTE: Chart plotting here*/
    TimeSeriesCollection dataset = new TimeSeriesCollection();
    dataset.addSeries(s1);
    dataset.addSeries(s2);
    dataset.addSeries(s3);
    dataset.addSeries(s4);
    dataset.addSeries(s5);
    dataset.addSeries(s6);
    dataset.addSeries(s7);
    JFreeChart chart = ChartFactory.createTimeSeriesChart(
        "TS Chart", "Date", "Value", dataset, true, true, false);

    XYPlot plot = (XYPlot) chart.getPlot();
    plot.setBackgroundPaint(Color.lightGray);
    plot.setDomainGridlinePaint(Color.white);
    plot.setRangeGridlinePaint(Color.white);
    plot.setAxisOffset(new RectangleInsets(5.0, 5.0, 5.0, 5.0));
    plot.setDomainCrosshairVisible(true);
    plot.setRangeCrosshairVisible(true);

    ChartFrame f = new ChartFrame("Individual Choice Evaluation", chart);
    f.setVisible(true);
    f.setSize(800, 600);
    f.setLocationRelativeTo(null);

} else {

    JOptionPane.showMessageDialog(null, "Please Select an Individual");
}

I have updated code but it does not work properly still, and I keep getting the old chart back. heres the code.

TimeSeriesCollection dataset = new TimeSeriesCollection();
            dataset.addSeries(s1);
            dataset.addSeries(s2);
            dataset.addSeries(s3);
            dataset.addSeries(s4);
            dataset.addSeries(s5);
            dataset.addSeries(s6);
            dataset.addSeries(s7);
            JFreeChart chart = ChartFactory.createTimeSeriesChart("Time Series Chart for Individual id: "+combo_individualid.getSelectedItem().toString() , "Date", "Value", dataset, true, true, false);



            Shape theShape = ShapeUtilities.createDiamond(1);


            XYPlot plot = (XYPlot) chart.getPlot();
            plot.setBackgroundPaint(Color.lightGray);
            plot.setDomainGridlinePaint(Color.white);
            plot.setRangeGridlinePaint(Color.white);
            plot.setAxisOffset(new RectangleInsets(5.0, 5.0, 5.0, 5.0));
            plot.setDomainCrosshairVisible(true);
            plot.setRangeCrosshairVisible(true);



            XYItemRenderer renderer = plot.getRenderer();

            renderer.setSeriesShape(0, theShape);
            renderer.setSeriesShape(1, theShape);
            renderer.setSeriesShape(2, theShape);
            renderer.setSeriesShape(3, theShape);
            renderer.setSeriesShape(4, theShape);
            renderer.setSeriesShape(5, theShape);
            renderer.setSeriesShape(6, theShape);





            ChartFrame f = new ChartFrame("Individual Choice Evaluation", chart);
            f.setVisible(true);
            f.setSize(800, 600);
            f.setLocationRelativeTo(null);

解决方案

ShapeUtilities.createDiamond() can create a diamond shape; you can apply it as shown in this example of a different Shape.

Addendum: By default, createTimeSeriesChart() creates an XYLineAndShapeRenderer that you can modify as shown below and here.

XYPlot plot = (XYPlot) chart.getPlot();
XYLineAndShapeRenderer r = (XYLineAndShapeRenderer) plot.getRenderer();
r.setSeriesShape(0, ShapeUtilities.createDiamond(5));
r.setSeriesShapesVisible(0, true);

SSCCE:

import java.awt.Dimension;
import java.util.Random;
import javax.swing.JFrame;
import org.jfree.chart.*;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.time.Day;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;
import org.jfree.data.xy.XYDataset;
import org.jfree.util.ShapeUtilities;

/** @see https://stackoverflow.com/a/14822991/230513 */
public class Test {

    private static final int N = 16;
    private static final Random random = new Random();

    private static XYDataset createDataset() {

        final TimeSeries series = new TimeSeries("Data");
        Day current = new Day();
        for (int i = 0; i < N; i++) {
            series.add(current, Math.abs(random.nextGaussian()));
            current = (Day) current.next();
        }
        return new TimeSeriesCollection(series);
    }

    private static JFreeChart createChart(final XYDataset dataset) {
        JFreeChart chart = ChartFactory.createTimeSeriesChart(
            "Test", "Day", "Value", dataset, false, false, false);
        XYPlot plot = (XYPlot) chart.getPlot();
        XYLineAndShapeRenderer r = (XYLineAndShapeRenderer) plot.getRenderer();
        r.setSeriesShape(0, ShapeUtilities.createDiamond(5));
        r.setSeriesShapesVisible(0, true);
        return chart;
    }

    public static void main(String[] args) {

        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        XYDataset dataset = createDataset();
        JFreeChart chart = createChart(dataset);
        ChartPanel chartPanel = new ChartPanel(chart) {

            @Override
            public Dimension getPreferredSize() {
                return new Dimension(630, 480);
            }
        };
        f.add(chartPanel);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }
}

这篇关于如何在JFreechart中获得点的钻石形状的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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