2012-12-20 12 views
8

Chcę utworzyć wykres słupkowy z dwoma zestawami ułożonych prętów, które są zgrupowane w celu porównania dwóch grup ułożonych prętów. To powinno być wyświetlane w następujący sposób:Jak używać Jqplot do pokazywania dwóch grup różnie zabarwionych prętów na tym samym skumulowanym wykresie słupkowym

Bar chart

I już przez to link

Ale to mi nie pomaga działka coś jak widać na powyższym zdjęciu. Próbowałem nawet wysłać dwa zestawy danych, takie jak [[s1, s2, s3], [s4, s5, s6]]. Ale nie pomogło mi to wykreślić wykresu. Czy ktoś wie, jak to zrobić?

Każda pomoc zostanie bardzo doceniona. Z góry dzięki.

+0

Czy ktoś może mi pomóc z tym? –

Odpowiedz

3

Ustawienie opcji stackSeries: true utworzy żądany ekran dla wykresów słupkowych.

+0

Witaj, MLX, zadziała, gdy pracujemy tylko z jedną serią danych.Tutaj mamy dwa zestawy skumulowanych wykresów (pomarańczowo-zielono-niebieski I czarno-szaro-fioletowy). Powiedz, jeśli chcemy wyświetlić tylko pomarańczowo-zielono-niebieskie stosy, to jest to możliwe. –

+0

To po prostu nie działa dla tego, o co pytamy w pytaniu: dwa różne zestawy danych pogrupowane w różne kolory. Tak, spowoduje to wyświetlenie * pojedynczego zestawu * danych jako wykresu słupkowego, ale to już zostało założone przez pytanie. – Makyen

2

oficjalne źródła:

The jqPlot documentation nie jest aktualne więc przyjrzałem się source code. Niestety, nie ma sposobu, aby bezpośrednio mieć dwa zestawy prętów z wykresem słupkowym. Właściwość jqPlot.stackSeries jest tylko wartością logiczną. Jedyną funkcją jest przekazanie jqPlot, aby układała każdą serię jedna nad drugą na tyle pasków, ile jest wartości w różnych seriach. Każda seria ma jedną wartość na pasek, a pierwsza seria jest na dole. Innymi słowy, wszystkie wartości [0] są wykreślane w pierwszym takcie, wartości [1] w drugim, itd. Kwota wyświetlana na pasku jest sumą wartości [n] dla bieżącej serii i wszystkich poprzednich serii. Nie ma sposobu, aby określić, że istnieją dwie lub więcej grup serii. Zdolność do zrobienia tego, co jest pożądane, nie istnieje w jqPlot.

Ale można osiągnąć to, czego pragniesz:

Fakt jqPlot nie natywnie wspierać to, co chcesz, nie oznacza, że ​​nie można tego zrobić, tylko że trzeba ruszyć.

Pożądany wykres może być postrzegany jako dwa oddzielne wykresy nałożone na siebie odstępami między kreskami na poszczególnych wykresach, które pozwalają na wystarczającą ilość miejsca (seriesDefaults.rendererOptions.barMargin), aby paski z drugiego wykresu zostały nałożone do nich.

Można użyć jqPlot utworzyć: enter image description here

Ten wykres ma skalę, tło i linie siatki ustawionych chcecie być widoczne. Zwróć uwagę, że wykres zawiera dodatkowy pasek. Jest to konieczne, aby zapewnić wystarczającą ilość tła i linii siatki dla ostatniego paska podanego na drugim wykresie.

Można również użyć jqPlot stworzyć drugi wykres: Second graph with transparent background

Wykres ten ma skalę i GRID-lin ustawionych w jqPlot nie być widoczne.

seriesDefaults.axes.xaxis.tickOptions.show = false; 
seriesDefaults.axes.yaxis.tickOptions.show = false; 
etc. 

Tło ustawione jest na transparent. Zauważ, że będziesz musiał przesunąć pozycję tego wykresu nieco w prawo podczas pozycjonowania <div> względem pierwszego wykresu.

przekreślone, możesz skończyć z: Overlay Graph 1 and Graph 2

następnie użyć pustej <div> w tym samym kolorze tła jako koloru tła strony internetowej i pokryjesz że aby pokryć dodatkowy pasek na pierwszym wykresie, ale pozostawiając tyle pierwszego tła wykresu i linii siatki, aby rozszerzyć się nieco poza ostatni słupek drugiego wykresu.

Będziesz skończyć z:

Final graph

Można zobaczyć working solution at at JSFiddle użyciu jqPlot 1.0.8r1250.

Porównując pierwotny wniosek vs. ostatecznej wersji wykresu produkowane przy użyciu tej metody można zobaczyć, że są bardzo blisko: Compare jqPlot version with original desire Między dwoma najbardziej zauważalną różnicą jest większa przestrzeń między osi Y w Wersja jqPlot. Niestety, nie wydaje się, aby można było zmniejszyć tę kwotę dla wykresów słupkowych.

