Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > JFreeCharts.TimeSeriesChart - отображение только


Автор: Killer_13 2.4.2012, 17:39
Здравствуйте. у меня такая вот фишка.

Есть Сервлет который генерирует в браузер картинку на основании JFreeCharts.

Может кто сталкивался и подскажет как сделать автоМасштабирование по первому числу месяца, время 6 утра?
И Второе как убрать пункты которые автоматически вставляются в график где есть значение. они слишком огромны!


Я прикрепляю рисунок.
http://dl.dropbox.com/u/26399837/JFreeeChartServlet.png

Дело в том, что например как сейчас на рисунке есть 6 месяцев, а диаграмма вмещает в себе 12 отрезков соответственно все дни делятся на 12 и ставлятся даты, а мне нужно не зависимо сколько дней, нужно поставить линию в 6 утра 1 числа месяца.

Буду благодарен за любую подсказку, не знаю в каком направлении смотреть..
Спасибо! 

И вот код сервлета

Код
package chart;

import java.awt.BasicStroke;
import java.awt.Color;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Random;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.DateAxis;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYItemRenderer;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.data.time.Hour;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;
import org.jfree.data.xy.XYDataset;
import org.jfree.ui.RectangleInsets;

@WebServlet("/ChartServlet")
public class ChartServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    private Random rand = new Random();

    public ChartServlet() {
        super();
    }

    protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("image/png");

        OutputStream outputStream = response.getOutputStream();

        XYDataset dataset = createDataset();
        JFreeChart chart = getChart(dataset);
        int width = 1550;
        int height = 700;
        ChartUtilities.writeChartAsPNG(outputStream, chart, width, height);
    }

    public JFreeChart getChart(XYDataset dataset) {

        JFreeChart chart = ChartFactory.createTimeSeriesChart(
                "JFreeeChartServlet", // title
                "Date", // x-axis label
                "Price", // y-axis label
                dataset, // data
                true, // create legend?
                true, // generate tooltips?
                false // generate URLs?
                );

        chart.setBackgroundPaint(Color.white);
        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 r = plot.getRenderer();
        if (r instanceof XYLineAndShapeRenderer) {
            XYLineAndShapeRenderer renderer = (XYLineAndShapeRenderer) r;
            renderer.setBaseShapesVisible(true);
            renderer.setBaseShapesFilled(true);
        }
        DateAxis axis = (DateAxis) plot.getDomainAxis();
        axis.setDateFormatOverride(new SimpleDateFormat("dd-MMM-yyyy"));
        return chart;
    }

    private XYDataset createDataset() {
        
        double randDouble;
        int checkDay;
        TimeSeries s1 = new TimeSeries("Line1", Hour.class);

        for (int y = 2013; y < 2014; y++) {
            for (int m = 1; m <= 6; m++) {
                checkDay = checkDaytoMouth(m,y);
                for (int d = 1; d <= checkDay; d++) {
                    for (int h = 0; h <= 24; h++) {

                        randDouble = rand.nextDouble() * 100 + 100;

                        s1.add(new Hour(h, d, m, y), randDouble);
                    }
                }
            }
        }
        TimeSeriesCollection dataset = new TimeSeriesCollection();
        dataset.addSeries(s1);
        dataset.setDomainIsPointsInTime(false);

        return dataset;
    }

    private int checkDaytoMouth(int month,int year) {
        Calendar calendar= GregorianCalendar.getInstance();
        calendar.set(Calendar.YEAR, year);
        calendar.set(Calendar.MONTH, month-1);
        int dayOfMonth= calendar.getActualMaximum(Calendar.DATE);

    return dayOfMonth;
    }

}

Автор: Killer_13 2.4.2012, 18:25
Цитата(Killer_13 @  2.4.2012,  17:39 Найти цитируемый пост)
И Второе как убрать пункты которые автоматически вставляются в график где есть значение. они слишком огромны!
 - эту штучку решил, а вот с месяцами парюсь!
Код

renderer.setBaseShapesVisible(false);
 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)