2011-08-15 53 views
7

ただ、次の例に行われているように、私は、[次の図にあるよう45度回転するチャートのドメイン上の目盛りのラベルをしたい: http://left.subtree.org/2007/08/14/rotate-labels-jfreechart/JFreeChartの数値軸のドメイン上の目盛りラベルをどのように回転させるのですか?

違いは、私はこれをしたいです数値軸を持つ散布図に表示されます。 NumberAxisクラスのsetCategoryLabelPositions()と同等のものを見つけることができません。

+1

私はちょうどそれ行い、このサンプルコードを見つけました:あなたはカテゴリ軸を持っている場合は、このコードをしたいhttp://www.jfree.org/phpBB2/viewtopic.php?f=3&t=18240&start= 15 – DrunkenPope

答えて

8

setVerticalTickLabels()の方法があります。そうでない場合は、refreshTicksHorizontal()を上書きする以外に選択肢はありません。このexampleも参照してください。

enter image description here

import java.awt.Color; 
import java.awt.Dimension; 
import java.util.*; 
import org.jfree.chart.*; 
import org.jfree.chart.axis.NumberAxis; 
import org.jfree.chart.plot.PlotOrientation; 
import org.jfree.chart.plot.XYPlot; 
import org.jfree.chart.renderer.xy.XYItemRenderer; 
import org.jfree.data.xy.XYDataset; 
import org.jfree.data.xy.XYSeries; 
import org.jfree.data.xy.XYSeriesCollection; 
import org.jfree.ui.ApplicationFrame; 
import org.jfree.ui.RefineryUtilities; 

/** 
* @see https://stackoverflow.com/questions/7208657 
* @see https://stackoverflow.com/questions/7071057 
*/ 
public class ScatterTickLabels extends ApplicationFrame { 

    public ScatterTickLabels(String s) { 
     super(s); 
     final ChartPanel chartPanel = createDemoPanel(); 
     chartPanel.setPreferredSize(new Dimension(640, 480)); 
     this.add(chartPanel); 
    } 

    public static ChartPanel createDemoPanel() { 
     JFreeChart jfreechart = ChartFactory.createScatterPlot(
      "Scatter Plot Demo", "X", "Y", samplexydataset(), 
      PlotOrientation.VERTICAL, true, true, false); 
     XYPlot xyPlot = (XYPlot) jfreechart.getPlot(); 
     xyPlot.setDomainCrosshairVisible(true); 
     xyPlot.setRangeCrosshairVisible(true); 
     XYItemRenderer renderer = xyPlot.getRenderer(); 
     renderer.setSeriesPaint(0, Color.blue); 
     NumberAxis domain = (NumberAxis) xyPlot.getDomainAxis(); 
     domain.setVerticalTickLabels(true); 
     return new ChartPanel(jfreechart); 
    } 

    private static XYDataset samplexydataset() { 
     int cols = 20; 
     int rows = 20; 
     XYSeriesCollection xySeriesCollection = new XYSeriesCollection(); 
     XYSeries series = new XYSeries("Random"); 
     Random rand = new Random(); 
     for (int i = 0; i < rows; i++) { 
      for (int j = 0; j < cols; j++) { 
       double x = rand.nextGaussian(); 
       double y = rand.nextGaussian(); 
       series.add(x, y); 
      } 
     } 
     xySeriesCollection.addSeries(series); 
     return xySeriesCollection; 
    } 

    public static void main(String args[]) { 
     ScatterTickLabels demo = new ScatterTickLabels("Scatter Plot Demo"); 
     demo.pack(); 
     RefineryUtilities.centerFrameOnScreen(demo); 
     demo.setVisible(true); 
    } 
} 
+0

これは非常に簡単で、私が望むように十分です。ありがとう。 –

4

スーパークラス:Axis.setLabelAngle(rad)を見る必要があります。

ここにはexampleがあります。

EDIT:上記は有用ではありません。

私はorg.jfreechart.chart.axis.NumberAxis.refreshTicksHorizo​​ntalのコードを見ました。実際には、0.0(すべてのnew NumberTick(...,0.0)コンストラクタの最後の引数)に設定されている角度があります。異なる角度(コンストラクタで指定されたもの)を使用するrefreshTicksHorizo​​ntalメソッドをオーバーライドするNumberAxisのサブクラスを作成できます。

グラフを描画するときに常にrefreshTicksが呼び出されるため、呼び出されないことを心配する必要はありません。

/** 
* Calculates the positions of the tick labels for the axis, storing the 
* results in the tick label list (ready for drawing). 
* 
* @param g2 the graphics device. 
* @param dataArea the area in which the data should be drawn. 
* @param edge the location of the axis. 
* 
* @return A list of ticks. 
*/ 
protected List refreshTicksHorizontal(Graphics2D g2, 
     Rectangle2D dataArea, RectangleEdge edge) { 

    List result = new java.util.ArrayList(); 

    Font tickLabelFont = getTickLabelFont(); 
    g2.setFont(tickLabelFont); 

    if (isAutoTickUnitSelection()) { 
     selectAutoTickUnit(g2, dataArea, edge); 
    } 

    TickUnit tu = getTickUnit(); 
    double size = tu.getSize(); 
    int count = calculateVisibleTickCount(); 
    double lowestTickValue = calculateLowestVisibleTickValue(); 

    if (count <= ValueAxis.MAXIMUM_TICK_COUNT) { 
     int minorTickSpaces = getMinorTickCount(); 
     if (minorTickSpaces <= 0) { 
      minorTickSpaces = tu.getMinorTickCount(); 
     } 
     for (int minorTick = 1; minorTick < minorTickSpaces; minorTick++) { 
      double minorTickValue = lowestTickValue 
        - size * minorTick/minorTickSpaces; 
      if (getRange().contains(minorTickValue)){ 
       result.add(new NumberTick(TickType.MINOR, minorTickValue, 
         "", TextAnchor.TOP_CENTER, TextAnchor.CENTER, 
         0.0)); 
      } 
     } 
     for (int i = 0; i < count; i++) { 
      double currentTickValue = lowestTickValue + (i * size); 
      String tickLabel; 
      NumberFormat formatter = getNumberFormatOverride(); 
      if (formatter != null) { 
       tickLabel = formatter.format(currentTickValue); 
      } 
      else { 
       tickLabel = getTickUnit().valueToString(currentTickValue); 
      } 
      TextAnchor anchor = null; 
      TextAnchor rotationAnchor = null; 
      double angle = 0.0; 
      if (isVerticalTickLabels()) { 
       anchor = TextAnchor.CENTER_RIGHT; 
       rotationAnchor = TextAnchor.CENTER_RIGHT; 
       if (edge == RectangleEdge.TOP) { 
        angle = Math.PI/2.0; 
       } 
       else { 
        angle = -Math.PI/2.0; 
       } 
      } 
      else { 
       if (edge == RectangleEdge.TOP) { 
        anchor = TextAnchor.BOTTOM_CENTER; 
        rotationAnchor = TextAnchor.BOTTOM_CENTER; 
       } 
       else { 
        anchor = TextAnchor.TOP_CENTER; 
        rotationAnchor = TextAnchor.TOP_CENTER; 
       } 
      } 

      Tick tick = new NumberTick(new Double(currentTickValue), 
        tickLabel, anchor, rotationAnchor, angle); 
      result.add(tick); 
      double nextTickValue = lowestTickValue + ((i + 1)* size); 
      for (int minorTick = 1; minorTick < minorTickSpaces; 
        minorTick++) { 
       double minorTickValue = currentTickValue 
         + (nextTickValue - currentTickValue) 
         * minorTick/minorTickSpaces; 
       if (getRange().contains(minorTickValue)){ 
        result.add(new NumberTick(TickType.MINOR, 
          minorTickValue, "", TextAnchor.TOP_CENTER, 
          TextAnchor.CENTER, 0.0)); 
       } 
      } 
     } 
    } 
    return result; 

} 
+1

これは私がもともと考えていたものですが、それはうまくいきません。目盛りのラベルではなく、軸のラベルを変更します。参照するコードは、上記で参照したsetCategoryLabelPositions()も呼び出します。 –

+0

@Jay私は私の答えを更新しました。 – toto2

+0

+1 'verticalTickLabels'プロパティを指揮することは、ちょっとしたことがあれば簡単です。 – trashgod

9

与えられた最初の答えは、数値領域軸のためです。

CategoryAxis domainAxis = plot.getDomainAxis(); 
domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_90); 
関連する問題