Chart.jsでグラフの高さを設定する


138

Chart.jsを使用して水平棒グラフを描画したいのですが、スクリプトからキャンバスに割り当てる高さを使用する代わりに、グラフをスケーリングし続けます。

スクリプトからグラフの高さを設定する方法はありますか?

フィドルを参照してください:Jsfidle

HTML

<div class="graph">
  <div class="chart-legend">

  </div>
  <div class="chart">
    <canvas id="myChart"></canvas>
  </div>
</div>

JavaScript

var ctx = $('#myChart');

ctx.height(500);

var myChart = new Chart(ctx, {
    type: 'horizontalBar',
    data: {
        labels: ["Red", "Blue", "Yellow", "Green", "Purple", "Orange"],
        datasets: [{
            label: '# of Votes',
            data: [12, 19, 3, 5, 2, 3],
            backgroundColor: [
                'rgba(255, 99, 132, 0.2)',
                'rgba(54, 162, 235, 0.2)',
                'rgba(255, 206, 86, 0.2)',
                'rgba(75, 192, 192, 0.2)',
                'rgba(153, 102, 255, 0.2)',
                'rgba(255, 159, 64, 0.2)'
            ],
            borderColor: [
                'rgba(255,99,132,1)',
                'rgba(54, 162, 235, 1)',
                'rgba(255, 206, 86, 1)',
                'rgba(75, 192, 192, 1)',
                'rgba(153, 102, 255, 1)',
                'rgba(255, 159, 64, 1)'
            ],
            borderWidth: 1
        }]
    },
    maintainAspectRatio: false,
    options: {
        scales: {
            yAxes: [{
                ticks: {
                    beginAtZero:true
                }
            }]
        }
    }
});

回答:


71

var ctx = $('#myChart');要素のリストを返すようです。最初にを使用して参照する必要がありctx[0]ます。また、高さはプロパティではなく、関数です。

私はコードで次のようにそれを行いました:

var ctx = document.getElementById("myChart");
ctx.height = 500;

5
@MattSaundersピクセル単位です。
Jonathan Lam、

334

オプションでアスペクト比の維持を無効にすると、利用可能な高さが使用されます。

var chart = new Chart('blabla', {
                type: 'bar',
                data: {
                },
                options: {
                    maintainAspectRatio: false,
                }
            });

うん!正常に動作しています。このヒントをありがとう。よろしく男。
Sedat Kumcu

14
なぜこれが受け入れられた答えではないのですか?完全に動作します
トムドゥードラ2017

3
興味深いことに、destroy()チャートを同じキャンバス上にもう一度作成すると、キャンバスの高さが破壊された後にめちゃくちゃになり、作成前に再適用する必要があります。ただし、updateオプションを変更しない場合は、破棄を回避してメソッドを代わりに使用できます。
ガーマン2017年

5
利用可能な高さを使用するだけでなく、最小の高さも設定するにはどうすればよいですか?
Zapnologica 2018

1
このプロパティを無効にすることで何ができるかを少し説明するのは理にかなっています(既に説明したものを除く)。
fgblomqvist 2018

115

最も簡単な方法は、キャンバスのコンテナを作成して高さを設定することです。

<div style="height: 300px">
  <canvas id="chart"></canvas>
</div>

そしてセット

options: {  
    responsive: true,
    maintainAspectRatio: false
}

21
このおかげで、ここで重要なのはグラフのオプションでに設定maintainAspectRatioすることです。そうしないと、属性を介して割り当てられたものが実際には有効になりません。falseheightstyle
ベン

2
ベンの提案は金です。
rubeonline 2018年

responsiveオプションのデフォルト値はtrueです。詳細:chartjs.org/docs/latest/general/...
デムPilafian

heightプロパティはキャンバス上ではなく親要素上にある必要があることを明確にしていただきありがとうございます
Savage

16

相対的に配置された親divでキャンバス要素をラップしてから、そのdivに必要な高さを与え、オプションでmaintainAspectRatio:falseを設定します。

//HTML
<div id="canvasWrapper" style="position: relative; height: 80vh/500px/whatever">
<canvas id="chart"></canvas>
</div>

<script>
new Chart(somechart, {
options: {
    responsive: true,
    maintainAspectRatio: false

/*, your other options*/

}
});
</script>

Chart.jsウェブサイトのドキュメントに基づくと、これは正しいアプローチのようです。
ライアンD

14

これは私のために働きました:

HTMLから高さを設定

