- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在我的项目中使用react-chartjs-2,我正在用它创建一个分组堆积条形图,为了删除重复的标签,我创建了一个自定义generateLabels
函数,但是问题是自定义 generateLabels
功能是,当我单击图表图例(即 Cinema)时,它仅更新右侧(较高)图表,而左侧(较小)图表不会更新。我知道有 onClick
函数,但我找不到如何使用它:
onClick: (e, legendItem) => {
let i = legendItem.datasetIndex;
let ci = chRef.current.chartInstance;
}
<Bar data={data} width={100} height={50} options={options} ref={chRef} />
有什么解决办法吗?我希望更新两个图表(更高和更小)。我突出显示了此图中更新的条形图:
这是我的代码
import React, { useRef } from "react";
import { Bar } from "react-chartjs-2";
const mocked_data = {
labels: ["Brand 1", "Brand 2", "Brand 3", "Brand 4", "Brand 5"],
spend_per_channel: {
spends: [
{
label: "Cinema",
data: [56, 23, 55, 56, 57]
},
{
label: "Retails",
data: [22, 17, 32, 47, 62]
},
{
label: "Fashion",
data: [46, 73, 25, 76, 27]
},
{
label: "Oil",
data: [26, 40, 80, 50, 62]
},
{
label: "Gas",
data: [36, 13, 35, 46, 67]
}
],
sales: [
{
label: "Cinema",
data: [156, 123, 155, 56, 157]
},
{
label: "Retail",
data: [122, 117, 132, 147, 162]
},
{
label: "Fashion",
data: [416, 173, 125, 176, 127]
},
{
label: "Oil",
data: [126, 135, 180, 100, 86]
},
{
label: "Gas",
data: [136, 113, 135, 146, 167]
}
]
}
};
const MyChart = () => {
const chRef = useRef(null);
const CHART_COLORS = [
"#e35b2c",
"#e77235",
"#eb8a40",
"#f0a04b",
"#f5b858",
"#f9cf63",
"#fde76e",
"#fced86",
"#ffffb7",
"#fefeeb"
];
const spendsdata = mocked_data.spend_per_channel.spends.map(
(spend, index) => {
return {
label: spend.label,
backgroundColor: CHART_COLORS[index],
data: spend.data,
stack: 1
};
}
);
const salesdata = mocked_data.spend_per_channel.sales.map((sale, index) => {
return {
label: sale.label,
backgroundColor: CHART_COLORS[index],
data: sale.data,
stack: 2
};
});
const newdataset = [spendsdata, salesdata];
const spnedperchanneldata = newdataset.flat();
const data = {
labels: ["Brand 1", "Brand 2", "Brand 3", "Brand 4", "Brand 5"],
datasets: spnedperchanneldata
};
const options = {
legend: {
position: "bottom",
labels: {
generateLabels: function(chart) {
return Chart.defaults.global.legend.labels.generateLabels
.apply(this, [chart])
.filter(function(item, i) {
return i > 4;
});
},
boxWidth: 10,
usePointStyle: true
},
onClick: (e, legendItem) => {
let i = legendItem.datasetIndex;
let ci = chRef.current.chartInstance;
}
}
};
return (
<>
<Bar data={data} width={100} height={50} options={options} ref={chRef} />
</>
);
};
export default MyChart;
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
您可以在这个codesandbox demo中查看现场演示
请问有什么帮助吗?
最佳答案
您必须使用状态变量来保存图表数据,并单击图例修改状态数据并将新数据发送到条形图工作码link
import React from "react";
import { Bar } from "react-chartjs-2";
const mocked_data = {
labels: ["Brand 1", "Brand 2", "Brand 3", "Brand 4", "Brand 5"],
spend_per_channel: {
spends: [
{
label: "Cinema",
data: [56, 23, 55, 56, 57]
},
{
label: "Retails",
data: [22, 17, 32, 47, 62]
},
{
label: "Fashion",
data: [46, 73, 25, 76, 27]
},
{
label: "Oil",
data: [26, 40, 80, 50, 62]
},
{
label: "Gas",
data: [36, 13, 35, 46, 67]
}
],
sales: [
{
label: "Cinema",
data: [156, 123, 155, 56, 157]
},
{
label: "Retail",
data: [122, 117, 132, 147, 162]
},
{
label: "Fashion",
data: [416, 173, 125, 176, 127]
},
{
label: "Oil",
data: [126, 135, 180, 100, 86]
},
{
label: "Gas",
data: [136, 113, 135, 146, 167]
}
]
}
};
const MyChart = () => {
const CHART_COLORS = [
"#e35b2c",
"#e77235",
"#eb8a40",
"#f0a04b",
"#f5b858",
"#f9cf63",
"#fde76e",
"#fced86",
"#ffffb7",
"#fefeeb"
];
const spendsdata = mocked_data.spend_per_channel.spends.map(
(spend, index) => {
return {
label: spend.label,
backgroundColor: CHART_COLORS[index],
data: spend.data,
hidden: false,
stack: 1
};
}
);
const salesdata = mocked_data.spend_per_channel.sales.map((sale, index) => {
return {
label: sale.label,
backgroundColor: CHART_COLORS[index],
data: sale.data,
hidden: false,
stack: 2
};
});
const newdataset = [spendsdata, salesdata];
const spnedperchanneldata = newdataset.flat();
const [data, setData] = React.useState(spnedperchanneldata);
const options = {
legend: {
position: "bottom",
labels: {
generateLabels: function(chart) {
return Chart.defaults.global.legend.labels.generateLabels
.apply(this, [chart])
.filter(function(item, i) {
return i > 4;
});
},
boxWidth: 10,
usePointStyle: true
},
onClick: (e, legend) => {
onclick(legend);
}
}
};
const onclick = React.useCallback(
legend => {
let newData = data.map(item => {
if (item.label === legend.text) item.hidden = !item.hidden;
return item;
});
setData(newData);
},
[data, setData]
);
return (
<>
<Bar
data={{
labels: ["Brand 1", "Brand 2", "Brand 3", "Brand 4", "Brand 5"],
datasets: data
}}
width={100}
height={50}
options={options}
/>
</>
);
};
export default MyChart;
关于javascript - 如何过滤react-chartjs-2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59621581/
有没有办法在 vue-chartjs 中制作带圆角的条形图?我在谷歌上搜索了一下,发现我们可以使用此 url 中给出的渲染条的实现来扩展条形图 - How to put rounded corners
我想通过提供两个数组来创建多条垂直线,第一个称为marketing,其中包含诸如“2017-09-21”等日期和一个数组称为 amount,仅包含数字。 我使用 ChartJS 创建了折线图。最终结果
(对不起我的英语)我将 chartjs-plugin-streaming 用于实时 chartjs,我想使用 chartjs-plugin-zoom。 但是缩放不起作用。 当我测试缩放时,出现缩放区域
我使用 angualr2-chartjs 来显示图表。我的问题是当我动态更改选项时图表更新只有一次。在控制台中,我看到一切都很好,但在 View 中我看不到变化。我使用了 chartjs-plugin
我正在尝试创建类似于 www.chartjs.org 顶部的内容其中有一个随机移动的背景条形图。我发现了另一个类似的question ,但是它似乎不起作用。当我在下面添加时,它不会添加除 400x40
感谢任何提示和/或帮助!我在这里碰壁试图让图表呈现。我已经恢复到测试一个非常简单的方法(下面的代码),但我仍然收到以下错误: 类型错误:无法读取未定义的属性(读取“ map ”) 我可以记录从 use
chartjs-plugin-zoom是 Chart.js 的缩放和平移插件 您可以调用 chart.resetZoom() 以编程方式将缩放重置为默认状态。参见 this example on js
我正在尝试将 Chart.js 与 Vue.js 一起使用,这就是我得到的编译结果,但我没有在 GUI 上看到任何显示。 这是我的文件 DonutChart.vue: // NOT SURE IF
好的,所以我正在尝试通过 VueJS 创建一个 ChartJS 实例,以便我可以通过组件内的 AJAX 请求轻松更新其数据。 基本上它可以工作,创建了 ChartJS 实例,但它是空的,高度和宽度为
我想从 chartjs-chart-treemap 添加树状图到我现有的使用 react-chartjs-2 的项目中. 我到目前为止尝试过: import ChartComponent from '
是否可以定义具有多级别/类别轴的条形图? 例如,我想显示地区/省类别,如下 Excel 图表所示: 我找到了this使用多个 xAxes 的示例。 xAxes:[ { id:'xA
我正在使用 chart.js (V2) 尝试构建一个条形图,用户无需将鼠标悬停在任何地方或点击任何地方即可获得更多信息。我提供了两个示例,说明我希望如何编辑我的图表。 Two edited versi
我想使用 Chartjs(chartjs.org) 作为我的图表工具以及使用 TypeScript 的 AngularJS。我已经从 GitHub 安装了 DefinitelyTyped for Ch
我正在使用 chartjs-plugin-datalabels,并且在大图表中显示较小的数据集时值重叠 这是 chartjs-data-plugin 配置 options: { plu
var yLabels = { 1 : 'New', 2 : 'Learning Phase', 3
我正在创建图表以使用图表 js 呈现一些数据。 const data = { labels: ["1 Dec", "8 Dec", "16 Dec", "31 Dec"], dat
我正在尝试将其他数据插入圆环图中。 Controller 将这样的数组传递给 View : [ 0 => array:3 [ "profit" => 20 "sex" => arr
将百分比值添加到图例标签的最简单方法是什么? 我相信它会使用 generateLabels: function (chart) {},谁能提供一个干净的例子? 最佳答案 似乎没有任何本地方式来显示百分
我已经多次看到这个问题,但我找不到适合我的解决方案。 我将一个 Django 变量传递给 Chartjs 进行绘图,所有的个位数都是正确的,但它将两位数变成了一个。像 11 是 1,1...23 是
我正在尝试使用 chartjs 数据标签插件获取每个条上的值。 所以在条形“a”上方 a 想看到数字 30 及以上或在条形“b”内我想看到数字 50。 但它根本没有显示任何值。 任何人都可以帮助并告诉
我是一名优秀的程序员,十分优秀!