Highchartsを使用して、次のような縦棒(別名「縦棒グラフ」)を作成しています: highcharts.com/demo/column-basic
事柄は、チャートに30本のバーがある場合もあれば、2本しかない場合もあります。グラフの2つの実際に幅の広いバーがある場合、それは本当に奇妙に見えます。そのため、バーの最大幅を設定することにしました。そうすれば、2つしかない場合は、たとえば50pxよりも広くなりませんが、50がある場合、Highchartsは、適切に見えるようにサイズを設定できます。
したがって、私の問題は、Highchartsに列の最大幅を明示的に設定する方法がないことです。誰かがその解決策を見つけましたか?
更新:Highchartsバージョン4.1.8以降は、 Adam Goodwinの回答、以下 を参照してください。
長年にわたり、列の最大幅を設定する唯一の方法は、JavaScriptを介して動的に行うことでした。
基本的に:
pointWidth
をリセットしてください。何かのようなもの:
var chart = new Highcharts.Chart ( { ... ...
//--- Enforce a Maximum bar width.
var MaximumBarWidth = 40; //-- Pixels.
var series = chart.series[0];
if (series.data.length) {
if (series.data[0].barW > MaximumBarWidth) {
series.options.pointWidth = MaximumBarWidth;
/*--- Force a redraw. Note that redraw() will not
fire in this case!
Hence we use something like setSize().
*/
chart.setSize (400, 300);
}
}
明らかにこの質問はこの機能が存在しないときにずっと前に尋ねられましたが、Highcharts 4.1.8以降では、plotOptions.column.maxPointWidth
設定を使用して回避策なしでこれを行うことができます:
$('#container').highcharts({
/* Other chart settings here... */
plotOptions: {
column: {
/* Here is the setting to limit the maximum column width. */
maxPointWidth: 50
}
}
/* Other chart settings here... */
});
以下は、この機能を示すように変更された基本的な縦棒グラフの例のJSFiddleです。
そして、この設定のドキュメントはここにあります: http://api.highcharts.com/highcharts#plotOptions.column.maxPointWidth
究極のソリューションは、各ポイントのdrawPoints
をラップしてshaperArgs
を上書きすることです。特に、x位置と幅:
(function(H) {
var each = H.each;
H.wrap(H.seriesTypes.column.prototype, 'drawPoints', function(proceed) {
var series = this;
if(series.data.length > 0 ){
var width = series.barW > series.options.maxPointWidth ? series.options.maxPointWidth : series.barW;
each(this.data, function(point) {
point.shapeArgs.x += (point.shapeArgs.width - width) / 2;
point.shapeArgs.width = width;
});
}
proceed.call(this);
})
})(Highcharts)
使用する:
$('#container').highcharts({
chart: {
type: 'column'
},
series: [{
maxPointWidth: 50,
data: [ ... ]
}]
});
そしてライブデモ: http://jsfiddle.net/83M3T/1/
より良い方法が提案されているでしょう
このフィドルをチェック
追加するだけ
series: {
pointWidth: 20
}
あなたはオプションをプロットし、それで終わります。 :)乾杯をお楽しみください...
function(chart){
var series = chart.series[0];
//--- Enforce a Maximum bar width
if (series && series.data.length) {
if (series.data[0].pointWidth > MaximumBarWidth) {
for(var i=0;i< chart.series.length;i++)
chart.series[i].update({
pointWidth:MaximumBarWidth
});
}
}
}
私の場合、必要なのは pointRange
を1に設定することでした。ボックスのあるカテゴリがボックスのないカテゴリに隣接している場合(散布シリーズの外れ値のみ)、ボックスはカテゴリよりも幅が広くなります。
良い説明があります ここ 。
私はHighChartsを使用して同じ問題に直面し、これが私がそれを修正した方法です!!
-グラフのラッパーdivを作成します。最小幅とオーバーフロー:autoを指定します。 (横スクロールを有効にするには)
-各バーの「pointWidth」を必要な値に設定します。 (たとえば、pointWidth:75)
-バーの数に基づいて、chartWidthを動的に設定します。
ChartWidth =(バーの数)*(pointWidth)* 2を使用
したがって、15本の棒がある場合、chartWidth = 15 * 75 * 2 = 2250pxです。2は、棒の間隔を調整するために、より大きなグラフ幅を作成するために使用されます。
-このようにして、スクロール可能なチャートに同じ幅のバーをいくつでも配置できます... :)
SpacingTop属性を使用して、棒グラフに最大のpointWidthを適用しました。
if (series[0].data[0].pointWidth > maximumBarWidth) {
this.options.chart.spacingTop = this.options.chart.height - (maximumBarWidth * series.length) - 30;
this.isDirtyBox = true;
this.redraw();
}
したがって、特定の幅に1つのバーがある場合、間隔は調整され、グラフは小さく描画されます。
これはコンテナのサイズを変更しませんが、バーを特定のサイズの下に保ち、pointPaddingおよびgroupPaddingは影響を受けません。
あなたはspacingRightで同じことをすることができて、棒の間の醜いスペースなしで一貫したチャートを持っているでしょう。