2012-12-20 21 views
8

Ich möchte ein Balkendiagramm mit zwei Gruppen von gestapelten Balken erstellen, die zum Vergleich der beiden Gruppen von gestapelten Balken gruppiert sind. Dies sollte auf folgende Weise angezeigt werden:Verwendung von Jqplot zum Anzeigen von zwei Gruppen von verschiedenfarbigen Balken im selben gestapelten Balkendiagramm

Bar chart

ich dieses durch link

gegangen, aber es hat mir nicht geholfen Grundstück etwas wie Sie im Bild oben zu sehen. Ich habe sogar versucht, zwei Datensätze wie [[s1, s2, s3], [s4, s5, s6]] zu senden. Aber es hat mir nicht geholfen, das Diagramm zu plotten. Weiß jemand wie es geht?

Jede Hilfe wird sehr geschätzt. Vielen Dank im Voraus.

+0

Kann jemand mir dabei helfen? –

Antwort

3

Mit der Option stackSeries: true wird die gewünschte Anzeige für Balkendiagramme erstellt.

+0

Hallo MLX, wird es funktionieren, wenn wir nur mit einer Datenreihe arbeiten.Hier haben wir zwei Sätze von gestapelten Charts (orange-grün-blau UND schwarz-grau-lila). Sagen wir, wenn wir nur die orange-grün-blauen Stapel anzeigen wollen, dann ist es möglich. –

+0

Dies funktioniert einfach nicht für das, was in der Frage gefragt wird: zwei verschiedene Sätze von Daten, die mit verschiedenen Farben gruppiert sind. Ja, es wird dazu führen, dass ein * einzelner Satz * von Daten als gestapeltes Balkendiagramm angezeigt wird, aber das wurde bereits von der Frage vorausgesetzt. – Makyen

2

Offizielle Quellen:

Die jqPlot documentation ist nicht auf dem neuesten Stand also habe ich mir die source code angesehen. Leider gibt es keine Möglichkeit, zwei Sätze von Balken mit einem gestapelten Balkendiagramm direkt zu haben. Die jqPlot.stackSeries-Eigenschaft ist nur ein boolescher Wert. Es ist nur die Funktion, jqPlot zu sagen, dass jede Reihe so viele Balken übereinander gestapelt werden soll, wie es Werte in den verschiedenen Reihen gibt. Jede Serie wird mit einem Wert pro Balken dargestellt, wobei sich die erste Reihe unten befindet. Mit anderen Worten, alle Werte [0] werden im ersten Balken, [1] Werte im zweiten usw. aufgetragen. Der im Balken angezeigte Wert ist die Summe des Wertes [n] für die aktuelle Serie und alle vorherigen Serien. Es gibt keine Möglichkeit anzugeben, dass es zwei oder mehr Gruppierungen von Reihen gibt. Die Fähigkeit, das Gewünschte zu tun, existiert in jqPlot nicht.

Aber man kann erreichen, was Sie sich wünschen:

Die Tatsache, dass jqPlot nicht nativ unterstützt, was Sie wollen, bedeutet nicht, dass Sie es nicht tun, nur, dass Sie kreativ zu werden brauchen.

Das Diagramm, das Sie wünschen, kann als zwei separate Graphen betrachtet werden, die mit Abständen zwischen den Balken auf den einzelnen Graphen überlagert wurden, so dass genügend Platz (seriesDefaults.rendererOptions.barMargin) für die Balken des anderen Graphen als nächstes überlagert werden kann zu ihnen.

können Sie jqPlot verwenden zu erstellen: enter image description here

Das Diagramm, das die Skala, Hintergrund und Grid-Linien, die Sie sichtbar sein wollen gesetzt hat. Beachten Sie, dass das Diagramm einen zusätzlichen Balken enthält. Dies ist erforderlich, um genügend Hintergrund- und Rasterlinien für den letzten Balken des anderen Diagramms bereitzustellen.

Sie können auch jqPlot verwenden, um die zweite Kurve zu erstellen: Second graph with transparent background

Dieser Graph hat den Umfang und die Gitterlinien in jqPlot gesetzt nicht sichtbar sein.

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

Der Hintergrund wird auf transparent gesetzt. Beachten Sie, dass Sie die Position dieses Graphen gehen zu müssen, zum Ausgleich etwas nach rechts, wenn der Positionierung des <div> relativ zum ersten Graphen.

Overlaid, Sie am Ende mit: Overlay Graph 1 and Graph 2

Sie dann eine leeres <div> mit der gleichen Hintergrundfarbe als Hintergrundfarbe Ihrer Webseite verwenden und überlagern, dass die zusätzliche Bar im ersten Diagramm zu decken, aber verlassen genug des Hintergrunds und der Gitterlinien des ersten Graphen, um etwas über den letzten Balken des zweiten Graphen hinaus zu reichen.

Sie werden am Ende mit:

Final graph

Sie einen working solution at at JSFiddle jqPlot 1.0.8r1250 mit sehen können.

die ursprüngliche Anforderung gegen die endgültige Version des Graphen Vergleicht man dieses Verfahren hergestellt unter Verwendung Sie können sehen, dass sie ganz in der Nähe sind: Compare jqPlot version with original desire Zwischen den beiden der auffälligste Unterschied ist der größere Abstand zwischen der Y-Achse in der jqPlot-Version. Leider scheint es keine Option zu geben, diesen Betrag für gestapelte Balkendiagramme zu reduzieren.

Beachten Sie, dass das Fehlen einer Grenze auf der rechten Seite des Graphen erzeugt dieser Code beabsichtigt ist, weil es nicht in der ursprünglichen Anforderung nicht gab. Persönlich bevorzuge ich einen Rand auf der rechten Seite des Graphen. Wenn Sie die CSS ein wenig ändern, das ist leicht zu erhalten: Meine bevorzugte Version des Graphen enthält eine Grenze auf der linken Seite und gleicht die Leerzeichen: My preferred version of the graph

Sie ein Arbeits JSFiddle of this version sehen können.

All-in-alles ist es nicht so schwierig. Es wäre natürlich einfacher, wenn jqPlot mehrere Sätze von Balken unterstützt. Hoffentlich wird es irgendwann. Allerdings war die letzte Version 2013.03.27 und es scheint nicht nach dieser Zeit jede Entwicklungsarbeit gewesen zu sein. Zuvor gab es alle paar Monate Releases. Aber jqPlot wird unter den GPL- und MIT-Lizenzen veröffentlicht, damit jeder die Arbeit fortsetzen kann.

$(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>

Der obige Code wird an den example page listed in the question auf dieser Grundlage.

0

Praktische Lösung ...

$(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); 
    } 
); 
}); 

Image: enter image description here