104 votes

Comment utiliser deux axes Y dans Chart.js v2 ?

J'essaie de créer un graphique linéaire avec deux ensembles de données, chacun ayant sa propre échelle/son propre axe Y (un à gauche, un à droite du graphique) en utilisant Chart.js.

Voici mon code ( jsfiddle ) :

var canvas = document.getElementById('chart');
new Chart(canvas, {
  type: 'line',
  data: {
    labels: [ '1', '2', '3', '4', '5' ],
    datasets: [
      {
        label: 'A',
        yAxesGroup: 'A',
        data: [ 100, 96, 84, 76, 69 ]
      },
      {
        label: 'B',
        yAxesGroup: 'B',
        data: [ 1, 1, 1, 1, 0 ]
      }
    ]
  },
  options: {
    yAxes: [
      {
        name: 'A',
        type: 'linear',
        position: 'left',
        scalePositionLeft: true
      },
      {
        name: 'B',
        type: 'linear',
        position: 'right',
        scalePositionLeft: false,
        min: 0,
        max: 1
      }
    ]
  }
});

Cependant, le deuxième axe n'est pas visible et le deuxième ensemble de données est toujours mis à l'échelle exactement comme le premier (0 à 100 au lieu de 0 à 1). Que dois-je modifier ?

225voto

Quince Points 9567

Pour ChartJs 2.x, seuls quelques changements doivent être effectués (il semble que vous ayez essayé de combiner les options 2.x avec les options multi-axes de mon fork ?)

  • Le site yAxes doit se trouver dans un scales objet
  • l'axe y est référencé par son identifiant et non par son nom.
  • Pour les échelons/taille de l'échelle, il suffit d'envelopper ces options dans un fichier ticks objet.
  • Pas besoin de scalePositionLeft ceci est couvert par position

Exemple :

var canvas = document.getElementById('chart');
new Chart(canvas, {
  type: 'line',
  data: {
    labels: ['1', '2', '3', '4', '5'],
    datasets: [{
      label: 'A',
      yAxisID: 'A',
      data: [100, 96, 84, 76, 69]
    }, {
      label: 'B',
      yAxisID: 'B',
      data: [1, 1, 1, 1, 0]
    }]
  },
  options: {
    scales: {
      yAxes: [{
        id: 'A',
        type: 'linear',
        position: 'left',
      }, {
        id: 'B',
        type: 'linear',
        position: 'right',
        ticks: {
          max: 1,
          min: 0
        }
      }]
    }
  }
});

exemple de violon

1 votes

Lorsque j'ouvre votre fiddle, les deux axes sont là, mais le deuxième ensemble de données ( B ) n'est toujours pas mis à l'échelle de l'axe de droite ( B ), pourquoi pas ?

4 votes

Désolé, c'est une erreur de frappe de ma part. yAxisID pas yAxesID

0 votes

@Quince Salut Quince mais comment appliquer deux types de graphiques différents (ligne et barre) avec votre code. Merci d'avance

21voto

Juanjo Martinez Points 182

La réponse acceptée ne fonctionne plus à partir de la version 3.5, et la cause est listée comme faisant partie des changements de rupture pour la version 3.X (Voir Guide de migration 3.x )

Le code mis à jour ci-dessous change le scales la propriété, de scales: {yScales: [...]} a scales: {[id]: {[options]}} et ajoute également fill: true, (La valeur par défaut a été modifiée dans la version 3.X pour devenir true ) y tension: 0.4 (L'exemple fourni précédemment présente des courbes lisses, et il semble qu'il s'agisse d'un changement "de rupture" non documenté).

var canvas = document.getElementById('myChart');
new Chart(canvas, {
    type: 'line',
    data: {
        labels: ['1', '2', '3', '4', '5'],
        datasets: [{
            label: 'A',
            yAxisID: 'A',
            data: [100, 96, 84, 76, 69],
            fill: true,
            tension: 0.4
        }, {
            label: 'B',
            yAxisID: 'B',
            data: [1, 1, 1, 1, 0],
            fill: true,
            tension: 0.4
        }]
    },
    options: {
        scales: {
            A: {
                type: 'linear',
                position: 'left',
            },
            B: {
                type: 'linear',
                position: 'right',
                ticks: {
                    max: 1,
                    min: 0
                }
            }
        }
    }
});

1 votes

Excellente réponse. @juanjo-martinez

0voto

Kanish Points 63

Cette solution fonctionne en react.

// "chart.js": "^2.9.4"
// "react-chartjs-2": "^2.11.1"

const lineChartData = {
  data: {
    labels: ['1', '2', '3', '4', '5', '6'],
    datasets: [
      {
        label: '# of Votes',
        data: [12, 19, 3, 5, 2, 3],
        fill: false,
        backgroundColor: 'rgb(255, 99, 132)',
        borderColor: 'rgba(255, 99, 132, 0.2)',
      },
      {
        label: '# of Votes',
        data: [19, 9, 2, 1, 1, 21],
        fill: false,
        backgroundColor: 'rgb(122, 99, 255)',
        borderColor: 'rgba(102, 99, 255, 0.2)',
      }
    ],
  },
  options: {
    scales: {
      yAxes: [
        {
          type: 'linear',
          display: true,
          position: 'left',
          ticks: {
            beginAtZero: true,
          },
        },
        {
          type: 'linear',
          display: true,
          position: 'left',
          ticks: {
            beginAtZero: true,
          },
        },
      ],
    },
  }
}

<Line 
   data={lineChartData.data} 
   options={lineChartData.options} 
   height={30} 
   width={80} 
   options={{ maintainAspectRatio: true }} 
/>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X