I have the following array of words and colors:
let dat = [{"word": "Lorum", "color": "red"},
{"word": "ipsum", "color": "green"},
{"word": "dolor", "color": "blue"},
{"word": "sit", "color": "purple"},
{"word": "amet", "color": "yellow"},
{"word": "consectetur", "color": "orange"},
{"word": "adipiscing", "color": "red"},
{"word": "elit", "color": "purple"},
{"word": "sed", "color": "blue"},
{"word": "eiusmod", "color": "blue"},
{"word": "tempor", "color": "green"}];
Using d3.js, I want to: (1) space these words evenly along an x-axis; and (2) wrap the words accordingly to a given width (move words to the next line).
I started a jsfiddle here, but the words for now all share x and y coordinates. I’d like it to appear as a sentence.
Advertisement
Answer
Added the below code that will use foriegnObject to append data like we do in HTML. Now with little manipulations, i am adding span tag with the required color attribute.
const width = 400,
height = 400;
let svg = d3.select("body").append("svg")
.attr("width", width)
.attr("height", height)
let dat = [{
"word": "Lorum",
"color": "red"
},
{
"word": "ipsum",
"color": "green"
},
{
"word": "dolor",
"color": "blue"
},
{
"word": "sit",
"color": "purple"
},
{
"word": "amet",
"color": "yellow"
},
{
"word": "consectetur",
"color": "orange"
},
{
"word": "adipiscing",
"color": "red"
},
{
"word": "elit",
"color": "purple"
},
{
"word": "sed",
"color": "blue"
},
{
"word": "eiusmod",
"color": "blue"
},
{
"word": "tempor",
"color": "green"
}
];
const a = svg.append("foreignObject")
.attr("width", 300)
.attr("height", 200)
.append("xhtml:body")
.append('div')
.attr('id', 'foriegnBody')
.style("font", "14px 'Helvetica Neue'")
for (const data of dat) {
const value = document.getElementById('foriegnBody').innerHTML;
if (value) {
a.html(`${value} <span style="color: ${data.color}">${data.word}</span>`)
} else {
a.html(`<span style="color: ${data.color}">${data.word}</span>`)
}
}<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>