【问题标题】:Custom percentage thresholds on y-axis with uneven spacingy 轴上的自定义百分比阈值,间距不均匀
【发布时间】:2017-04-03 06:14:57
【问题描述】:

我的问题:使用,我需要在 y 轴上显示不均匀间隔的百分比阈值。例如,我的 y 轴上唯一的标签应该是阈值,如下所示;所有其他坐标应为空白:

-
93%
85%
78%
72%
66%
-
50%
-
-
-
-
-

我目前正在使用此代码 sn-p 进行百分比显示,但这只会创建一个均匀间隔的百分比轴:

    CategoryPlot plot = (CategoryPlot) chart.getPlot();

    NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();
    DecimalFormat pctFormat = new DecimalFormat("#.0%");
    rangeAxis.setNumberFormatOverride(pctFormat);

任何帮助将不胜感激!

【问题讨论】:

  • 您仍然希望 50% 为一半,80% 为五分之四,等等?
  • 是的,相对定位不应该改变(没有对数刻度),只是重要的阈值应该有标签。
  • 也许可以试试SymbolAxis,建议here
  • 您将如何使用 SymbolAxis 来实现这一点?如果我理解正确,它只是切换标签,但对特定的选择和间距没有影响。为了确保,问题不在于显示百分比,而在于仅选择要显示的特定百分比阈值。
  • 从您对我的问题的编辑中,我看到您希望如何使用 SymbolAxis 解决我的问题,只需将空字符串添加到所有不应该显示的均匀间隔标签。不幸的是,这不是目的,阈值也可以是 50%、66%、72%、81%、85% - 我会更改我的帖子以反映这一点。

标签: jfreechart java label customization jfreechart percentage


【解决方案1】:

这是一个有点老套的答案,我会赞成任何能以一种好的方式获得相同结果的答案。但它有效 - 这就是我所做的。

首先,我创建了一个我想要使用的双精度值列表:

public static List<Double> m_lPercentageValuesForY = Arrays.asList(0.1,0.2,0.3,0.4,0.5,0.58,0.66,0.70,0.74,0.78,0.82,0.95,1.0);

然后我覆盖 NumberAxis 中的 refreshTicks 方法,首先将所有默认刻度设置为 Ticktype.MINOR,然后使用 Ticktype.MAJOR 添加并创建我的自定义刻度:

    NumberAxis axisLeft = new NumberAxis(plot.getRangeAxis().getLabel()) {
        @Override
        public List refreshTicks(
                Graphics2D g2, 
                AxisState state,
                Rectangle2D dataArea, 
                RectangleEdge edge) {

            List defaultTicks = super.refreshTicks(g2, state, dataArea, edge);
            List customTicks = new ArrayList();

            for (Object aTick : defaultTicks) {
                NumberTick currenttick = (NumberTick) aTick;

                customTicks.add(new NumberTick(
                        TickType.MINOR, 
                        currenttick.getValue(), 
                        "",  //empty
                        currenttick.getTextAnchor(), 
                        currenttick.getRotationAnchor(),
                        currenttick.getAngle()));
            }
            NumberTick aTick = (NumberTick) defaultTicks.get(0);
            for (double dTest : m_lPercentageValuesForY) {
                customTicks.add(new NumberTick(
                        TickType.MAJOR, 
                        dTest, 
                        String.format("%.0f%%", dTest * 100), //only wanted values are set to major
                        aTick.getTextAnchor(), 
                        aTick.getRotationAnchor(),
                        aTick.getAngle()));
            }
            return customTicks;
        }
    };
    plot.setRangeAxis(axisLeft);

【讨论】:

  • 建议使用类似的方法here
  • 感谢您发现它,甚至来自 jfreechart 的创建者本人!我/我希望有一种正式的方式来创建一个完全定制的轴,但这个要求可能太罕见或太具体,无法证明方法或类的合理性。由于我刚刚加入了stackoverflow,即使答案是我自己而不是那么好,是否可以标记此线程已回答?
  • 鼓励您answer your own question;您可以通过点击左侧的empty check mark 来接受这个答案;如果您愿意,您可以稍后接受另一个答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-13
  • 1970-01-01
  • 2017-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多