setTickMarkPosition Not Working

A discussion forum for JFreeChart (a 2D chart library for the Java platform).
Locked
fabiodaitx
Posts: 1
Joined: Mon May 18, 2009 4:19 am

setTickMarkPosition Not Working

Post by fabiodaitx » Mon May 18, 2009 4:25 am

Hi everyone,

I am trying to set a graph with 15 min interval tick values for the domain axis.
I am using a barchart and I am trying to setTickMarkPosition(DateTickMarkPosition.MIDDLE)
but it is not working. Can anyone help me (see code below)?

Code: Select all

// from jfreechart TimePeriodValuesDemo3.java
package xip270trunks;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.GradientPaint;
import java.awt.Paint;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.util.Date;
import java.util.Random;

import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.annotations.XYAnnotation;
import org.jfree.chart.annotations.XYDrawableAnnotation;
import org.jfree.chart.annotations.XYPointerAnnotation;
import org.jfree.chart.axis.DateAxis;
import org.jfree.chart.axis.DateTickMarkPosition;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.renderer.xy.StandardXYBarPainter;

import org.jfree.chart.labels.XYToolTipGenerator;
import org.jfree.chart.plot.CategoryMarker;
import org.jfree.chart.plot.Marker;
import org.jfree.chart.plot.IntervalMarker;
import org.jfree.chart.plot.ValueMarker;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYBarRenderer;
import org.jfree.chart.renderer.xy.XYItemRenderer;
import org.jfree.chart.util.RelativeDateFormat;
import org.jfree.chart.axis.DateTickMarkPosition;
import org.jfree.data.time.Day;
import org.jfree.data.time.Hour;
import org.jfree.data.time.Minute;
import org.jfree.data.time.SimpleTimePeriod;
import org.jfree.data.time.TimePeriodValues;
import org.jfree.data.time.TimePeriodValuesCollection;
import org.jfree.data.xy.XYDataset;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.Layer;
import org.jfree.ui.RectangleAnchor;
import org.jfree.ui.RectangleInsets;
import org.jfree.ui.RefineryUtilities;
import org.jfree.ui.StrokeSample;
import org.jfree.ui.TextAnchor;


/**
 * This demo shows a bar chart with time based data where the time periods are slightly
 * irregular.
 *
 */
public class Chart extends ApplicationFrame {

	public static ChartPanel chartPanel;

    /**
     * Creates a new demo instance.
     *
     * @param title  the frame title.
     */
    public Chart(final String title, String yTitle, String xTitle, String labelStr, int labelTimeHour, int labelTimeMin, double[] xDataset) {

        super(title);

       
        final XYDataset data1 = createDataset(getCompleteArray(xDataset));
        final XYItemRenderer renderer1 = new XYBarRenderer();

        //renderer1.setPaint(Color.BLUE); // muda a cor
        //renderer1.setSeriesPaint(0, new GradientPaint(     0.0f, 0.0f, Color.YELLOW,     0.0f, 0.0f,Color.YELLOW.darker() ));
        // desliga gradiente
        //XYBarRenderer rend = (XYBarRenderer) plot.getRenderer();
        //rend.setBarPainter( new StandardXYBarPainter() );
        //rend.setShadowVisible(false);
       
        final DateAxis domainAxis = new DateAxis(xTitle);
        domainAxis.setTickMarkPosition(DateTickMarkPosition.MIDDLE); //FIXME not working (XYPlot converts it to valueaxis instead of dataaxis)
        
        final ValueAxis rangeAxis = new NumberAxis(yTitle);
       
        final XYPlot plot = new XYPlot(data1, domainAxis, rangeAxis, renderer1);
        plot.getDomainAxis().setLabelFont(new Font("SansSerif", Font.BOLD, 15));
        plot.getRangeAxis().setLabelFont(new Font("SansSerif", Font.BOLD, 15));
        plot.getDomainAxis().setLowerMargin(0.02);
        plot.getDomainAxis().setUpperMargin(0.02);
                
        // add a labelled marker for the original closing time...
        final Hour hour = new Hour(labelTimeHour, new Day(15, 5, 2009));
        Minute minute = new Minute(labelTimeMin, hour);
        double millis = minute.getMiddleMillisecond();
        
        final Marker originalEnd = new ValueMarker(millis);
        originalEnd.setPaint(Color.blue);
        originalEnd.setLabel(labelStr);        
        // Alinha a informação a direito ou esquerda da barra
        if (labelTimeHour > 12) {
            originalEnd.setLabelAnchor(RectangleAnchor.TOP_LEFT);
            originalEnd.setLabelTextAnchor(TextAnchor.TOP_RIGHT);        	
        } else {
            originalEnd.setLabelAnchor(RectangleAnchor.TOP_RIGHT);
            originalEnd.setLabelTextAnchor(TextAnchor.TOP_LEFT);
        }        
        originalEnd.setLabelPaint(Color.BLACK);
        //originalEnd.setLabelFont(new Font("SansSerif", Font.BOLD, 12));        
        originalEnd.setStroke(new BasicStroke(3f, BasicStroke.CAP_BUTT,	BasicStroke.JOIN_BEVEL));
        plot.addDomainMarker(originalEnd);
             
        final JFreeChart chart = new JFreeChart(/*"Time Period Values Demo 3"*/"", plot);
        //chart.setBackgroundPaint(new GradientPaint(0, 0, Color.white, 0, 2000, Color.blue));
        chart.removeLegend();        
        /*final ChartPanel*/chartPanel = new ChartPanel(chart);       
        chartPanel.setPreferredSize(new java.awt.Dimension(500, 270));
        chartPanel.setMouseZoomable(true, true);
        setContentPane(chartPanel);

    }