Należy zauważyć, że brak ramki po prawej stronie wykresu, który ten kod tworzy, jest zamierzony, ponieważ nie istniał w pierwotnym żądaniu. Osobiście wolę mieć granicę po prawej stronie wykresu. Jeżeli zmienisz CSS kawałek, który jest łatwy do uzyskania: Moja preferowana wersja wykresu zawiera ramkę po lewej i równoważy spacje: My preferred version of the graph

można zobaczyć pracę JSFiddle of this version.

W sumie to nie takie trudne. Byłoby to oczywiście łatwiejsze, gdyby jqPlot obsługiwał wiele zestawów słupków. Mam nadzieję, że kiedyś to nastąpi. Jednak ostatnie wydanie było 2013-03-27 i nie wydaje się, aby były jakiekolwiek prace rozwojowe po tym czasie. Wcześniej wydawano co kilka miesięcy. Ale jqPlot jest wydany na licencji GPL i MIT, aby każdy mógł kontynuować pracę.

$(document).ready(function() { 
 
    //Numbers derived from desired image 
 
    //var s1 = [10, 29, 35, 48, 0]; 
 
    //var s2 = [34, 24, 15, 20, 0]; 
 
    //var s3 = [18, 19, 26, 52, 0]; 
 
    //Scale to get 30 max on plot 
 
    var s1 = [2, 5.8, 7, 9.6, 0]; 
 
    var s2 = [6.8, 4.8, 3, 4, 0]; 
 
    var s3 = [13.6, 8.8, 3, 7.8, 0]; 
 
    plot4 = $.jqplot('chart4', [s1, s2, s3], { 
 
     // Tell the plot to stack the bars. 
 
     stackSeries: true, 
 
     captureRightClick: true, 
 
     seriesColors: ["#1B95D9", "#A5BC4E", "#E48701"], 
 
     seriesDefaults: { 
 
      shadow: false, 
 
      renderer: $.jqplot.BarRenderer, 
 
      rendererOptions: { 
 
       // jqPlot does not actually obey these except barWidth. 
 
       barPadding: 0, 
 
       barMargin: 66, 
 
       barWidth: 38, 
 
       // Highlight bars when mouse button pressed. 
 
       // Disables default highlighting on mouse over. 
 
       highlightMouseDown: false 
 
      }, 
 
      title: { 
 
       text: '', // title for the plot, 
 
       show: false, 
 
      }, 
 
      markerOptions: { 
 
       show: false, // wether to show data point markers. 
 
      }, 
 
      pointLabels: { 
 
       show: false 
 
      } 
 
     }, 
 
     axes: { 
 
      xaxis: { 
 
       renderer: $.jqplot.CategoryAxisRenderer, 
 
       tickOptions: { 
 
        show: false 
 
       }, 
 
       lastPropertyConvenience: 0 
 
      }, 
 
      yaxis: { 
 
       // Don't pad out the bottom of the data range. By default, 
 
       // axes scaled as if data extended 10% above and below the 
 
       // actual range to prevent data points right on grid boundaries. 
 
       // Don't want to do that here. 
 
       padMin: 0 
 
      } 
 
     }, 
 
     legend: { 
 
      show: false, 
 
      location: 'e', 
 
      placement: 'outside' 
 
     }, 
 
     grid: { 
 
      drawGridLines: true, // wether to draw lines across the grid or not. 
 
      shadow: false, // no shadow 
 
      borderWidth: 1, 
 
      background: 'white', // CSS color spec for background color of grid. 
 
      lastPropertyConvenience: 0 
 
     }, 
 
     lastPropertyConvenience: 0 
 
    }); 
 
}); 
 
    
 
    $(document).ready(function() { 
 
     //Numbers derived from desired image 
 
     //var s1 = [10, 29, 35, 48, 0]; 
 
     //var s2 = [34, 24, 15, 20, 0]; 
 
     //var s3 = [18, 19, 26, 52, 0]; 
 
     //Scale to get 30 max on plot 
 
     var s1 = [2, 5.8, 7, 9.6, 0]; 
 
     var s2 = [6.8, 4.8, 3, 4, 0]; 
 
     var s3 = [3.6, 3.8, 5.2, 10.4, 0]; 
 
     plot4 = $.jqplot('chart5', [s1, s2, s3], { 
 
      // Tell the plot to stack the bars. 
 
      stackSeries: true, 
 
      captureRightClick: true, 
 
      seriesColors: ["#754DE9", "#666666", "#000000"], 
 
      seriesDefaults: { 
 
       shadow: false, 
 
       renderer: $.jqplot.BarRenderer, 
 
       rendererOptions: { 
 
        // jqPlot does not obey these options except barWidth. 
 
        show: true, 
 
        barPadding: 0, 
 
        barMargin: 66, 
 
        barWidth: 38, 
 
        // Highlight bars when mouse button pressed. 
 
        // Disables default highlighting on mouse over. 
 
        highlightMouseDown: false 
 
       }, 
 
       title: { 
 
        text: '', // title for the plot, 
 
        show: false, 
 
       }, 
 
       markerOptions: { 
 
        show: false, // wether to show data point markers. 
 
       }, 
 
       pointLabels: { 
 
        show: false 
 
       } 
 
      }, 
 
      axesDefaults: { 
 
       //show: false  
 
      }, 
 
      axes: { 
 
       xaxis: { 
 
        renderer: $.jqplot.CategoryAxisRenderer, 
 
        tickOptions: { 
 
         show: false 
 
        }, 
 
        lastPropertyConvenience: 0 
 
       }, 
 
       yaxis: { 
 
        show: false, 
 
        // Don't pad out the bottom of the data range. By default, 
 
        // axes scaled as if data extended 10% above and below the 
 
        // actual range to prevent data points right on grid boundaries. 
 
        // Don't want to do that here. 
 
        padMin: 0, 
 
        tickOptions: { 
 
         show: false 
 
        }, 
 
       } 
 
      }, 
 
      legend: { 
 
       show: false, 
 
       location: 'e', 
 
       placement: 'outside' 
 
      }, 
 
      grid: { 
 
       drawGridLines: false, // wether to draw lines across the grid or not. 
 
       shadow: false, // no shadow 
 
       borderWidth: 10, 
 
       background: 'transparent', // CSS color for background color of grid. 
 
       gridLineColor: 'transparent', // *Color of the grid lines. 
 
       borderColor: 'transparent', // CSS color for border around grid. 
 
       lastPropertyConvenience: 0 
 
      }, 
 
      lastPropertyConvenience: 0 
 
     }); 
 
    });
