如何将数据传递到 chartjs 标签中?
How can I pass the data into the chartjs label?
我已经有了这些图表和数据。我想要这样的标签:
但是,我的代码有问题,因为如果我动态传递标签,就会出现以下情况:
另外,我如何传递带有 selectedItem
的用户数量作为汽车、自行车、汽车或卡车。我只试过这个,但我必须输入准确的标签才能正确。我想要的是还根据标签动态传递数据集内的数据。任何帮助,将不胜感激。谢谢。
const d = data.filter((d) => d.items.selectedItem == "car");
console.log(d.length);
我也在 codesandbox 中重新创建了这个:https://codesandbox.io/s/bar-graph-9nr8u?file=/src/App.js
这些是我的代码:
export default function App() {
const data = [
{
birthdate: "Thu Aug 31 2000",
createdDate: { seconds: 1630377545, nanoseconds: 313000000 },
items: {
type2: false,
type1: true,
selectedItem: "car"
},
displayName: "Person1"
},
{
birthdate: "Thu Aug 31 2000",
createdDate: { seconds: 1630377545, nanoseconds: 313000000 },
items: {
type2: true,
type1: true,
selectedItem: "bikes"
},
displayName: "Person2"
},
{
birthdate: "Thu Aug 31 2000",
createdDate: { seconds: 1630377545, nanoseconds: 313000000 },
items: {
type2: true,
type1: true,
selectedItem: "car"
},
displayName: "Person3"
},
{
birthdate: "Thu Aug 31 2000",
createdDate: { seconds: 1630377545, nanoseconds: 313000000 },
items: {
type2: true,
type1: true,
selectedItem: "motor"
},
displayName: "Person4"
},
{
birthdate: "Thu Aug 31 2000",
createdDate: { seconds: 1630377545, nanoseconds: 313000000 },
items: {
type2: true,
type1: true,
selectedItem: "motor"
},
displayName: "Person5"
},
{
birthdate: "Thu Aug 31 2000",
createdDate: { seconds: 1630377545, nanoseconds: 313000000 },
items: {
type2: true,
type1: true,
selectedItem: "trucks"
},
displayName: "Person6"
},
{
birthdate: "Thu Aug 31 2000",
createdDate: { seconds: 1630377545, nanoseconds: 313000000 },
items: {
type2: true,
type1: true,
selectedItem: "bikes"
},
displayName: "Person7"
},
{
birthdate: "Thu Aug 31 2000",
createdDate: { seconds: 1630377545, nanoseconds: 313000000 },
items: {
type2: true,
type1: true,
selectedItem: "car"
},
displayName: "Person8"
}
];
const d = data.filter((d) => d.items.selectedItem == "car");
console.log(d.length);
let ar = [];
data.map((item) => {
ar.push(item.items.selectedItem);
});
return (
<div className="App">
<Pie
data={{
labels: ar,
datasets: [
{
data: [10, 20, 30, 40, 50],
backgroundColor: ["red", "yellow", "green", "blue", "pink"],
borderColor: ["rgba(255, 99, 132, 1)"],
borderWidth: 1
}
]
}}
height={400}
width={600}
options={{
maintainAspectRatio: false,
title: {
display: true,
text: "Selected",
fontSize: 20
},
legend: {
labels: {
fontSize: 25
}
}
}}
/>
</div>
);
}
您可以使用设置,
它避免重复值:
let ar = new Set();
data.map((item) => {
ar.add(item.items.selectedItem);
});
ar = Array.from(ar); //Convert Set to Array
编辑:
好的,为此我认为最好使用:
let ar = {};
for(let i=0; i<data.length; i++){
if(ar[data[i].items.selectedItem] === undefined)
ar[data[i].items.selectedItem] = 1;
else
ar[data[i].items.selectedItem]++;
}
let data_labels = Object.keys(ar);
let data_ = Object.keys(ar).map(key => ar[key]);
并替换:
data={{
labels: data_labels,
datasets: [
{
data: data_,
backgroundColor: ["red", "yellow", "green", "blue", "pink"],
borderColor: ["rgba(255, 99, 132, 1)"],
borderWidth: 1
}
]
}}
而对于 backgroundColor 数组,您需要检查 ar 的长度,并根据需要制作具有不同颜色的这种大小的数组。
我已经有了这些图表和数据。我想要这样的标签:
但是,我的代码有问题,因为如果我动态传递标签,就会出现以下情况:
另外,我如何传递带有 selectedItem
的用户数量作为汽车、自行车、汽车或卡车。我只试过这个,但我必须输入准确的标签才能正确。我想要的是还根据标签动态传递数据集内的数据。任何帮助,将不胜感激。谢谢。
const d = data.filter((d) => d.items.selectedItem == "car");
console.log(d.length);
我也在 codesandbox 中重新创建了这个:https://codesandbox.io/s/bar-graph-9nr8u?file=/src/App.js
这些是我的代码:
export default function App() {
const data = [
{
birthdate: "Thu Aug 31 2000",
createdDate: { seconds: 1630377545, nanoseconds: 313000000 },
items: {
type2: false,
type1: true,
selectedItem: "car"
},
displayName: "Person1"
},
{
birthdate: "Thu Aug 31 2000",
createdDate: { seconds: 1630377545, nanoseconds: 313000000 },
items: {
type2: true,
type1: true,
selectedItem: "bikes"
},
displayName: "Person2"
},
{
birthdate: "Thu Aug 31 2000",
createdDate: { seconds: 1630377545, nanoseconds: 313000000 },
items: {
type2: true,
type1: true,
selectedItem: "car"
},
displayName: "Person3"
},
{
birthdate: "Thu Aug 31 2000",
createdDate: { seconds: 1630377545, nanoseconds: 313000000 },
items: {
type2: true,
type1: true,
selectedItem: "motor"
},
displayName: "Person4"
},
{
birthdate: "Thu Aug 31 2000",
createdDate: { seconds: 1630377545, nanoseconds: 313000000 },
items: {
type2: true,
type1: true,
selectedItem: "motor"
},
displayName: "Person5"
},
{
birthdate: "Thu Aug 31 2000",
createdDate: { seconds: 1630377545, nanoseconds: 313000000 },
items: {
type2: true,
type1: true,
selectedItem: "trucks"
},
displayName: "Person6"
},
{
birthdate: "Thu Aug 31 2000",
createdDate: { seconds: 1630377545, nanoseconds: 313000000 },
items: {
type2: true,
type1: true,
selectedItem: "bikes"
},
displayName: "Person7"
},
{
birthdate: "Thu Aug 31 2000",
createdDate: { seconds: 1630377545, nanoseconds: 313000000 },
items: {
type2: true,
type1: true,
selectedItem: "car"
},
displayName: "Person8"
}
];
const d = data.filter((d) => d.items.selectedItem == "car");
console.log(d.length);
let ar = [];
data.map((item) => {
ar.push(item.items.selectedItem);
});
return (
<div className="App">
<Pie
data={{
labels: ar,
datasets: [
{
data: [10, 20, 30, 40, 50],
backgroundColor: ["red", "yellow", "green", "blue", "pink"],
borderColor: ["rgba(255, 99, 132, 1)"],
borderWidth: 1
}
]
}}
height={400}
width={600}
options={{
maintainAspectRatio: false,
title: {
display: true,
text: "Selected",
fontSize: 20
},
legend: {
labels: {
fontSize: 25
}
}
}}
/>
</div>
);
}
您可以使用设置, 它避免重复值:
let ar = new Set();
data.map((item) => {
ar.add(item.items.selectedItem);
});
ar = Array.from(ar); //Convert Set to Array
编辑: 好的,为此我认为最好使用:
let ar = {};
for(let i=0; i<data.length; i++){
if(ar[data[i].items.selectedItem] === undefined)
ar[data[i].items.selectedItem] = 1;
else
ar[data[i].items.selectedItem]++;
}
let data_labels = Object.keys(ar);
let data_ = Object.keys(ar).map(key => ar[key]);
并替换:
data={{
labels: data_labels,
datasets: [
{
data: data_,
backgroundColor: ["red", "yellow", "green", "blue", "pink"],
borderColor: ["rgba(255, 99, 132, 1)"],
borderWidth: 1
}
]
}}
而对于 backgroundColor 数组,您需要检查 ar 的长度,并根据需要制作具有不同颜色的这种大小的数组。