    /**
     * Creates a dataset of 96 elements, filling array with zeros
     * when size of received array of values is < 96
     *
     * @return the dataset with 96 values.
     */
    private double [] getCompleteArray(double[] xDataset) {
    	double xDatasetComplete [];
    	
        if (xDataset.length < 96) {
        	xDatasetComplete = new double[96];
        	int i=0;
        	
        	for (;i<xDataset.length;i++) {
        		xDatasetComplete[i] = xDataset[i];
        	}
        	for (;i<96;i++) {
        		xDatasetComplete[i] = 0;
        	}
        } else {
        	xDatasetComplete = xDataset;
        }
        return xDatasetComplete;
    }
    
    // ****************************************************************************
    // * JFREECHART DEVELOPER GUIDE                                               *
    // * The JFreeChart Developer Guide, written by David Gilbert, is available   *
    // * to purchase from Object Refinery Limited:                                *
    // *                                                                          *
    // * http://www.object-refinery.com/jfreechart/guide.html                     *
    // *                                                                          *
    // * Sales are used to provide funding for the JFreeChart project - please    *
    // * support us so that we can continue developing free software.             *
    // ****************************************************************************
   
    /**
     * Creates a dataset, consisting of two series of monthly data.
     *
     * @return the dataset.
     */
    public XYDataset createDataset(double[] xDataset) {

        final TimePeriodValues s1 = new TimePeriodValues("Series 1");
        String data;
        String hora;
        DecimalFormat  form  = new DecimalFormat("00");
        
        Date d [] = new Date[96];
    
        data = "15/5/2009";
       
        final DateFormat df = DateFormat.getInstance();
       
        // 24 hours with 15 mins intervals - define periods
        for (int i=0; i<24; i++) {           
            for (int j=0,k=0; j<60; j+=15,k++) {
                hora = Integer.toString(i) + ":" + form.format(j) + ":00.000";
                try {
                    d[i*4+k]= df.parse(data + " " + hora);
                }
                catch (Exception e) {
                    System.out.println(e.toString());
                }
            }               
        }
       
        // 24 hours with 15 mins intervals - fill periods with values
        int idx;
        for (int i=0; i<24; i++) {
            for (int j=0; j<4; j++) {
                idx = i*4+j+1;               
                if (idx < 96) {
                    s1.add(new SimpleTimePeriod(d[idx-1], d[idx]), xDataset[idx-1]);
                }             
            }
        }
       
/*      // final DateFormat df = DateFormat.getInstance();
        try {
            final Date d0 = df.parse("11/5/2003 0:00:00.000");
            final Date d1 = df.parse("11/5/2003 0:15:00.000");
            final Date d2 = df.parse("11/5/2003 0:30:00.000");
            final Date d3 = df.parse("11/5/2003 0:45:00.000");
            final Date d4 = df.parse("11/5/2003 1:00:00.001");
            final Date d5 = df.parse("11/5/2003 1:14:59.999");
            final Date d6 = df.parse("11/5/2003 1:30:00.000");
            final Date d7 = df.parse("11/5/2003 1:45:00.000");
            final Date d8 = df.parse("11/5/2003 2:00:00.000");
            final Date d9 = df.parse("11/5/2003 2:15:00.000");
            final Date d10 = df.parse("11/5/2003 2:30:00.000");
               
            s1.add(new SimpleTimePeriod(d0, d1), 0.39);
            //s1.add(new SimpleTimePeriod(d1, d2), 0.338);
            s1.add(new SimpleTimePeriod(d2, d3), 0.225);
            s1.add(new SimpleTimePeriod(d3, d4), 0.235);
            s1.add(new SimpleTimePeriod(d4, d5), 0.238);
            s1.add(new SimpleTimePeriod(d5, d6), 0.236);
            s1.add(new SimpleTimePeriod(d6, d7), 0.25);
            s1.add(new SimpleTimePeriod(d7, d8), 0.238);
            s1.add(new SimpleTimePeriod(d8, d9), 0.215);
            s1.add(new SimpleTimePeriod(d9, d10), 0.085);
        }
        catch (Exception e) {
            System.out.println(e.toString());
        }
*/
        final TimePeriodValuesCollection dataset = new TimePeriodValuesCollection();
        dataset.addSeries(s1);
        dataset.setDomainIsPointsInTime(false);

        return dataset;

    }

    /**
     * Starting point for the demonstration application.
     *
     * @param args  ignored.
     */
    public static void main(final String[] args) {

    	double myDataset [] = new double[96];
    	Random r = new Random();
    	for (int i=0; i < 96; i++){
    		myDataset[i] = r.nextDouble();
    	}
        final Chart xip270trunks = new Chart("title", "Value", "Time","ttt",3,15, myDataset);
        xip270trunks.pack();
        RefineryUtilities.centerFrameOnScreen(xip270trunks);
        xip270trunks.setVisible(true);

    }

}


MP3HiFi
Posts: 12
Joined: Fri Apr 11, 2008 8:02 am

Re: setTickMarkPosition Not Working

Post by MP3HiFi » Wed Sep 09, 2009 2:23 pm

Hi,

I have the same problem. It seems that the markers are not affected by setTickMarkPosition.

For example I have a DateAxis using

Code: Select all

TimeSeries ts = new TimeSeries("Quantile " + (quantileIndex + 1), Month.class);
The Values are affected by using TickMarkPosition, but not the Markers i set.

Best Regards

Locked