2

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

      |
      |
      |_________|________|__________|_________|_________|
    100 赫兹 1 赫兹 10 赫兹 100 赫兹 1 兆赫 10 兆赫

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

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

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

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

      最终 LogAxis domainAxis = new LogAxis(frequencyAxisLabel);
      domainAxis.setStandardTickUnits(LogAxis.createLogTickUnits(Locale.ENGLISH));
      domainAxis.setRange(100, 10000000); //100Hz 到 10MHz
      domainAxis.setUpperMargin(.05); //没有效果
      domainAxis.setNumberFormatOverride(new UnitNumberFormat(UnitValue.HERTZ));
      plot.setDomainAxis(domainAxis);

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

          // 获取一个 DOMImplementation 并创建一个 XML 文档
      DOMImplementation domImpl = GenericDOMImplementation.getDOMImplementation();
      文档 document = domImpl.createDocument(null, "svg", null);

      // 创建 SVG 生成器的实例
      SVGGraphics2D svgGenerator = new SVGGraphics2D(document);
      svgGenerator.setSVGCanvasSize(新维度(720, 470));

      // 在 SVG 生成器中绘制图表
      矩形边界 = new Rectangle(10, 10, 700, 450);
      chart.draw(svgGenerator, bounds);

      //写入svg文件
      OutputStream outputStream = new FileOutputStream(new File("SomePath));
      Writer out = new OutputStreamWriter(outputStream, "UTF-8");
      svgGenerator.stream(out, true /* 使用 css */);
      outputStream.flush();
      outputStream.close();

鉴于 setUpperMargin() 方法不会产生影响,我将如何确保标签有足够的空间来完全打印?我也愿意旋转刻度标签,虽然我还没有弄清楚如何做到这一点,只知道如何旋转轴标签。

4

3 回答 3

2

好的,找到了一种可行的解决方案。

我用了

chart.setPadding(new RectangleInsets(10, 10, 10, 10));

显然,您的里程可能会有所不同,但这似乎符合我的目的。

于 2013-04-18T19:23:31.377 回答
1

在jfreechart 板上可以找到另一种解决方案

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

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

或者,对于您上面的代码;

domainAxis.setMaximumCategoryLabelWidthRatio(1.0f);

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

于 2014-02-24T15:43:20.853 回答
0

试试这个:

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

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

rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());

    rangeAxis.setUpperMargin(0.15);

    rangeAxis.setLowerMargin(0.15);
于 2015-07-08T12:28:42.203 回答