2012-12-13 4 views
3

두 개의 Y 축 (거리 및 지속 시간)이있는 차트를 만듭니다. 각 Y 축에는 여러 시리즈 (달리기, 자전거, 수영 등)가 서로 쌓여 있습니다. 기간은 누적 영역 또는 영역 선이고 거리는 누적 기둥 도표입니다.하이 차트 - 다수의 Y 축 누적 형 차트

다음은 차트의 jsfiddle입니다. http://jsfiddle.net/baberuth22/u5QCB/3/

$(function() { 

var run_data = [[1324771200000,2928000],[1325376000000,2148000],[1327190400000,1001000],[1327795200000,2336000],[1329609600000,2403000],[1330214400000,2456000],[1330819200000,3615000],[1334448000000,1753000],[1338681600000,1998000],[1348358400000,1897000],[1350777600000,8130000],[1353801600000,9402000],[1354406400000,9612000],[1355011200000,4500000]]; 
var swim_data = [[1324771200000,1726000],[1348963200000,14520000],[1350777600000,15540000],[1352592000000,7380000],[1353801600000,4571000],[1354406400000,4500000]]; 
var bike_data = [[1327190400000,4289000],[1330214400000,4650000],[1330819200000,3655000],[1331424000000,2217000],[1334448000000,4349000],[1348963200000,4241000],[1350777600000,15014000],[1351382400000,4118000],[1353196800000,3362000],[1353801600000,11944000],[1354406400000,5997000]]; 
var strength_data = [[1324771200000,3275000],[1334448000000,600000],[1350777600000,4403000],[1351382400000,3339000],[1351987200000,4175000],[1353196800000,3754000],[1354406400000,3890000]]; 
var yoga_data = [[1351382400000,2656000],[1352592000000,609000]]; 
var other_data = [[1352592000000,309000],[1353196800000,186000]]; 



var run_distance_data = [[1324771200000,4],[1325376000000,3.1],[1327190400000,1.5],[1327795200000,3],[1329609600000,3.4],[1330214400000,3.5],[1330819200000,4.9],[1334448000000,2.5],[1338681600000,2.7],[1348358400000,2.6],[1350777600000,10.2],[1353801600000,7.6],[1354406400000,17.2],[1355011200000,10],[1331424000000,0],[1348963200000,0],[1351382400000,0],[1351987200000,0],[1352592000000,0],[1353196800000,0]]; 
var swim_distance_data = [[1324771200000,0.5],[1348963200000,1.5],[1350777600000,3.1],[1352592000000,0.2],[1353801600000,6.2],[1354406400000,3.1],[1325376000000,0],[1327190400000,0],[1327795200000,0],[1329609600000,0],[1330214400000,0],[1330819200000,0],[1331424000000,0],[1334448000000,0],[1338681600000,0],[1348358400000,0],[1351382400000,0],[1351987200000,0],[1353196800000,0],[1355011200000,0]]; 
var bike_distance_data = [[1327190400000,19.4],[1330214400000,20.2],[1330819200000,16.1],[1331424000000,9.9],[1334448000000,16.3],[1348963200000,16.1],[1350777600000,168],[1351382400000,15.5],[1353196800000,10.7],[1353801600000,47.2],[1354406400000,24],[1324771200000,0],[1325376000000,0],[1327795200000,0],[1329609600000,0],[1338681600000,0],[1348358400000,0],[1351987200000,0],[1352592000000,0],[1355011200000,0]]; 
var other_distance_data = [[1352592000000,3.1],[1353196800000,3],[1324771200000,0],[1325376000000,0],[1327190400000,0],[1327795200000,0],[1329609600000,0],[1330214400000,0],[1330819200000,0],[1331424000000,0],[1334448000000,0],[1338681600000,0],[1348358400000,0],[1348963200000,0],[1350777600000,0],[1351382400000,0],[1351987200000,0],[1353801600000,0],[1354406400000,0],[1355011200000,0]]; 

// one week - 604800000 
var chart = new Highcharts.Chart({ 
    chart: { 
     renderTo: 'graph1', 
     zoomType: 'x' 
    }, 
    title: { 
     text: 'Workout Duration By Week' 
    }, 
    subtitle: { 
     text: document.ontouchstart === undefined ? 'Click and drag in the plot area to zoom in' : 'Drag your finger over the plot to zoom in' 
    }, 
    xAxis: { 
     type: 'datetime' 

    }, 
    yAxis: [{ 
     type: 'datetime', 
     //y-axis will be in milliseconds 
     dateTimeLabelFormats: { //force all formats to be hour:minute:second 
      second: '%H:%M:%S', 
      minute: '%H:%M:%S', 
      hour: '%H:%M', 
      day: '%H' 
     }, 
     title: { 
      text: 'Duration (hours)' 
     }, 
     min: 0 

     } 
        , 
    { 
     min: 0, 
     title: { 
      text: 'Distance ' + '(miles)' 
     }, 
     opposite: true} 
        ], 

    tooltip: { 
     formatter: function() { 
      var range_start_date = new Date(this.x); 
      //var range_start_date = new Date(this.x * 1000); 
      var range_end_date = new Date(range_start_date); 
      range_end_date.setDate(range_end_date.getDate() + 6); 
      var unix_end_datetime = range_end_date.getTime(); 
      var return_string = '<b>' + this.series.name + '</b> ' + Highcharts.dateFormat('%b %e', this.x) + ' - ' + Highcharts.dateFormat('%b %e', unix_end_datetime) + '<br/>'; 

      if (this.series.index <= 5){ 
       return_string += Highcharts.dateFormat('%H hours %M minutes', this.y) + ' ';       
      }else{ 
       return_string += this.y + ' (miles) '; 
      } 

      return return_string; 
     } 
    }, 
    plotOptions: { 
     column: { 
      pointRange: 604800000, 
      stacking: 'normal' 
     }, 
     area: { 
      stacking: 'normal' 
     } 
    }, 
    series: [ 
     { 
     name: 'Run', 
     data: run_data, 
     type: 'column'}, 
    { 
     name: 'Swim', 
     data: swim_data, 
     type: 'column'}, 
    { 
     name: 'Bike', 
     data: bike_data, 
     type: 'column'}, 
    { 
     name: 'Strength', 
     data: strength_data, 
     type: 'column'}, 
    { 
     name: 'Yoga', 
     data: yoga_data, 
     type: 'column'}, 
    { 
     name: 'Other', 
     data: other_data, 
     type: 'column'} 
     , 
    { 
     name: 'Run', 
     data: run_distance_data, 
     yAxis: 1, 
     type: 'area'}, 
    { 
     name: 'Swim', 
     data: swim_distance_data, 
     yAxis: 1, 
     type: 'area'}, 
    { 
     name: 'Bike', 
     data: bike_distance_data, 
     yAxis: 1, 
     type: 'area'}, 
    { 
     name: 'Other', 
     data: other_distance_data, 
     yAxis: 1, 
     type: 'area' 

     } 
    ] 
}); 


var d = new Date(); 
chart.xAxis[0].setExtremes(Date.UTC(d.getFullYear(), d.getMonth(), d.getDate() - 7), Date.UTC(d.getFullYear(), d.getMonth(), d.getDate())); 
chart.showResetZoom(); 

})