canvas#scoreLineToAll.ct-chart.tab-pane.active[height="200"]
canvas#scoreLineTo3Months.ct-chart.tab-pane[height="200"]
canvas#scoreLineToYear.ct-chart.tab-pane[height="200"]

次に、アスペクト比を維持することを無効にしました

options: {
  responsive: true,
  maintainAspectRatio: false,

6

彼は正しい。jQueryを使い続けたい場合は、これを行うことができます

var ctx = $('#myChart')[0];
ctx.height = 500;

または

var ctx = $('#myChart');
ctx.attr('height',500);

そのドル記号は何ですか?
Tiberiu-Ionuț Stan

1
$記号はjQueryのセレクターおよびエイリアスです
Andrei Erdoss

4

チャートのaspectRatioプロパティを0に設定すると、私にとってはうまくいきました...

    var ctx = $('#myChart');

    ctx.height(500);

    var myChart = new Chart(ctx, {
        type: 'horizontalBar',
        data: {
            labels: ["Red", "Blue", "Yellow", "Green", "Purple", "Orange"],
            datasets: [{
                label: '# of Votes',
                data: [12, 19, 3, 5, 2, 3],
                backgroundColor: [
                    'rgba(255, 99, 132, 0.2)',
                    'rgba(54, 162, 235, 0.2)',
                    'rgba(255, 206, 86, 0.2)',
                    'rgba(75, 192, 192, 0.2)',
                    'rgba(153, 102, 255, 0.2)',
                    'rgba(255, 159, 64, 0.2)'
                ],
                borderColor: [
                    'rgba(255,99,132,1)',
                    'rgba(54, 162, 235, 1)',
                    'rgba(255, 206, 86, 1)',
                    'rgba(75, 192, 192, 1)',
                    'rgba(153, 102, 255, 1)',
                    'rgba(255, 159, 64, 1)'
                ],
                borderWidth: 1
            }]
        },
        maintainAspectRatio: false,
        options: {
            scales: {
                yAxes: [{
                    ticks: {
                        beginAtZero:true
                    }
                }]
            }
        }
    });
myChart.aspectRatio = 0;

4

canvas要素のhtml height属性を次のように使用する必要があります。

<div class="chart">
    <canvas id="myChart" height="100"></canvas>
</div>

2

コンテナーを作成して、ビューポートの希望の高さに設定しました(チャートの数またはチャート固有のサイズに応じて):

.graph-container {
width: 100%;
height: 30vh;
}

画面サイズに合わせて動的にするには、コンテナを次のように設定します。

*Small media devices specific styles*/
@media screen and (max-width: 800px) {
.graph-container {
        display: block;
        float: none;
        width: 100%;
        margin-top: 0px;
        margin-right:0px;
        margin-left:0px;
        height: auto;
    }
}

もちろん、非常に重要です(何度も参照されているように)option、チャートの次のプロパティを設定します。

options:{
    maintainAspectRatio: false,
    responsive: true,
}

2

寸法をキャンバスに設定することもできます

<canvas id="myChart" width="400" height="400"></canvas>

次に、レスポンシブオプションをfalseに設定して、常に指定したサイズでグラフを維持します。

options: {
    responsive: false,
}

1

手動で高さを設定するのではなく、親要素を100%埋めるためにチャートが必要でした。問題は、親divが常に残りのスペースを埋めるように強制することでした。

レスポンシブオプションと比率オプションを設定した後(関連するChartjsドキュメントを確認してください))、次のcssでうまく。

html

<div class="panel">
  <div class="chart-container">
    <canvas id="chart"></canvas>
  </div>
</div>

scss:

.panel {
  display: flex;

  .chart-container {
    position: relative;
    flex-grow: 1;
    min-height: 0;
  }
}

0

@numediawebからの回答に追加するだけです

設定手順に従って壁に頭をぶつけている場合maintainAspectRatio=false:私は最初に、Angular 2+でChart.jsを使用してWebサイトで取得した例からコードをコピーしました。

        <div style="display: block">
          <canvas baseChart
                  [datasets]="chartData"
                  [labels]="chartLabels"
                  [options]="chartOptions"
                  [legend]="chartLegend"
                  [colors]="chartColors"
                  [chartType]="chartType">
          </canvas>
        </div>

これを正しく機能させるには、埋め込まれた(そして不要な)を削除する必要があります style="display: block" 代わりに、囲んでいるdivのクラスを定義し、その高さをCSSで定義します。

これを行うと、グラフの幅は反応しますが、高さは固定されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.