2017-05-10 3 views
1

私はJFreeChartでapisを見つけようとしています。それはチャートを構築することができます。時間に対応する間隔値。JFreeCharts - Xをカテゴリ、YをTimeIntervalとしてチャートを作成する

Y軸は時間を表す必要があります。 X軸カテゴリ。

これは、曜日などのX軸のGoogleカレンダーシナリオに似ています。また、Y軸では、特定の時間帯に行うことを書くことができます。

次のJFREEチャートは、私が表現したいものです。 しかし、私のY軸は時間単位(例えば秒)ではなく、ミリ秒単位の時間を保持しています。

次の図では、グラフ上のエッジのようなものであると思われるXに沿ったカテゴリを示しています。

Y軸上では、たとえば旅行に時間を費やしていますが、旅行後にはそれを栽培すると言う時間があります。

Y軸は2倍の値で圧縮されており、適切な時間軸を使用できることが望ましいです。これは、カテゴリデータセットを使用する場合に問題になるようです。 チャートを怒らせるには、スタックが0からレンダリングされないようにするために、多くのハックを配置しなければなりませんでした。

enter image description here

+1

なぜ[これ](http://stackoverflow.com/a/43677029/261156)が、範囲軸のような 'DateAxis'を持っていませんか? –

+0

Y軸を日付軸に操作する場合。どのようにしてDataSeriesを構築していますか?日付シリーズを次のように作成すると、最終的なDefaultIntervalCategoryDatasetデータセット= new DefaultIntervalCategoryDataset(seriesKeys、categoryKeys、 intervalLowerBound、intervalUpperBound); – 99Sono

+0

この場合はY軸の間隔をミリ秒単位で定義する、下限と上限のすべての変換データ。 – 99Sono

答えて

1

私が今のようにXYBarChartを使用することは間違いなく可能であることを言うことができる私のコメントでmentinoed DEMO7サンプルに基づいて、上記の投稿の問題を解決するためにはJFreeChartを使用する方法を明確に明らかにされていませんAlthgoutエンジンを使用して問題の正しい場所にバーを描画し、時間軸を表す軸とカテゴリなどの任意の軸を表します。

サンプル7の例では、数値軸を使用し、数値軸の間隔をバーのレンダリングのステップとして割り当てます。

このようにして、問題は上記の私の質問に容易に適合させることができ、適切な方法で私の質問のチャートを擬似的に実装した適応されたアプリケーションがここにあります。

import java.awt.Color; 

import javax.swing.JPanel; 

import org.jfree.chart.ChartFactory; 
import org.jfree.chart.ChartPanel; 
import org.jfree.chart.ChartUtilities; 
import org.jfree.chart.JFreeChart; 
import org.jfree.chart.axis.DateAxis; 
import org.jfree.chart.axis.SymbolAxis; 
import org.jfree.chart.plot.PlotOrientation; 
import org.jfree.chart.plot.XYPlot; 
import org.jfree.chart.renderer.xy.XYBarRenderer; 
import org.jfree.data.time.Day; 
import org.jfree.data.time.RegularTimePeriod; 
import org.jfree.data.xy.IntervalXYDataset; 
import org.jfree.data.xy.XYIntervalSeries; 
import org.jfree.data.xy.XYIntervalSeriesCollection; 
import org.jfree.ui.ApplicationFrame; 
import org.jfree.ui.RefineryUtilities; 
public class XYBarChartDemo7VarianRepresentingStackOverFlowQuestion extends ApplicationFrame { 

    /** 
    * Constructs the demo application. 
    * 
    * @param title 
    *   the frame title. 
    */ 
    public XYBarChartDemo7VarianRepresentingStackOverFlowQuestion(String title) { 
     super(title); 
     JPanel chartPanel = createDemoPanel(); 
     chartPanel.setPreferredSize(new java.awt.Dimension(500, 300)); 
     setContentPane(chartPanel); 
    } 

    private static JFreeChart createChart(IntervalXYDataset dataset) { 
     JFreeChart chart = ChartFactory.createXYBarChart("XYBarChartDemo7", "Date", true, "Y", dataset, 
       PlotOrientation.HORIZONTAL, true, false, false); 

     XYPlot plot = (XYPlot) chart.getPlot(); 

     // The Y axis is turned into a date axis 
     plot.setRangeAxis(new DateAxis("Date")); 

     // The X axis is turned is turned into a label axis 
     SymbolAxis xAxis = new SymbolAxis("Series", 
       new String[] { "R107 => R101", "R101 => R5", "R5 => R15", "R15 => R16" }); 
     xAxis.setGridBandsVisible(false); 
     plot.setDomainAxis(xAxis); 

     // Enables using Y interval 
     XYBarRenderer renderer = (XYBarRenderer) plot.getRenderer(); 
     renderer.setUseYInterval(true); 
     plot.setRenderer(renderer); 
     plot.setBackgroundPaint(Color.lightGray); 
     plot.setDomainGridlinePaint(Color.white); 
     plot.setRangeGridlinePaint(Color.white); 

     ChartUtilities.applyCurrentTheme(chart); 

     return chart; 
    } 

    /** 
    * Creates a sample dataset. 
    * 
    * @return A dataset. 
    */ 
    private static IntervalXYDataset createDataset() { 
     // Time points to represnet 
     // Edge: "R107 => R101" 
     RegularTimePeriod d0 = new Day(12, 6, 2007); 
     RegularTimePeriod d1 = new Day(13, 6, 2007); 
     RegularTimePeriod d2 = new Day(14, 6, 2007); 

     // "R101 => R5" 
     RegularTimePeriod d3 = new Day(15, 6, 2007); 
     RegularTimePeriod d4 = new Day(16, 6, 2007); 
     RegularTimePeriod d5 = new Day(17, 6, 2007); 

     // "R5 => R15" 
     RegularTimePeriod d6 = new Day(18, 6, 2007); 
     RegularTimePeriod d7 = new Day(19, 6, 2007); 
     RegularTimePeriod d8 = new Day(20, 6, 2007); 

     // "R15 => R16" 
     RegularTimePeriod d9 = new Day(21, 6, 2007); 
     RegularTimePeriod d10 = new Day(22, 6, 2007); 
     RegularTimePeriod d11 = new Day(23, 6, 2007); 

     /// Next edge that is not part of the path 
     RegularTimePeriod d12 = new Day(24, 6, 2007); 

     // Create three interval series (each series has a different color) 
     XYIntervalSeriesCollection dataset = new XYIntervalSeriesCollection(); 
     XYIntervalSeries s1 = new XYIntervalSeries("ProductiveTime"); 
     XYIntervalSeries s2 = new XYIntervalSeries("WaitTime"); 

     // Series 1 and series2 along edge1 
     addItem(s1, d0, d1, 0); 
     addItem(s2, d1, d3, 0); 
     // Series 1 and series2 along edge2 
     addItem(s1, d3, d4, 1); 
     addItem(s2, d4, d6, 1); 
     // Series 1 and series2 along edge3 
     addItem(s1, d6, d7, 2); 
     addItem(s2, d7, d9, 2); 
     // Series 1 and series2 along edge4 
     addItem(s1, d9, d10, 3); 
     addItem(s2, d10, d12, 3); 

     // puts in the data set the data series 
     dataset.addSeries(s1); 
     dataset.addSeries(s2); 
     return dataset; 
    } 

    private static void addItem(XYIntervalSeries s, RegularTimePeriod p0, RegularTimePeriod p1, int index) { 
     s.add(index, 
       // xLow x xHigh we see this on the Y because chart is horizontal 
       index - 0.45, index + 0.45, p0.getFirstMillisecond(), 
       // yLow yHigh (time interval) - we see this on the X because chart is set as horizontal 
       // NOTE: - notice how miliseconds are being used to make the xy interval and not 
       // actually a date object. But then on the date axis we shall have a proper DateAxis for rendering 
       // these miliseconds values 
       p0.getFirstMillisecond(), p1.getFirstMillisecond()); 
    } 

    /** 
    * Creates a panel for the demo. 
    * 
    * @return A panel. 
    */ 
    public static JPanel createDemoPanel() { 
     return new ChartPanel(createChart(createDataset())); 
    } 

    /** 
    * Starting point for the demonstration application. 
    * 
    * @param args 
    *   ignored. 
    */ 
    public static void main(String[] args) { 
     XYBarChartDemo7VarianRepresentingStackOverFlowQuestion demo = new XYBarChartDemo7VarianRepresentingStackOverFlowQuestion(
       "JFreeChart : XYBarChartDemo7.java"); 
     demo.pack(); 
     RefineryUtilities.centerFrameOnScreen(demo); 
     demo.setVisible(true); 
    } 

} 

と画像怒鳴る離れBarChartコントロールやカテゴリデータセットからのステッピング、およびXYBarChartへとIntervalXYDataSetsに移動、我々はそれらをしたいバーをレンダリングする方法を示します。

グラフを縦方向にプロットすると、質問の最初のグラフのようになります。 Y軸上の時間軸とX軸上の目盛りとを比較する。

したがって、もう1人の満足できるユーザー。

enter image description here

+0

同様の質問は[こちら](https://stackoverflow.com/q/45018974/230513) – trashgod

関連する問題