当前位置: 首页 > 知识库问答 >
问题:

如何在Chart.jsv2中使用两个Y轴?

阎咏思
2023-03-14

我正在尝试使用.js Chart 创建一个包含两个数据集的折线图,每个数据集都有自己的 Y 刻度/轴(一个在图形的左侧,一个在图形的右侧)。

这是我的代码(

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
      }
    ]
  }
});

但是,第二个轴不可见,第二个数据集仍然与第一个完全一样缩放(从0到100而不是从0到1)。我需要更改什么?

共有3个答案

谈禄
2023-03-14

此解决方案正在 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 }} 
/>
淳于昊然
2023-03-14

从 3.5 开始,已接受的答案不再有效,并且原因被列为 3.X 重大更改的一部分(请参阅 3.x 迁移指南)

下面的更新代码更改了 scales 属性,从比例: {yScales: [...]}比例: {[id]: {[options]}} ,并且还添加了填充: true, (在 3.X 时从默认更改为 true) 和张力: 0.4 (之前提供的示例确实有平滑的曲线,并且似乎是一个未记录的“中断”更改)

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
                }
            }
        }
    }
});
祁建业
2023-03-14

对于ChartJs 2.x,只需要做几个更改(看起来您已经尝试将2.x选项与my fork中的多轴选项结合起来了?),

  • yAxes字段需要位于缩放object
  • yAxis由id而不是名称引用
  • 对于缩放步长/大小,只需将这些选项包装在<code>ticks<code>对象中
  • 不需要scalePositionLeft这由position

例子:

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
        }
      }]
    }
  }
});

小提琴示例

 类似资料:
  • 问题内容: 几年前我有这个面试问题,但是我还没有找到答案。 做无限循环的x和y应该是什么? 我们试着用,, VS 。 问题答案: 您需要两个可比较,具有相同值但代表不同实例的变量,例如: 和都为true,因为取消了装箱,但是实例相等性为false。 请注意,它也可以与一起使用,并且任何值(不仅是0)都可以使用。 您还可以使用JVM的复杂性-它们通常仅缓存最多127个整数,因此也可以使用: (但是1

  • 问题内容: 我正在使用matplotlib.pyplot模块绘制直方图,并且想知道如何强制y轴标签仅显示整数(例如0、1、2、3等)而不显示小数(例如0.,0.5) ,1,,1.5、2等)。 我正在查看指导说明,怀疑答案在matplotlib.pyplot.ylim周围,但是到目前为止,我只能找到设置最小和最大y轴值的东西。 问题答案: 如果你有y数据 您可以使用此数据的最大值和最小值来创建此范围

  • 问题内容: 我需要使用Cookie在两个不同的域之间共享SSO信息,这可以在PHP中完成吗? 问题答案: 在两个域上,放置从另一个域提取的图像或其他Web元素。使用URL通知另一个域用户X在域A上,并让域B将该用户ID与该用户在其系统上关联。 正确执行起来有点复杂,但是如果您认为通过它会很好地进行。 Vinko在评论中(感谢!)指出,我不认为您了解所涉及的安全风险是理所当然的。如果此信息对任何人都

  • 我在映射中需要两个覆盖项。我使用了以下代码来获取覆盖项

  • 我有一个包含一个活动和两个片段的应用程序,在第一个片段中,我应该能够将数据插入数据库,在第二个片段中,我应该能够在一个RecyclerView中看到添加的项目。 所以我已经创建了数据库、我的RecyclerView适配器和ViewModel, 我是否应该在活动中初始化ViewModel,并以某种方式从片段中调用它来使用insert? 我是否应该在两个片段中初始化viewmodel两次? 我的代码如