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