#cover1 { 
 
    padding:0; 
 
    margin: 0; 
 
    background-color: white; 
 
    left: 451px; 
 
    width: 88px; 
 
    /* Uncomment the next three lines to have a border on the right of the graph and 
 
     balanced whitespace:*/ 
 
    /* 
 
    border-left: 2px solid #CCCCCC; 
 
    left:476px; 
 
    width: 62px; 
 
    */ 
 
} 
 
#chart4 .jqplot-xaxis-tick { 
 
    visibility: hidden; 
 
} 
 
#chart5 .jqplot-xaxis-tick { 
 
    visibility: hidden; 
 
} 
 
#chart4 .jqplot-yaxis-tick { 
 
    font: 9px arial 
 
}
<link class="include" rel="stylesheet" type="text/css" href="http://cdn.jsdelivr.net/jqplot/1.0.8/jquery.jqplot.css" /> 
 

 
<!--[if lt IE 9]><script language="javascript" type="text/javascript" src="http://cdn.jsdelivr.net/excanvas/r3/excanvas.js"></script><![endif]--> 
 
<script class="include" type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> 
 
<!-- Main jqPlot --> 
 
<script class="include" type="text/javascript" src="http://cdn.jsdelivr.net/jqplot/1.0.8/jquery.jqplot.js"></script> 
 
<!-- Additional jqPlot plugins --> 
 
<script class="include" type="text/javascript" src="http://cdn.jsdelivr.net/jqplot/1.0.8/plugins/jqplot.barRenderer.min.js"></script> 
 
<script class="include" type="text/javascript" src="http://cdn.jsdelivr.net/jqplot/1.0.8/plugins/jqplot.categoryAxisRenderer.min.js"></script> 
 

 

 
<div style="position:absolute; left:10px; top:10px;"> 
 
    <div id="chart4" style="width:548px; height:185px;"></div> 
 
    <div id="chart5" style="width:536px; height:185px; top:-185px; left:53px;"></div> 
 
    <div id="cover1" style="position: relative; height: 152px; top:-361px;"></div> 
 
</div>

Powyższy kod jest oparty na tym, na example page listed in the question.

0

rozwiązanie Praktyczne ...

$(document).ready(function(){ 
    var s1 = [2, 0, 0, 10,11,0, 6, 2, 0,10,11]; 
    var s2 = [7, 0, 0, 4,11,0, 6, 2, 0,10,11]; 
    var s3 = [4, 0, 0, 7,11,0, 6, 2, 0,10,11]; 
    var s4 = [0, 20, 0, 0,0,0, 0, 0, 0,0,0]; 
    plot3 = $.jqplot('chart3', [s1, s2, s3,s4], { 
    stackSeries: true, 
    captureRightClick: true, 
    seriesDefaults:{ 
     renderer:$.jqplot.BarRenderer, 
     rendererOptions: { 
      barMargin: 30, 
      highlightMouseDown: true 
     }, 
     pointLabels: {show: true} 
    }, 
    axes: { 
     xaxis: { 
      renderer: $.jqplot.CategoryAxisRenderer 
     }, 
     yaxis: { 
     padMin: 0 
     } 
    }, 
    legend: { 
     show: true, 
     location: 'e', 
     placement: 'outside' 
    }  
    }); 
    $('#chart3').bind('jqplotDataClick', 
    function (ev, seriesIndex, pointIndex, data) { 
     $('#info3').html('series: '+seriesIndex+', point: '+pointIndex+', data: '+data); 
    } 
); 
}); 

Obrazek: enter image description here

Powiązane problemy