当前位置: 首页 > 知识库问答 >
问题:

JFreeChart最后一个X轴标签切割

隆选
2023-03-14

我有一个漂亮的JFreeChart生成的折线图,有一个例外——我X轴上的最后一个值被截断了,就像这样:


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

(注意,以兆赫为单位的z被切断)。

我在这里研究了解决方案:
JFreeChart勾号标签切断

但是因为我在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个答案

夏立果
2023-03-14

试试这个:

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

NumberAxis=(NumberAxis)plot.getRangeAxis();

范围轴。设置标准滴答单位(NumberAxis.createIntegerTickUnits());

    rangeAxis.setUpperMargin(0.15);

    rangeAxis.setLowerMargin(0.15);
季骏祥
2023-03-14

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

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

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

或者,对于上面的代码;

domainAxis.setMaximumCategoryLabelWidthRatio(1.0f);

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

邓光赫
2023-03-14

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

我曾经

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

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

 类似资料:
  • 在JFreechart中,我有一个带有日期(和时间)的X轴。 我怎样才能让JFreechart优化它们并充分利用它们? 现在它包含的标签比空间多,所有标签都转换为“…”。 如果不是所有的刻度都有标签,这是完全可以的,但是我想要尽可能多的(如果它们合适并且可以完全显示)。 我怎样才能做到这一点? 这里是完整的最小源来重现截断的标签。(默认情况下,JFreechart不处理优化: 我更喜欢像@tras

  • 我有一个图表,以为域。它看起来很好,但是最后一个轴标签有时会离开图表区域。下面是要重现的示例代码: 以下是当前的截图;问题可以在最后一个标签上看到: 是什么原因导致最后一个标签呈现在当前图表区域之外?还有,我该如何预防呢? 但是,如果我将lot_of_values更改为true(这将向集合中添加更多数据-您可以在源代码中看到),那么域轴的最后一个标签将被剪切。下面是lot_of_values=tr

  • 我有数据,例如(13600),(24400)。。。(3315000)其中(13000)- 如果放入图表中,轴将显示“秒”作为数字。我设置了一个代码,以1小时为间隔显示轴标签。 现在轴标签是:0。。。3600 ... 7200 ... 10.800 ... 如何使轴标签以小时显示?(0 ... 1 ... 2 ... 3 ...)

  • 我的Python脚本里有这个 它产生了一个像这样的图表 正如你所看到的,x标签被切断了,这不是我没有完全扩展图形,我已经尝试过了,它仍然被切断。我怎样才能在图表上得到整个标签? 谢啦

  • 问题内容: 我有一个始终从x = 0开始的JFree XY折线图。然后,根据属性文件中用户定义的设置,应用程序将根据该数字(以分钟为单位)递增。 例如,x = 0开始时,用户定义的设置为5,因此刻度变为0、5、10、15、20…,或者用户设置为3,因此变为0、3、6、9、12…非常简单。 我遇到的问题是图表开始的方式。如果我从0开始,则0在图形的中间,而不是在左下角的-0.0000005,-0.0

  • 到目前为止,除了第一个和最后一个标签(Su和S)上的值之外,一切都很好。有没有办法添加填充,这样Su在X轴的左边有一些填充,可以完全渲染圆,S在右边有一些填充,这样S的圆值就可以完全渲染。我试着手动设置填充,通过许多例子,但是到目前为止还没有正确的工作。有人有什么想法,可以指出正确的方向,那就太好了。谢谢!