我需要每个数据点恰好有一个刻度线。
我很想给NumberAxis 中的 refreshTicksHorizontal 一个带有数据点的数组作为参数(实际上我使用的是子类 symbolAxis)我已经覆盖的类。实际上我这样做了,但我绝对知道(经过几个小时得到几乎正确的结果)如何将这个双精度值转换为我必须放入 currentTickValue 变量的像素(或至少以某种方式神秘地与 tickUnit 相关)值在 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);
}
}
结果如下所示:
到现在为止还挺好。问题是,我想要名字(霍洛维茨等)完全越界。任何人都可以帮忙吗?