gpt4 book ai didi

java - 在 jfreechart 中自定义刻度标记和刻度标签位置

转载 作者:行者123 更新时间:2023-11-30 11:36:38 25 4
gpt4 key购买 nike

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

我会喜欢给一个数组,其中数据点作为我已覆盖的 NumberAxis(实际上我使用 symbolAxis 是一个子类)类中的 refreshTicksHorizo​​ntal 的参数。实际上我这样做了,但我完全知道如何将这个 double 值转换为我必须放入 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);
}
}

结果是这样的: Example Plot

到目前为止一切顺利。问题是,我希望名字(Horowitz 等)正好在字面上。谁能帮忙?

最佳答案

作为纯粹的经验衡量,它们使用任何一个都完美对齐

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

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

您可以将其归纳为数据集的函数。

关于java - 在 jfreechart 中自定义刻度标记和刻度标签位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14458726/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com