2013-01-22 30 views
7

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: what I can do

Và đây là những gì tôi cần (tên của điểm là màu xanh lá cây): what I need

+0

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

+0

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

+0

Tôi đã hiển thị một cách tiếp cận bên dưới. – trashgod

Trả lời

8

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()); 

image

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); 
    } 
} 
+0

Cũng xem xét 'SymbolicXYItemLabelGenerator'. – trashgod

+0

Tôi làm cách nào để thêm chú giải công cụ? – tyranitar

Các vấn đề liên quan