JFreeChart最后X轴标签被切断

时间:2013-04-18 19:09:57

标签: jfreechart truncation axis-labels

我有一个漂亮的,漂亮的JFreeChart生成的折线图,有一个例外 - 我的X轴上的最后一个值被截断,如下所示:


      |
      |
      |_________|________|__________|_________|_________|
    100 Hz    1 kHz    10 kHz    100 kHz    1 MHz    10 MH

(注意,以MHz为单位的z被截断)。

我在这里研究了解决方案:
JFreeChart tick label cut off

但是因为我手动指定LogAxis中的范围,从JavaDoc中可以看出设置边距没有效果。
JavaDoc

这是我用来生成X轴的代码:


      final LogAxis domainAxis = new LogAxis(frequencyAxisLabel);
      domainAxis.setStandardTickUnits(LogAxis.createLogTickUnits(Locale.ENGLISH));
      domainAxis.setRange(100, 10000000); //100Hz to 10MHz
      domainAxis.setUpperMargin(.05);  //Has no effect
      domainAxis.setNumberFormatOverride(new UnitNumberFormat(UnitValue.HERTZ));
      plot.setDomainAxis(domainAxis);

如果有帮助,我也会使用以下内容将其写入.svg文件:


          // Get a DOMImplementation and create an XML document
      DOMImplementation domImpl = GenericDOMImplementation.getDOMImplementation();
      Document document = domImpl.createDocument(null, "svg", null);

      // Create an instance of the SVG Generator
      SVGGraphics2D svgGenerator = new SVGGraphics2D(document);
      svgGenerator.setSVGCanvasSize(new Dimension(720, 470));

      // draw the chart in the SVG generator
      Rectangle bounds = new Rectangle(10, 10, 700, 450);
      chart.draw(svgGenerator, bounds);

      // Write svg file
      OutputStream outputStream = new FileOutputStream(new File("SomePath));
      Writer out = new OutputStreamWriter(outputStream, "UTF-8");
      svgGenerator.stream(out, true /* use css */);
      outputStream.flush();
      outputStream.close();

鉴于setUpperMargin()方法不会产生影响,我将如何确保标签有足够的空间来完全打印?我也愿意旋转刻度标签,虽然我还没想出怎么做,只是如何旋转轴标签。

3 个答案:

答案 0 :(得分:2)

好的,找到了一个有效的解决方案。

我用过

chart.setPadding(new RectangleInsets(10, 10, 10, 10));
显然你的里程可能会有所不同,但这似乎适用于我的目的。

答案 1 :(得分:1)

另一种解决方案可以在jfreechart board

上找到

简而言之,将以下内容添加到生成X轴的代码中:

plot.getDomainAxis().setMaximumCategoryLabelWidthRatio(1.0f);

或者,对于上面的代码;

domainAxis.setMaximumCategoryLabelWidthRatio(1.0f);

这解决了我使用水平条形图的问题,其中长域标签被截断为“...”后缀。

答案 2 :(得分:0)

试试这个:

//更改范围轴顶部的边距...

NumberAxis rangeAxis =(NumberAxis)plot.getRangeAxis();

rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());

    rangeAxis.setUpperMargin(0.15);

    rangeAxis.setLowerMargin(0.15);