【问题标题】:How to disable scaling in JFreeChart?如何在 JFreeChart 中禁用缩放?
【发布时间】:2010-05-25 13:06:44
【问题描述】:

我们正在使用 JFreeChart 构建一个引擎来显示图表。这是一个在 Tomcat + Java 1.5.0 上运行的 Web 服务,并将图表呈现为 PNG 和 JPEG(使用 ChartUtilities.writeChartAs{PNG,JPEG}() )。

我们遇到了一个问题,JFreeChart 似乎可以缩放绘图区域内的所有内容,但只能缩放几个像素。结果是图表看起来不一致,例如:

  • 小刻度有时会水平拉伸,因此它们看起来是两个像素宽,而不是一个。
  • 我们使用绘图区域右上角的小图像作为水印。这在其中间附近(但不完全是)某处水平和垂直拉伸了一个像素。
  • 背景网格线似乎出现在子像素边界上。我还没有找到一种方法来创建精确的虚线网格线。

我们尝试了 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: 我们采用了子类化或代理渲染器,并在其 drawItem()(或类似)方法中绘制文本中的标签。这很好用。 然而,小刻度现在是一个问题——它们似乎也在扩大。例如:查看第 9 和第 15 个滴答声。

look at the bottom http://img14.imageshack.us/img14/3625/76676732.jpg

【问题讨论】:

  • 您能否发送一份 SSCCE 来说明您的问题?另外,您是否尝试过启用抗锯齿功能?它可能会改善结果。

标签: java graph jfreechart


【解决方案1】:

我无法在以下代码中重现您使用 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();
}

屏幕是否显示相同的伪影?当您更改WIDTHHEIGHT 参数或省略水印时会发生什么?您是否使用具有不寻常指标的特殊字体?您是否尝试过其他平台?

您可以按如下方式运行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) 有点时髦。

【讨论】:

  • 1.这个问题在所有宽度和高度都重复出现。 2. 水印的(不)存在不会改变任何东西——我仍然看到缩放伪影。 3.不指定字体不会改变这种情况。 4. 我已经在几台 Windows 和 Linux 机器上运行过它。我将尝试编写一段最少的代码来演示这一点。
  • trashgod:你说的是TimeSeriesDemo1,还是我上面的例子(testScaling1())?
  • TimeSeriesDemo1 在 Ubuntu 上,上图使用 saveChartAsPNG()
  • trashgod:感谢您的努力,但不幸的是,这并不是那么有帮助,因为绘图区域不包含任何像我上面所说的那样进行缩放的元素。我们已经通过使用文本标签解决了我们的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 2019-03-20
  • 2011-10-20
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
相关资源
最近更新 更多