2017-05-10 1 views
1

JFreeChart에서 apis를 찾으려고하면 차트를 작성할 수 있습니다. 여기서 X 축에는 카테고리가 있고 Y 축에는 길이가 있습니다. 시간에 해당하는 간격 값.JFreeCharts - X를 카테고리로, Y를 TimeInterval로 차트 만들기

Y 축은 시간을 나타내야합니다. X 축 카테고리입니다.

이것은 요일과 같은 X 축에서 Google 캘린더 시나리오와 유사합니다. 그리고 Y 축에서, 당신은 당신이 특정 시간 영역을 따라 무엇을 쓸 수 있습니다.

다음 JFREE 차트는 내가 표현하고 싶은 것을 나타냅니다. 그러나 Y 축은 시간 단위 (예 : 초)가 아닌 밀리 초 단위로 시간을 보유합니다.

다음 이미지에서 나는 그래프의 가장자리와 같은 것으로 생각할 수있는 X의 범주를 보여줍니다.

예를 들어 Y 축에서 시간을 보내고 나서 여행을하다가 재배 할 시간이 있습니다.

Y 축은 double 값으로 압축되어 있으므로 적절한 시간 축을 사용할 수있는 것이 좋습니다. 이것은 카테고리 데이터 세트를 사용할 때 문제가되는 것 같습니다. 알 수없는 차트를 만들려면 보이지 않는 데이터 계열을 사용하여 스택을 0에서 렌더링하지 않도록 많은 해킹 작업을 수행해야했습니다. 그것은 Althgout

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를 사용하는 방법을 확실히 명확하지 않다 엔진을 사용하여 문제의 올바른 위치에 막대를 렌더링하는 동시에 시간을 나타내는 축과 범주와 같은 원하는 축을 표시합니다.

예제 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); 
    } 

} 

그리고 멀리 막대 그래프 및 카테고리 데이터 세트에서 스테핑 및 XYBarChart에와 IntervalXYDataSets로 이동하는 방법을 이미지 울부 짖는 소리가 보여, 우리는 우리가 원하는 바를 렌더링 할 수 있습니다.

그래프를 수직으로 플롯하면 질문의 첫 번째 차트와 정확히 같습니다. Y 축과 Y 축의 시간 축이 있습니다.

이렇게 만족스러운 사용자입니다.

enter image description here

+0

비슷한 질문이 여기 있습니다. [https://stackoverflow.com/q/45018974/230513] – trashgod

관련 문제