【问题标题】:jFreeChart LineChart adjust TicksjFreeChart LineChart 调整刻度
【发布时间】:2012-07-27 14:59:41
【问题描述】:

我确定答案就在这里,但我真的找不到。

我有一个包含很多条目的 LineChart(比如说 1000 个)。在图中,我可以很好地看到(并调整(参见 A))Y 轴。只是 X 轴让我发疯! 对于 1000 个条目,图的底部没有编号。

答: 有了这个,我可以很好地调整 Y 轴。 final NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis(); rangeAxis.setRange(0.00, 1.00); rangeAxis.setTickUnit(new NumberTickUnit(0.2)); rangeAxis.setVerticalTickLabels(false);

我想对 X 轴做同样的事情。

请帮帮我。 非常感谢


-> 第一个答案的问题 |域轴有 100 个数字,间隔为 50

【问题讨论】:

  • 如果您能提供一些额外的信息,最好是一个独立的示例 (SSCCE),我们可能会提供帮助。我试过同时使用LineChartXYLineChart 并且都在DomainAxis 上显示数字
  • 嗨,我得到的一个答案非常好。约翰真的理解我的问题,我认为他几乎解决了它。剩下的唯一问题是,我只看到“...”应该有 100、200 等。

标签: jfreechart linechart


【解决方案1】:

恐怕你得修改JfreeChart的代码,Opensource很棒吗?

我的 BarChart 之前遇到过这个问题,我所做的是自定义 x 轴上的刻度 我只为 CategoryAxis.java 单独实现了这个。我希望这能给你一些启发。

请注意变量“tickInterval”,我将此属性添加到类中, 例如您有 1000 个数字,如果将 tickInterval 设置为 99,则只有 0, 100, 200, 300 ...将会出现。

顺便说一下,我的 freechart 版本是 1.0.5

public List refreshTicks(Graphics2D g2, 
                         AxisState state,
                         Rectangle2D dataArea,
                         RectangleEdge edge) {

    List ticks = new java.util.ArrayList();

    // sanity check for data area...
    if (dataArea.getHeight() <= 0.0 || dataArea.getWidth() < 0.0) {
        return ticks;
    }

    CategoryPlot plot = (CategoryPlot) getPlot();
    List categories = plot.getCategoriesForAxis(this);
    double max = 0.0;

    if (categories != null) {
        CategoryLabelPosition position 
                = this.categoryLabelPositions.getLabelPosition(edge);
        float r = this.maximumCategoryLabelWidthRatio;
        if (r <= 0.0) {
            r = position.getWidthRatio();   
        }

        float l = 0.0f;
        if (position.getWidthType() == CategoryLabelWidthType.CATEGORY) {
            l = (float) calculateCategorySize(categories.size(), dataArea, 
                    edge);  
        }
        else {
            if (RectangleEdge.isLeftOrRight(edge)) {
                l = (float) dataArea.getWidth();   
            }
            else {
                l = (float) dataArea.getHeight();   
            }
        }
        int categoryIndex = 0;
        Iterator iterator = categories.iterator();
        while (iterator.hasNext()) {
            Comparable category = (Comparable) iterator.next();
            if(categoryIndex>0 && tickInterval>0)
            {
                if((categoryIndex+1) % (tickInterval+1) > 0)
                {
                    category = "";
                }
            }

            TextBlock label = null;
            if(tickInterval> 0)
            {
                label = this.createSingleLabel(category, l * r, edge, g2);
            }
            else
            {
                label = createLabel(category, l * r, edge, g2);
            }
            if (edge == RectangleEdge.TOP || edge == RectangleEdge.BOTTOM) {
                max = Math.max(max, calculateTextBlockHeight(label, 
                        position, g2));
            }
            else if (edge == RectangleEdge.LEFT 
                    || edge == RectangleEdge.RIGHT) {
                max = Math.max(max, calculateTextBlockWidth(label, 
                        position, g2));
            }
            Tick tick = new CategoryTick(category, label, 
                    position.getLabelAnchor(), position.getRotationAnchor(), 
                    position.getAngle());
            ticks.add(tick);
            categoryIndex = categoryIndex + 1;
        }
    }
    state.setMax(max);
    return ticks;

}

【讨论】:

  • 您好,感谢您的帮助。它几乎可以工作,但似乎还有什么问题。我得到一个间隔,但标签只包含三个点,而不是实数。比如 10/20/30... 等等。
猜你喜欢
  • 2012-12-12
  • 2012-04-19
  • 2019-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-13
  • 2013-10-31
相关资源
最近更新 更多