이는 상위 차트이다.

스태킹이 제대로 작동하지 않는 것 같고 하이 차트 데모 페이지에 스택 된 여러 축의 예가 표시되지 않습니다. http://www.highcharts.com/demo/combo-multi-axes 또는 http://www.highcharts.com/demo/column-stacked (둘 모두는 아님).

두 축을 모두 '열'유형으로 설정하면 스태킹은 작동하지만 막대는 서로 위에 있습니다. 이상적으로는 배경에 반투명 영역 차트를 앞에 놓고 싶습니다.

답변

0

실제로 두 개의 스택을 사용하는 방식으로 작동한다고 생각하지만 데이터가 모든 날짜에 존재하지 않으므로 영역 시리즈가 쌓이는 것이 중단됩니다. 따라서 모든 데이터가 영역 시리즈의 데이터 포인트를 가지고 있다는 전처리를 할 때 이것이 제대로 작동해야한다고 생각하면됩니다.

+0

그건 의미가 있습니다. 어떤 생각을 가장 잘 반복하여 날짜를 반복하고 누락 된 데이터를 0 값으로 추가합니까? – Bryan

+0

모든 빈 날짜에 대해 0 값을 추가하도록 코드를 업데이트했지만 여전히 운이 없습니다. 새로운 jsfiddle를보십시오 : http://jsfiddle.net/baberuth22/9Xkg5/13/ – Bryan

+0

문제는 스택 된 스플라인과 영역 차트에있는 것처럼 보입니다. 새로운 예를 보라. 열과 스플라인 사이에서 차트를 토글합니다. http://jsfiddle.net/baberuth22/u5QCB/9/ – Bryan