Tôi muốn đặt văn bản trên mỗi điểm tôi vẽ trong biểu đồ dạng đường.Biểu đồ đường JFreeChart với văn bản tại mỗi điểm
Đây là những gì tôi có thể làm:
Và đây là những gì tôi cần (tên của điểm là màu xanh lá cây):
Tôi muốn đặt văn bản trên mỗi điểm tôi vẽ trong biểu đồ dạng đường.Biểu đồ đường JFreeChart với văn bản tại mỗi điểm
Đây là những gì tôi có thể làm:
Và đây là những gì tôi cần (tên của điểm là màu xanh lá cây):
Các StandardXYItemLabelGenerator
nên làm việc; có một ví dụ here.
Phụ lục: Nhãn bạn có thể thấy trong ảnh nằm trong một chuỗi chuỗi riêng biệt.
Nhãn như vậy có thể được kết hợp trong XYDataset
, như được hiển thị trong LabeledXYDataset
bên dưới. Bởi vì không có tính năng nào của StandardXYItemLabelGenerator
được sử dụng, việc triển khai tùy chỉnh XYItemLabelGenerator
là đủ. Các XYItemRenderer
kiểm soát màu sắc, kích thước và vị trí tương đối của các nhãn.
Hợp đồng bổ sung: Tôi làm cách nào để thêm chú giải công cụ?
Được hướng dẫn bởi ChartFactory.createXYLineChart()
, chỉ cần chỉ định XYToolTipGenerator
cho trình kết xuất đồ họa. Định dạng mặc định, được xem là here, là Series: (x, y)
.
renderer.setBaseToolTipGenerator(new StandardXYToolTipGenerator());
import java.awt.Color;
import java.awt.Dimension;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import org.jfree.chart.*;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.labels.ItemLabelAnchor;
import org.jfree.chart.labels.ItemLabelPosition;
import org.jfree.chart.labels.XYItemLabelGenerator;
import org.jfree.chart.labels.StandardXYToolTipGenerator;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYItemRenderer;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.xy.AbstractXYDataset;
import org.jfree.data.xy.XYDataset;
import org.jfree.ui.TextAnchor;
/** @see https://stackoverflow.com/a/14459322/230513 */
public class UnitPrice {
private static XYDataset createDataset() {
LabeledXYDataset ds = new LabeledXYDataset();
ds.add(11, 0, "");
ds.add(12, 68, "A");
ds.add(13, 65, "B");
ds.add(14, 67, "C");
ds.add(15, 69, "D");
ds.add(16, 60, "F");
ds.add(17, 83, "G");
ds.add(18, 86, "H");
ds.add(19, 70, "I");
ds.add(20, 60, "J");
ds.add(21, 55, "K");
ds.add(22, 54, "L");
ds.add(23, 50, "M");
return ds;
}
private static class LabeledXYDataset extends AbstractXYDataset {
private static final int N = 26;
private List<Number> x = new ArrayList<Number>(N);
private List<Number> y = new ArrayList<Number>(N);
private List<String> label = new ArrayList<String>(N);
public void add(double x, double y, String label){
this.x.add(x);
this.y.add(y);
this.label.add(label);
}
public String getLabel(int series, int item) {
return label.get(item);
}
@Override
public int getSeriesCount() {
return 1;
}
@Override
public Comparable getSeriesKey(int series) {
return "Unit";
}
@Override
public int getItemCount(int series) {
return label.size();
}
@Override
public Number getX(int series, int item) {
return x.get(item);
}
@Override
public Number getY(int series, int item) {
return y.get(item);
}
}
private static class LabelGenerator implements XYItemLabelGenerator {
@Override
public String generateLabel(XYDataset dataset, int series, int item) {
LabeledXYDataset labelSource = (LabeledXYDataset) dataset;
return labelSource.getLabel(series, item);
}
}
private static JFreeChart createChart(final XYDataset dataset) {
NumberAxis domain = new NumberAxis("Unit");
NumberAxis range = new NumberAxis("Price");
domain.setAutoRangeIncludesZero(false);
XYItemRenderer renderer = new XYLineAndShapeRenderer(true, false);
renderer.setBaseItemLabelGenerator(new LabelGenerator());
renderer.setBaseItemLabelPaint(Color.green.darker());
renderer.setBasePositiveItemLabelPosition(
new ItemLabelPosition(ItemLabelAnchor.CENTER, TextAnchor.CENTER));
renderer.setBaseItemLabelFont(
renderer.getBaseItemLabelFont().deriveFont(14f));
renderer.setBaseItemLabelsVisible(true);
renderer.setBaseToolTipGenerator(new StandardXYToolTipGenerator());
XYPlot plot = new XYPlot(dataset, domain, range, renderer);
JFreeChart chart = new JFreeChart(
"Unit Price", JFreeChart.DEFAULT_TITLE_FONT, plot, false);
return chart;
}
public static void main(String[] args) {
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
XYDataset dataset = createDataset();
JFreeChart chart = createChart(dataset);
ChartPanel chartPanel = new ChartPanel(chart) {
@Override
public Dimension getPreferredSize() {
return new Dimension(400, 320);
}
};
f.add(chartPanel);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
}
Vui lòng cập nhật câu hỏi của bạn để làm rõ những gì cần chú ý. – trashgod
Các nhãn bạn có thể nhìn thấy trong ảnh nằm trong một mảng chuỗi riêng biệt, chúng không phải là một phần của danh mục hoặc dữ liệu. trong ví dụ được liên kết, 'StandardXYItemLabelGenerator' lấy nhãn từ các loại – tyranitar
Tôi đã hiển thị một cách tiếp cận bên dưới. – trashgod