2

データポイントごとに正確に 1 つの目盛りが必要です。

上書きした NumberAxis (実際には、サブクラスである symbolAxis を使用します) クラスの refreshTicksHorizo​​ntal のパラメーターとしてデータポイントを含む配列を提供したいと思います。実際に私はこれを行いましたが、(ほぼ正しい結果を得るために数時間後に) この double 値をピクセル (または少なくとも何らかの形で tickUnit に関連する) 値に変換する方法を完全に知っています。 currentTickValue 変数に入れなければなりません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);
    }
}

結果は次のようになります。 プロット例

ここまでは順調ですね。問題は、名前 (Horowitz など) を正確に線の上に表示したいということです。誰でも助けることができますか?

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 に答える