【问题标题】:Dynamic setting of Domain Axis Min Value Expression域轴最小值表达式的动态设置
【发布时间】:2013-08-01 07:45:48
【问题描述】:

我创建了一个时间序列图表,我希望 x 轴从我的序列的最小值开始,现在从 sql 返回的最小值是 '2011-06-30' 但 x 轴似乎从“2011-05-01”开始。我尝试通过计算最小日期并将其映射到 java.util.Date 字段,然后将该字段设置为域轴最小值表达式来从 sql 设置它,但没有运气。 我还使用 java Customizerclass 来修改图表的布局,如果我在我的自定义程序类中这样做,它似乎可以工作:

RotatingLabelAxis domainAxis = new RotatingLabelAxis();

SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy");
java.util.Date date = null;
try {
    date = sdf.parse("30.06.2011");  //Would like this to be the first date in plot instead.
} catch (ParseException e) {
    e.printStackTrace();
}

domainAxis.setMinimumDate(date);

这似乎使第一个值为 2011-07-01 的值是正确的。问题是我希望上面示例中的日期“2011-06-30”改为从系列中的最低日期设置。有没有办法执行以下操作之一:
* 从定制器类中获取系列中的最短日期。
* 一种在 sql 查询中映射的方法以正确的格式返回计算出的思维导图,以便我可以在“域轴最小值表达式”字段中正确设置图表?
非常感谢任何帮助。

【问题讨论】:

  • JFreeChart 的 DateAxis.setMinimumDate() 需要一个 java.util.Date 参数。您可以在此处找到 JavaDoc:jfree.org/jfreechart/api/javadoc/org/jfree/chart/axis/…。为什么你认为你必须通过 java.sql.Date?关于你的其余问题,我没有看到你的问题。请改写并解释什么是“customizerclass”是您需要它的原因。
  • 嗨马丁,我已经厌倦了使用 java.util.Date 代替,结果似乎是一样的。我还基于此修改了我的上述问题和示例。我也试图澄清这个问题,所以希望现在我所追求的更清楚。告诉我是否应该在问题中添加更多信息或修改其中的其他内容。问候罗伯特

标签: java charts jasper-reports jfreechart


【解决方案1】:

JFreeChart 应该自动设置您的 DomainAxis (DateAxis) 上的最小值和最大值,除非您使用 setAutoRange(false) 禁用此功能。如果自动范围不适合您的需要,您可以使用 setMinumumDate()/setMaximumDate() 方法来调整此范围(就像您在示例代码中所做的那样)。

您确实为 JFreeChart 的数据集提供了值,因此在没有 JFreeChart 的情况下应该可以找到最短日期。但是,您可以像这样询问实际使用的数据集(我假设是TimeSeriesCollection):

XYPlot xyPlot = chart.getXYPlot();
XYDataset dataset = (XYDataset)xyPlot.getDataset();
double lowerBound = dataset.getXValue(0, 0);
double lowerBound = getDomainLowerBound(false);
java.util.Date lowerDate = new java.util.Date((long)lowerBound);
domainAxis.setMinimumDate(lowerDate);

注意,默认情况下,该轴的边距也大于零。使用domainAxis.setLowerMargin(0.0) 消除这种情况。上边距的类比。

【讨论】:

  • 嗨 Martin,时间序列类型的图表似乎不存在 getDomainLowerBound(false)。我可以为许多对象调用 getLowerBound(),例如:\n domainAxis.getLowerBound()
  • 嗨,马丁,我发现了一些有用的东西。正如我上面提到的,getDomainLowerBound(false) 似乎不存在,但可以这样做。您的回答确实使我朝着正确的方向前进,因此如果您修改答案,我会将其标记为已解决: XYPlot xyPlot = chart.getXYPlot(); XYDataset 数据集 = (XYDataset)xyPlot.getDataset();双下界 = dataset.getXValue(0, 0); java.util.Date lowerDate = new java.util.Date((long)lowerBound); domainAxis.setMinimumDate(lowerDate);
  • 您好,我在上面的答案中添加了正确的代码,因为它看起来更好。尽管我认为您需要承认更改才能使其正常工作。感谢您的回答,它确实解决了我的问题。
  • 嗨罗伯特!抱歉,我错过了在代码中提及数据集部分。但你得到了它的意思。我不能接受您的代码更改,因为我必须降低声誉,但我按照您的建议编辑了代码。
  • 谢谢,是的,我也有声誉低的问题。但是,是的,我想这应该是完整的答案并且问题已经解决。再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-20
  • 2013-02-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多