Как отключить масштабирование в JFreeChart? - PullRequest
3 голосов
/ 25 мая 2010

Мы используем JFreeChart для создания движка для отображения графиков. Это веб-служба, которая работает на Tomcat + Java 1.5.0 и отображает диаграммы в PNG и JPEG (используя ChartUtilities.writeChartAs {PNG, JPEG} ()).

Мы столкнулись с проблемой, когда JFreeChart, кажется, масштабирует все в области графика, но только на несколько пикселей. В результате график выглядит непоследовательным, например ::1003

  • Незначительные галочки иногда растягиваются по горизонтали, так что они кажутся шириной в два пикселя вместо одного.
  • Мы используем небольшое изображение в правом верхнем углу области графика в качестве водяного знака. Это растянуто на один пиксель по горизонтали и вертикали где-то рядом (но не совсем) с его серединой.
  • Кажется, что фоновые линии сетки появляются на границах субпикселей. Я не нашел способ создать точно пунктирную линию сетки.

Мы попробовали и 1.0.9, и 1.0.13, с абсолютно одинаковыми результатами (за исключением мелких тиков, которые не были доступны в более старой версии). Кроме того, рендеринг изображения в Frame вместо JPEG / PNG дал идентичный результат.

Помощь с благодарностью, заранее:)

РЕДАКТИРОВАТЬ: SSCCE:

@Test
public void testScaling1() throws InterruptedException {

    // Load Image:
    Component dummy = new Component() {};
    MediaTracker tracker = new MediaTracker(dummy);
    Image img = Toolkit.getDefaultToolkit().getImage("C:\\My\Image.gif");
    tracker.addImage(img, 0);
    tracker.waitForAll();

    // Build Data set and base chart.
    TimeSeriesCollection dataset = new TimeSeriesCollection();

    TimeSeries ts = new TimeSeries("Sample");
    ts.add(new Second(0, 0, 0, 1, 1, 1900), 1.0);
    ts.add(new Second(1, 0, 0, 1, 1, 1900), 3.0);
    ts.add(new Second(2, 0, 0, 1, 1, 1900), 4.0);
    ts.add(new Second(3, 0, 0, 1, 1, 1900), 2.0);

    dataset.addSeries(ts);

    JFreeChart chart = ChartFactory.createTimeSeriesChart(
            "blabla",
            null,
            null,
            dataset,
            true,
            true,
            false
    );

    // Add BG image in top-right corner.
    XYPlot xy = chart.getXYPlot();
    xy.setBackgroundAlpha(0.0F);
    xy.setBackgroundImage(img);
    xy.setBackgroundImageAlignment(Align.NORTH_WEST);
    xy.setBackgroundImageAlpha(1.0F);

    paintChart(chart);

}

Используйте изображение с мелким шрифтом или сетку. Это покажет эффект масштабирования на фоновом изображении.

Редактировать 2: Мы прибегли к созданию подклассов или проксированию Renderers и рисованию метки в тексте их методами drawItem () (или аналогичными). Это хорошо работает. Тем не менее, небольшие тики теперь являются проблемой - они также, похоже, масштабируются. Например: см. 9-й и 15-й тики.

посмотрите внизу http://img14.imageshack.us/img14/3625/76676732.jpg

1 Ответ

1 голос
/ 25 мая 2010

Я не могу воспроизвести описанный вами эффект, используя saveChartAsJPEG() или writeChartAsPNG() с версией 1.0.13, Java 1.5, Mac OS X, в коде, подобном этому:

try {
    ChartUtilities.writeChartAsPNG(new FileOutputStream(
        new File("test.png")), chart, 600, 400);
} catch (IOException ex) {
    ex.printStackTrace();
}

Есть ли на экране те же артефакты? Что происходит, когда вы изменяете параметры WIDTH и HEIGHT или опускаете водяной знак? Вы используете специальные шрифты с необычными метриками? Вы пробовали другую платформу?

Вы можете запустить TimeSeriesChartDemo1 следующим образом:

java -cp jfreechart-1.0.13.jar: jcommon-1.0.16.jar org.jfree.chart.demo.TimeSeriesChartDemo1

Mac OS 10.5.8, Java 1.5.0_24, JFreeChart 1.0.13, TimeSeriesDemo1 , с использованием saveChartAsPNG(), ImageIO.read() и setBackgroundImage(). setBackgroundImageAlignment(Align.NORTH_WEST) немного прикольный.

альтернативный текст http://i45.tinypic.com/68wxgp.png

...