2

我需要每个数据点恰好有一个刻度线。

我很想NumberAxis 中的 refreshTicksHorizo​​ntal 一个带有数据点的数组作为参数(实际上我使用的是子类 symbolAxis)我已经覆盖的类。实际上我这样做了,但我绝对知道(经过几个小时得到几乎正确的结果)如何将这个双精度值转换为我必须放入 currentTickValue 变量的像素(或至少以某种方式神秘地与 tickUnit 相关)值在 refreshTicksHorizo​​ntal 中。

我也尝试过——因为数据点到它的邻居都有相同的距离——给

ratio = (datapoint[1] - datapoint[0]) / (Axis.UpperBound - datapoint[0])

作为参数和其他不同的东西。但我不知道第一个数据点的(像素分别为 Java2D)值,所以我可以将我的第 i 个 currentTickValue 作为

ratio*i * (dataArea.getMaxX() - firstDataPointInJava2D)...

在我的(错误的)解决方案中,我的刻度线距离总是稍微太大或太小。你知道如何解决这个问题,还是有可能完全不同的方法来解决这个问题?

编辑

为了说明这个问题,这里有一个编译简约的例子:

import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.*;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

import javax.swing.*;
import java.awt.*;
import java.awt.geom.Ellipse2D;

public class Example {
    public static void main(String[] args) {
        double[] dataPoints = {1.249860779781E12, 1.249861186272E12, 1.249861592763E12, 1.249861999254E12,
                1.249862405745E12};
        String[] dataNames = {"Hades", "Hagen", "Herakles", "Hermes", "Horowitz"};
        Shape shape = new Ellipse2D.Float(-2, -2, 4, 4);
        XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer(true, true);

        XYSeries[] lines = new XYSeries[5];
        XYSeriesCollection dataset = new XYSeriesCollection();

        for (int i = 0; i < 5; i++) {
            lines[i] = new XYSeries(new Integer(i).toString());
            lines[i].add(dataPoints[i], 0.05d);
            lines[i].add(dataPoints[i], 0.95d);
            dataset.addSeries(lines[i]);
            renderer.setSeriesShape(i, shape);
            renderer.setSeriesPaint(i, Color.black);
        }

        ValueAxis timeAxis = new DateAxis("");
        NumberAxis yAxis = new NumberAxis("");
        yAxis.setVisible(false);
        yAxis.setTickMarksVisible(false);
        yAxis.setRange(0.0d, 1.0d);

        SymbolAxis labelAxis = new SymbolAxis("", dataNames);
        labelAxis.setVerticalTickLabels(true);

        XYPlot plot = new XYPlot(dataset, timeAxis, yAxis, renderer);

        plot.setDomainAxis(1, labelAxis);
        plot.setDomainAxisLocation(1, AxisLocation.TOP_OR_LEFT);
        JFreeChart chart = new JFreeChart("", plot);
        chart.removeLegend();
        ChartPanel panel = new ChartPanel(chart);
        panel.setPreferredSize(new Dimension(800, 300));

        JFrame frame = new JFrame("");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        JScrollPane scroller = new JScrollPane(panel);
        frame.add(scroller);
        frame.pack();
        frame.setVisible(true);
    }
}

结果如下所示: 示例图

到现在为止还挺好。问题是,我想要名字(霍洛维茨等)完全越界。任何人都可以帮忙吗?

4

1 回答 1

1

作为纯粹的经验测量,它们完美地排列使用

timeAxis.setLowerMargin(0.125);
timeAxis.setUpperMargin(0.125);

或者

timeAxis.setRange(dataPoints[0] - 200000, dataPoints[4] + 200000);

您可以将其概括为数据集的函数。

于 2013-01-22T17:15:58.050 回答