データポイントごとに正確に 1 つの目盛りが必要です。
上書きした NumberAxis (実際には、サブクラスである symbolAxis を使用します) クラスの refreshTicksHorizontal のパラメーターとしてデータポイントを含む配列を提供したいと思います。実際に私はこれを行いましたが、(ほぼ正しい結果を得るために数時間後に) この double 値をピクセル (または少なくとも何らかの形で tickUnit に関連する) 値に変換する方法を完全に知っています。 currentTickValue 変数に入れなければなりませんrefreshTicksHorizontal で。
私も試しました-データポイントはすべてその隣人までの距離が同じであるため-与えるために
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 など) を正確に線の上に表示したいということです。誰でも助けることができますか?