chart.js4系でグラフサイズ設定方法を詳しく

このQ&Aのポイント
  • chart.js4系を使用して棒グラフのサイズ設定をしたいが、うまくいかない。
  • maintainAspectRatioオプションをfalseに設定してもスタイル設定が反映されない。
  • chart.js4系についての詳しいサイズ設定方法を教えてほしい。
回答を見る
  • ベストアンサー

chart.js4系でグラフサイズ設定方法を詳しく

先の質問「chart.js4.2でカラー設定をする方法 ・・https://okwave.jp/qa/q10117946.html」のコードで描画すると棒グラフが上半分くらいに圧縮されたようにしか描画されなかったのでそれを直すために datasets: datasets }, options: { maintainAspectRatio: false, plugins: { としていましたが、これを回答してもらったコードに加えると棒グラフの縦幅が大きくなりすぎ下のグラフと重なるような状態となりました。 デフォルトでは、 「リサイズしても、元のキャンバスの縦横比(幅/高さ)は維持されます。」 とあります。さらに縦横比(幅/高さ)に関し 「aspectRatio number 1|2 キャンバスの縦横比(すなわち、幅 / 高さ、値 1 は正方形のキャンバスを表す)。なお、このオプションは、高さが属性として、またはスタイルによって明示的に定義されている場合は無視されます。放射状チャート(ドーナツ、パイ、polarArea、レーダー)のデフォルト値は1、その他のチャートのデフォルト値は2です。 」 それで最初の棒グラフでは縦横比が1/2になっているためとなんとなくこの動きは理解できましたが、しかし後の方でもcssのスタイル設定で明示的に .container .chart1 { margin-bottom: 0; width: 400px; height: 350px; } としているのに「スタイルによって明示的に定義されている場合は無視されます」ありますが1/2のままです。そこでmaintainAspectRatio: falseを加えて初めてスタイル設定が有効になります。 2系に比べ4系は本家のサイトによる情報が主ですし英語は翻訳サイトを使うしか能がないため理解できないことがすこぶる多いのが現状ですので、宜しければ、適正なサイズの設定方法に関する明快で詳しい情報のご教授お願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • retorofan
  • ベストアンサー率33% (328/974)
回答No.1

chart.js4.2でカラー設定をする方法 >前のコードで描画すると棒グラフが上半分くらいに圧縮されたようにしか描画されなかった そやあ、そうでしょう!? オプションに maintainAspectRatio が書かれていなくても デフォルト値は maintainAspectRatio: true それが適用されたのですから アスペクト比は 2:1 で描画されています。 (つまり、高さが短く表示される) キャンバスのサイズが、  width: 400px;  height: 350px; このスタイルで、2:1の比率にしようとした時 縦を基準にしようとしたら 700:350 でないといけないけれど 横サイズがそんなにないために適用できない。 横を基準にしようとすれば、高さが350あるから 400:200は可能なので、こちらが適用された。 ここで重要なことは、 キャンバスのサイズに単位「px」を使っていても ピクセルではなくて、数値の比率で判断される、ということ。 >「スタイルによって明示的に定義されている場合は無視されます」ありますが1/2のままです。 スタイル設定してあっても、maintainAspectRatio が記述されていなければ、 maintainAspectRatio: true が適用されたことと同じです。それがデフォルトなんだから。 >そこでmaintainAspectRatio: falseを加えて初めてスタイル設定が有効になります。 falseは「固定アスペクト比を解除しなさい」ということ。 つまり「2:1ルールに従わなくてもいいよ」と指示したことになります。 その結果、スタイル設定が反映されて縦サイズが活かされて長く表示されたのです。 【適正なサイズの設定方法にするには】 ・固定アスペクト比を保持したければ 次を書くか、書かないこと。  maintainAspectRatio: true ・自分の思い通りの縦横サイズにしたければ スタイル記述と下記は必須  maintainAspectRatio: false chart.jsにおいては、図形描画に際して、 ・キャンバス要素の親要素のサイズが重要で、それによって表示領域が決まる ・キャンバスにサイズを書かなくても問題ない ということを付け加えておきます。

