2013-01-22 23 views
2

我需要每個數據點只有一個tickmark。在jfreechart中自定義tickmark和ticklabel位置

我會給與一個數組的數據點作爲參數的NumberAxis中的refreshTicksHorizo​​ntal(實際上我使用symbolAxis這是一個子類)類,我已覆蓋。其實我這樣做,但我絕對知道想法(幾個小時後得到幾乎正確的結果)如何將這個雙值轉換爲像素(或至少以某種方式與tickUnit神祕相關)值我必須放入currentTickValue變量在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

到目前爲止好。問題是,我想要的名字(霍洛維茨等)完全符合要求。誰能幫忙?

+0

請修改您的問題以包含展示您描述的問題的[sscce](http://sscce.org/)。 – trashgod

+0

好的。我添加了一個代碼示例。希望這有助於啓發我想要做的事情。 –

+0

+1 [sscce](http://sscce.org/)。 – trashgod

回答

1

作爲一個純粹的經驗措施,他們排隊完美使用任何

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

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

您可以概括這是您的數據集的功能。

+1

謝謝。它確實與setRange(labelAxis.setRange)一起工作。 –

+0

非常好! DYM'timeAxis.setRange(labelAxis.getRange)'? – trashgod

+0

基本上相反。我已經從時間軸讀取了上限和下限,並將它們(在一些縮放之後)設置爲labelAxis的邊界。但是等等,實際上兩者都應該可以工作(即標籤正好在行結束處)...... –