turu575
質問者

お礼

早速の回答ありがとうございます。 なるほど >スタイル設定してあっても、maintainAspectRatio が記述されていなければ、 >maintainAspectRatio: true >が適用されたことと同じです。それがデフォルトなんだから。 ですか、疑問については自信はありませんが納得しました。 ここでさらに理解できないことがありまして、2.9系で <canvas id="myChart2" width="550" height="450"> としていたが4系では、効かないと思っていましたが、 2.9系のコードを <script src部分だけ4.2.1に置き換えて <canvas id="myChart1" width="250" height="250"> と小さく設定し options: { responsive: false, としたところ棒グラフのサイズが小さく変化しました。 先程の回答を見る前にさらなる混乱を来しておりました。<canvas内での設定とresponsive: falseの関係をお教えください。

その他の回答 (1)

  • retorofan
  • ベストアンサー率33% (328/974)
回答No.2

一件落着したら 別質問で上げてくださるようお願いいたします。 そうでないと、果てしなく続くことになってしまいますので。 よろしくお願い申し上げます。

関連するQ&A

  • chart.jsのグラフを複数個表示する方法

    今回は、chart.jsのグラフを複数表示する方法についてお尋ねします。一応下記のコードで棒グラフ×1、円グラフ×3を上下2個ずつ配置出来るようにまではなったのですが、ただ単に1個のグラフのコードを4回繰り返したようなものですので無駄が多く冗長なコードになっています。これをもっとコンパクトなものに出来ないかと思い投稿した次第です。html,css,javascriptに関しては専門家でないのでつまみ食い程度の知識で間に合わせたお粗末なコードですが、宜しくご教授願います。 <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8">  <title>multiグラフ</title> </head> <body> <div class="row" style="width: 70%;" > <div class="chart1" style="float: left;" > <canvas id="myChart1" width="550" height="450"></canvas></div> <div class="chart2" style="float: right;"> <canvas id="myChart2" width="550" height="450"></canvas></div> <div class="chart3" style="bottom: 0;float: left;"> <canvas id="myChart3" width="550" height="450"></canvas></div> <div class="chart4" style="bottom: 0;float: right;"> <canvas id="myChart4" width="550" height="450"></canvas></div> </div> <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.9.4/Chart.js"></script> <script src="https://unpkg.com/chartjs-plugin-colorschemes"></script> <script> Chart.defaults.global.legend.labels.usePointStyle = false; //以降の凡例スタイルを矩形のまま var ctx = document.getElementById("myChart1"); var myPieChart = new Chart(ctx, { type: 'bar', data: {labels: ['1月','2月','3月','4月','5月','6月','7月'], // X軸のラベル datasets: [ {label: '仙台',data: [320000, 590000, 400000, 420000, 380000, 250000, 420000]}, {label: '札幌',data: [520000, 450000, 380000, 280000, 590000, 400000, 530000]}, {label: '渋谷',data: [650000, 230000, 480000, 600000, 620000, 700000, 760000]}]}, options: { plugins: { colorschemes: {scheme: 'office.Slice6'}}, responsive: false, // canvasサイズ自動設定機能を使わない。HTMLで指定したサイズに固定 title: { display: false,  text:''},     legend: { // 凡例 display: true, // 表示の有無 position: 'top' } // 表示位置 }}); Chart.defaults.global.legend.labels.usePointStyle = true; //以降の凡例スタイルを矩形を円に変える var ctx = document.getElementById("myChart2"); var myPieChart = new Chart(ctx, { type: 'pie', data: {labels: ['1月','2月','3月','4月','5月','6月','7月'], // X軸のラベル datasets: [{label:'仙台' ,data: [320000, 590000, 400000, 420000, 380000, 250000, 420000]}]}, options: { plugins: { colorschemes: {scheme: 'brewer.DarkTwo7'}}, responsive: false, // canvasサイズ自動設定機能を使わない。HTMLで指定したサイズに固定 title: { display: true,   text:'仙台'},     legend: { // 凡例 display: true, // 表示の有無 position: 'left',} // 表示位置 }}); var ctx = document.getElementById("myChart3"); var myPieChart = new Chart(ctx, { type: 'pie', data: { labels: ['1月','2月','3月','4月','5月','6月','7月'], // X軸のラベル datasets: [{label:'札幌' ,data: [520000, 450000, 380000, 280000, 590000, 400000, 530000]}]}, options: { plugins: { colorschemes: {scheme: 'brewer.DarkTwo7'}}, responsive: false, // canvasサイズ自動設定機能を使わない。HTMLで指定したサイズに固定 title: { display: true, text:'札幌'}, legend: { // 凡例 display: true, // 表示の有無 position: 'left'} // 表示位置 }}); </script> </body> </html> 文字数の関係で渋谷のグラフ(myChart4)の部分はカットしました。

  • chart.jsのコードを2.9から4.2に変換

    以前使っていたchart.jsのバージョン2.9系から最新の4.2系に変えたいと思い試行しています。基本的なサンプルはなんとかなるのですが、3系統に変わってから大きく変化した部分が全く理解しないまま2系統を使い続けて来たのが現況です。今回、4系統に挑戦するにあたり下記の2系統で人口ピラミッドのためのコードの書き換え方をお教えください。 <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>multiグラフ</title> </head> <body> <div class="row" style="width: 100%;" > <div class="chart1" style="float: left;" > <canvas id="myChart1" width="300" height="450"></canvas></div> <div class="chart2" style="left: 300px"> <canvas id="myChart2" width="350" height="450"></canvas></div> </div> <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.9.4/Chart.js"></script> <script> Chart.defaults.global.defaultFontColor = 'black'; var ctx = document.getElementById("myChart1").getContext('2d'); var myChart = new Chart(ctx, { type: "horizontalBar", // 水平棒グラフ data: { labels: ['90歳以上','85~89歳','80~84歳','75~79歳','70~74歳','65~69歳','60~64歳','55~59歳','50~54歳','45~49歳','40~44歳','35~39歳','30~34歳','25~29歳','20~24歳','15~19歳','10~14歳','5~9歳','0~4歳'], datasets: [ { label:'男',data: [-3790,-8605,-14805,-16655,-19641,-29027,-26151,-22360,-19752,-19288,-22510,-20397,-17238,-14645,-12763,-16385,-15610,-14625,-13880,], backgroundColor: "red" } ] }, options: { responsive: false, title: { display: true, text: 'Pyramide des ages' }, scales: { xAxes: [{ stacked: true, ticks: { callback: function (v){ return Math.abs(v) } } }], yAxes: [{stacked: true, ticks: { display: false } }] } } }); var ctx = document.getElementById("myChart2").getContext('2d'); var myChart = new Chart(ctx, { type: "horizontalBar", // 水平棒グラフ data: { labels: ['90歳以上','85~89歳','80~84歳','75~79歳','70~74歳','65~69歳','60~64歳','55~59歳','50~54歳','45~49歳','40~44歳','35~39歳','30~34歳','25~29歳','20~24歳','15~19歳','10~14歳','5~9歳','0~4歳'], datasets: [ { label:'女',data: [13400,18358,23241,22544,23231,29351,25690,22067,20064,19011,21714,19305,16677,14028,12091,14741,14919,13973,13049], backgroundColor: "green" } ] }, options: { responsive: false, title: { display: true, text: '' }, scales: { xAxes: [{ stacked: true, }], yAxes: [{stacked: true }] }, } }); </script> </body> </html> これは、Y軸のラベル表示を真ん中に置きたいがため2個のcanvasを強引に並べています。 ちなみに、canvas分けないで一つだけにしてY軸を左端にした場合で試したところ。 "horizontalBar"の部分を type: "bar", options: { indexAxis: "y", }, に代えても 肝心の「xAxes」の部分をどう変えていいか分からないためそままにしておいたら、当然のごとく Invalid scale configuration for scale: xAxes Invalid scale configuration for scale: yAxes のエラーメッセージが出てグラフも左右でなく上下の状態となります。 コピペだけで既存のコードを利用している者として不勉強で申し訳ありませんがご教授お願いいたします。

  • chart.js4系で凡例をカスタマイズする方法

    今回、chart.jsの2系から4系に変更するにあたり下記の多重円のサンプルで以前から気になっていた系列を利用した凡例の■(以前は濃いグレー)を黒からそれぞれ任意の色に出来ないかと思い悩んでいましたが、米国のあるQ&Aサイトに載っていた方法(前に投稿しましたが削除済み)等試しましたがそこまでしなくても単にfontColorをreturn内で指定するだけで出来ました(下記コード)。 しかしこの方法でもボックス部分とテキストを含めた凡例全体の色が変わりました。今回はpinkで指定したところ、テキストの色がpinkでは見た目が鮮明とはいえません。やはり、テキストとボックス部分で別の色の出来ないかと思いまして、何か解決方法があればお教えください。 <script> const CHART_COLORS = {'赤': 'rgb(230,0,18)','プラム': 'rgb(221,160,221)','マゼンタ': 'rgb(228,0,127)','スカイブルー': 'rgb(160,216,239)','紫': 'rgb(146,7,131)','緑': 'rgb(0,153,68)','ゴールド': 'rgb(255, 215, 0)' }; const ctx = document.getElementById("myPieChart"); const myPieChart = new Chart(ctx, { type: 'pie', data: { labels: ['Jan','Feb','Mar','Apr','May','June'], // X軸のラベル datasets: [ { label: 'NY', data: [32, 59, 40, 42, 38, 25],backgroundColor: Object.values(CHART_COLORS), tension: 2,fill: false}, { label: 'LA', data: [52, 45, 38, 28, 59, 40],backgroundColor: Object.values(CHART_COLORS), tension: 2,fill: false}, { label: 'CHI', data: [65, 23, 48, 60, 62, 70],backgroundColor: Object.values(CHART_COLORS), tension: 2,fill: false} ] }, options: { responsive: false, // canvasサイズ自動設定機能を使わない。HTMLで指定したサイズに固定 plugins: { legend: { // 凡例 display: true, // 表示の有無 position: 'bottom', // 表示位置 labels: { generateLabels: function(chart) { return chart.data.datasets.map(function(datasets, i) { return { fontColor: 'pink', //凡例の色を指定 datasetIndex: i, text: datasets.label, fillStyle: datasets.backgroundColor, strokeStyle: datasets.borderColor, // 表示状態に連動して取り消し線表示 hidden: !chart.isDatasetVisible(i), }; }); } }, onClick: function(e, legendItem){ const index = legendItem.datasetIndex; const ci = this.chart; const meta = ci.getDatasetMeta(index); meta.hidden = meta.hidden === null ? !ci.data.datasets[index].hidden : null; ci.update(); } } } } }); </script> さらに欲を言えば「labels: ['Jan','Feb', 」等を使ったデフォルトの凡例も別位置に配置出来ないかと考えています。なお、デフォルト凡例と <button・・でで作った凡例の両方操作できる方法は、このサイトで以前(https://okwave.jp/qa/q9820330.html)教えてもらっています。 どうかよろしくお願いいたします。 また、同じような内容で投稿、削除を繰り返し行っていることお許しください。

  • chart.js4.2でカラー設定をする方法

    過去にこのサイトでchart.js2.9を使い複数グラフを表示する方法(https://okwave.jp/qa/q9834370.html)を教えてもらいましが、今回v.4.2にそれを適用するにあたりプラグインのカラー設定に代わる方法がないかと試行を繰り返し、素人のため無理筋の方法ですが下記のコードまで至りました。そこで、このお粗末なコードを適切なものに手直ししていただきたくお願い申し上げます。 <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>multiグラフ</title> </head> <body> <div class="row" style="width: 100%;" > <div class="chart1" style="float: left;width:300px; height:250px" > <canvas id="myChart1"></canvas></div> <div class="chart2" style="float: right;width:300px; height:250px"> <canvas id="myChart2"></canvas></div> <div class="chart3" style="bottom: 0;float: left;width:300px; height:250px"> <canvas id="myChart3"></canvas></div> <div class="chart4" style="bottom: 0;float: right;width:300px; height:250px"> <canvas id="myChart4"></canvas></div> </div> <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/4.2.1/chart.umd.js"></script> <script> function displayChart(canvasId, chartType, datasets, options) { var ctx = document.getElementById(canvasId); var myPieChart = new Chart(ctx, { type: chartType, data: { labels: ['1月', '2月', '3月', '4月', '5月', '6月', '7月'], // X軸のラベル datasets: datasets }, options: { plugins: { //responsive: false, title: { display: options.title.length > 0, // タイトルがあれば表示 text: options.title }, legend: { // 凡例 display: true, // 表示の有無 position: options.legendPosition, // 表示位置 labels: { usePointStyle: options.usePointStyle // 円の凡例スタイルを使うか } } } } }); } const color1 = ['red','green','skyblue']; const mycolor = ['rgb(221,160,221)','rgb(228,0,127)','rgb(160,216,239)','rgb(146,7,131)','rgb(0,153,68)','rgb(255, 215, 0)','rgb(0,158,150)']; const label1 = [ {label: '仙台',data: [320000, 590000, 400000, 420000, 380000, 250000, 420000],backgroundColor:mycolor}, {label: '札幌',data: [520000, 450000, 380000, 280000, 590000, 400000, 530000],backgroundColor:mycolor}, {label: '渋谷',data: [650000, 230000, 480000, 600000, 620000, 700000, 760000],backgroundColor:mycolor} ]; const datasets = [ {label: label1[0].label,data: label1[0].data,backgroundColor:color1[0]}, {label: label1[1].label,data: label1[1].data,backgroundColor:color1[1]}, {label: label1[2].label,data: label1[2].data,backgroundColor:color1[2]} ]; displayChart('myChart1', 'bar', datasets,{ title: '', usePointStyle: false, legendPosition: 'top', }); for (var i = 0; i < 3; i++) { displayChart("myChart".concat(i + 2), 'pie', [label1[i]], { title: label1[i].label, backgroundColor:mycolor, usePointStyle: true, legendPosition: 'left' }); } </script> </body> </html> 特にbackgroundColorの設定をoptionで設定出来ないかと思いましたが方法が分かりませんでしたのでこのようなコードをに成り果てました。 また、カラースキーム組み合わせは別の手段を使って作りコピペしているのですがこれも貧弱なものですので、使えるプラグインがあればご教授お願いいたします。

  • .net chartでの積層棒グラフの接続・系列線

    VB2010(.net framework4.0)で、.net chartコントロールを使用し、グラフをブラウザに表示するプログラムを作成しております。 作成するグラフの中に、積層棒グラフ(積み重ね棒グラフ)があり、その各系列を結ぶ線(接続線や系列線と呼ばれるもの)を描画したいのですが、.net chartコントロールには該当するプロパティが無い様に見受けられます。(Webで色々と探ってみましたが、マッチしたページが見つかりませんでした) 折線グラフを重ねることでそれっぽい形にはなるのですが、綺麗には描画できず、この質問に至っております。 「実はこのプロパティで実現できる」や、「こうやって折れ線で描画したら綺麗にできる」など、お知恵をお貸し頂ければと思います。 よろしくお願いします。

  • チャートコントロール(MSChart)のフォント設定

    VB6.0でチャートコントロール(MSChart)を使いグラフを描画する事が出来ました。グラフを格好良くしようと思い背景を暗めの色にした所、グラフの文字が見えにくくなったため、フォントの変更を試みました。 縦横スケールのフォントは何とか変更することが出来たのですが、凡例のフォント設定が見つかりません。 ご存知の方いらっしゃいましたらご教授頂けないでしょうか。

  • Javascriptのチャートライブラリを使って棒グラフなどを描画はで

    Javascriptのチャートライブラリを使って棒グラフなどを描画はできるのですが、その棒グラフをクリックして、詳細データにジャンプ(ドリルダウン)させたいと考えております。 こちらで検討しているライブラリはHighChartsというライブラリですが、ドリルダウンの機能をどのように実現できるかがわかりません。 HighChartsで実現できればよいのですが、できないようでしたら何かよいライブラリをご存知の方がいらっしゃれば教えていただけないでしょうか? よろしくお願いします。

  • エクセル2007のグラフについて教えて下さい。

    エクセル2007のグラフについて教えて下さい。 株価のローソク足チャートグラフとその日の出来高の棒グラフを一つのグラフスペースに表示させ印刷したいのですが、その方法が分かりません。 その為今は、チャートグラフと棒グラフを別々に作って上下に配置し、左右の幅を合わせ、エクセルシート上で印刷範囲を指定してA4横の大きさに合わせ印刷しています。 1年間の日足チャートなので、棒グラフで言えば約240本の棒があります。 そのため、1カ月毎に縦線を入れて見やすくしていますが、その縦線(上のチャートグラフと下の棒グラフの縦線)を合わせる必要もあり、なかなか面倒です。 何か上手い方法はありませんでしょうか? ご存知の方教えて下さい!

  • グラフの設定方法を教えて下さい

    株価グラフを、セル範囲に合わせて横に3個並べて表示させています。 同時に凡例非表示などの条件を設定していますが  1.ローソクの幅(太さ)を広くしたい  2.背景を着色したい この2つの設定が出来ません。何回か挑戦しましたがエラーの壁にはじき飛ばされて 困っています。是非、教えて下さい。 (Win7、エクセル2010) For I = 1 To 3 With ActiveSheet.ChartObjects.Add(Left:=Cells((I - 1) * 4 + 1).Left, _ Top:=Cells(3, 1).Top, Width:=xSize(2), Height:=ySize(2)) With .Chart .SetSourceData Source:=GFDB(4, I), PlotBy:=xlColumns .ChartType = xlStockOHLC '-------------株価グラフ .HasLegend = False '---------------------凡例非表示 .HasAxis(xlValue) = False '-------------Y軸(数値軸)非表示 .HasAxis(xlCategory) = False '---------X軸(項目軸)非表示 End With End With Next I

  • OpenOffice Calcで株価チャートの描画について

     3分足の株価データ(順に、時間,始値,高値,安値,終値,出来高) を使ってローソク足のチャートを描画させたく、何度試してもチャート の描画が出来ません。 縦軸(Y軸)を株価,横軸(X軸)を時間として描画する為にはどのよ うな設定などの操作をしなければいけないのかご存知の方がおられま したら何卒お教え下さいませ。 希望としてはローソク足に加え、出来高の棒グラフ+移動平均線は描画 させたいところです。 また見方が悪いのか、ヘルプでチャートの描画に関する詳しい説明が見 当たりません。 どこかCalcのグラフ描画に関して詳しく解説されているサイトがあ りましたら教えて頂けると助かります。 本家の掲示板の方も探してみましたが、同じような質問が見つかりませ んでした。 お手数でしょうが宜しくお願い致します。

専門家に質問してみよう