Bar chart unable to execute transition after button clicked





.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ height:90px;width:728px;box-sizing:border-box;
}







0















I am drawing a simple bar chart with two buttons to toggle the chart based on two datasets.



However, the chart does not do the transition when I click on the buttons.



The data is loaded from a csv file.



party,ge14,latest
PKR,47,50
DAP,42,42
Umno,54,38
GPS,0,19
PAS,18,18
Bersatu,13,16
Independent,3,12
Amanah,11,11
Warisan,8,9
GBS,0,3
Other BN parties,25,2
Upko,0,1


Source code



d3.csv('data/seatcount.csv')
.then(data => {

const width = 900,
height = 700,
margin = 25;

const svg = d3.select('#bar')
.append('svg')
.attr('width', width)
.attr('height', height)
.attr('viewBox', '0 0 ' + Math.min(width, height) + ' ' + Math.min(width, height))
.attr('preserveAspectRatio', 'xMinYMin')
.append('g');

// define scale
const xScale = d3.scaleBand()
.domain(data.map(d => d.party))
.range([margin, (width - margin)])
.padding(.2);

const yScale = d3.scaleLinear()
.domain([0, 60])
.range([(height - margin), margin]);

// define axes
const xAxis = d3.axisBottom(xScale)
.ticks(12)

const yAxis = d3.axisLeft(yScale)
.ticks(6);

svg.append('g')
.attr('transform', `translate(0, ${height - margin})`)
.call(xAxis)
.style('font-size', '.7em');

svg.append('g')
.attr('transform', `translate(${margin}, 0)`)
.call(yAxis)
.style('font-size', '.7em');

// plot columns
let cols = svg.selectAll('.col')
.data(data)
.enter();

cols.append('rect')
.attr('x', (d) => xScale(d.party))
.attr('y', (height - margin))
.attr('width', xScale.bandwidth())
.attr('height', 0)
.style('fill', '#dddddd')
.transition()
.delay((d, i) => 100 * i)
.attr('y', (d) => {
return yScale(d.latest)
})
.attr('height', (d) => (height - margin - yScale(d.latest)));

// label the bars

cols.append('text')
.attr('x', d => {
return (xScale(d.party) + xScale.bandwidth() / 2);
})
.attr('y', d => {
return (yScale(d.latest) + 13);
})
.style('fill', '#333333')
.attr('text-anchor', 'middle')
.text(d => d.latest)
.style('font-size', '.8em')
.style('visibility', 'hidden')
.transition()
.delay((d, i) => 100 * i)
.style('visibility', 'visible');

function moveCols(data, period) {

cols.data(data)
.transition()
.attr('x', function(d) {
return xScale(d.party);
})
.attr('y', function(d) {
console.log(yScale(d[period]));
return yScale(d[period]);
})
.attr('width', xScale.bandwidth())
.attr('height', function(d) {
return (height - margin - yScale(d[period]));
});

cols.selectAll('text')
.remove();

cols.append('text')
.attr('x', d => {
return (xScale(d.party) + xScale.bandwidth() / 2);
})
.attr('y', d => {
return (yScale(d[period]) + 13);
})
.style('fill', '#333333')
.attr('text-anchor', 'middle')
.text(d => d[period])
.style('font-size', '.8em')
.style('visibility', (d, i) => {
// console.log(d[period]);
if (d[period] <= 0) {
return 'hidden';
} else {
return 'visible';
}
});
}

d3.select('#latest').on('click', () => {
moveCols(data, 'latest')
});

d3.select('#ge14').on('click', () => {
moveCols(data, 'ge14')
})

});


In the end, once I have clicked on #latest or #ge14, only the label of the bars changed, but not the bars themselves.



And there are errors showed in the console.



Uncaught TypeError: this.getAttribute is not a function
at ot.<anonymous> (d3.v5.min.js:2)
at ot.e (d3.v5.min.js:2)
at o (d3.v5.min.js:2)
at d3.v5.min.js:2
at fr (d3.v5.min.js:2)
at cr (d3.v5.min.js:2)









share|improve this question

























  • use the margin in a better way, see examples for d3 charts made by Mike. Your use of cols is completely wrong, read the d3-select docs.

    – rioV8
    Jan 4 at 10:35













  • Thank you but I am quite new to D3. May I know what's wrong with the cols?

    – vertion
    Jan 5 at 4:41


















0















I am drawing a simple bar chart with two buttons to toggle the chart based on two datasets.



However, the chart does not do the transition when I click on the buttons.



The data is loaded from a csv file.



party,ge14,latest
PKR,47,50
DAP,42,42
Umno,54,38
GPS,0,19
PAS,18,18
Bersatu,13,16
Independent,3,12
Amanah,11,11
Warisan,8,9
GBS,0,3
Other BN parties,25,2
Upko,0,1


Source code



d3.csv('data/seatcount.csv')
.then(data => {

const width = 900,
height = 700,
margin = 25;

const svg = d3.select('#bar')
.append('svg')
.attr('width', width)
.attr('height', height)
.attr('viewBox', '0 0 ' + Math.min(width, height) + ' ' + Math.min(width, height))
.attr('preserveAspectRatio', 'xMinYMin')
.append('g');

// define scale
const xScale = d3.scaleBand()
.domain(data.map(d => d.party))
.range([margin, (width - margin)])
.padding(.2);

const yScale = d3.scaleLinear()
.domain([0, 60])
.range([(height - margin), margin]);

// define axes
const xAxis = d3.axisBottom(xScale)
.ticks(12)

const yAxis = d3.axisLeft(yScale)
.ticks(6);

svg.append('g')
.attr('transform', `translate(0, ${height - margin})`)
.call(xAxis)
.style('font-size', '.7em');

svg.append('g')
.attr('transform', `translate(${margin}, 0)`)
.call(yAxis)
.style('font-size', '.7em');

// plot columns
let cols = svg.selectAll('.col')
.data(data)
.enter();

cols.append('rect')
.attr('x', (d) => xScale(d.party))
.attr('y', (height - margin))
.attr('width', xScale.bandwidth())
.attr('height', 0)
.style('fill', '#dddddd')
.transition()
.delay((d, i) => 100 * i)
.attr('y', (d) => {
return yScale(d.latest)
})
.attr('height', (d) => (height - margin - yScale(d.latest)));

// label the bars

cols.append('text')
.attr('x', d => {
return (xScale(d.party) + xScale.bandwidth() / 2);
})
.attr('y', d => {
return (yScale(d.latest) + 13);
})
.style('fill', '#333333')
.attr('text-anchor', 'middle')
.text(d => d.latest)
.style('font-size', '.8em')
.style('visibility', 'hidden')
.transition()
.delay((d, i) => 100 * i)
.style('visibility', 'visible');

function moveCols(data, period) {

cols.data(data)
.transition()
.attr('x', function(d) {
return xScale(d.party);
})
.attr('y', function(d) {
console.log(yScale(d[period]));
return yScale(d[period]);
})
.attr('width', xScale.bandwidth())
.attr('height', function(d) {
return (height - margin - yScale(d[period]));
});

cols.selectAll('text')
.remove();

cols.append('text')
.attr('x', d => {
return (xScale(d.party) + xScale.bandwidth() / 2);
})
.attr('y', d => {
return (yScale(d[period]) + 13);
})
.style('fill', '#333333')
.attr('text-anchor', 'middle')
.text(d => d[period])
.style('font-size', '.8em')
.style('visibility', (d, i) => {
// console.log(d[period]);
if (d[period] <= 0) {
return 'hidden';
} else {
return 'visible';
}
});
}

d3.select('#latest').on('click', () => {
moveCols(data, 'latest')
});

d3.select('#ge14').on('click', () => {
moveCols(data, 'ge14')
})

});


In the end, once I have clicked on #latest or #ge14, only the label of the bars changed, but not the bars themselves.



And there are errors showed in the console.



Uncaught TypeError: this.getAttribute is not a function
at ot.<anonymous> (d3.v5.min.js:2)
at ot.e (d3.v5.min.js:2)
at o (d3.v5.min.js:2)
at d3.v5.min.js:2
at fr (d3.v5.min.js:2)
at cr (d3.v5.min.js:2)









share|improve this question

























  • use the margin in a better way, see examples for d3 charts made by Mike. Your use of cols is completely wrong, read the d3-select docs.

    – rioV8
    Jan 4 at 10:35













  • Thank you but I am quite new to D3. May I know what's wrong with the cols?

    – vertion
    Jan 5 at 4:41














0












0








0








I am drawing a simple bar chart with two buttons to toggle the chart based on two datasets.



However, the chart does not do the transition when I click on the buttons.



The data is loaded from a csv file.



party,ge14,latest
PKR,47,50
DAP,42,42
Umno,54,38
GPS,0,19
PAS,18,18
Bersatu,13,16
Independent,3,12
Amanah,11,11
Warisan,8,9
GBS,0,3
Other BN parties,25,2
Upko,0,1


Source code



d3.csv('data/seatcount.csv')
.then(data => {

const width = 900,
height = 700,
margin = 25;

const svg = d3.select('#bar')
.append('svg')
.attr('width', width)
.attr('height', height)
.attr('viewBox', '0 0 ' + Math.min(width, height) + ' ' + Math.min(width, height))
.attr('preserveAspectRatio', 'xMinYMin')
.append('g');

// define scale
const xScale = d3.scaleBand()
.domain(data.map(d => d.party))
.range([margin, (width - margin)])
.padding(.2);

const yScale = d3.scaleLinear()
.domain([0, 60])
.range([(height - margin), margin]);

// define axes
const xAxis = d3.axisBottom(xScale)
.ticks(12)

const yAxis = d3.axisLeft(yScale)
.ticks(6);

svg.append('g')
.attr('transform', `translate(0, ${height - margin})`)
.call(xAxis)
.style('font-size', '.7em');

svg.append('g')
.attr('transform', `translate(${margin}, 0)`)
.call(yAxis)
.style('font-size', '.7em');

// plot columns
let cols = svg.selectAll('.col')
.data(data)
.enter();

cols.append('rect')
.attr('x', (d) => xScale(d.party))
.attr('y', (height - margin))
.attr('width', xScale.bandwidth())
.attr('height', 0)
.style('fill', '#dddddd')
.transition()
.delay((d, i) => 100 * i)
.attr('y', (d) => {
return yScale(d.latest)
})
.attr('height', (d) => (height - margin - yScale(d.latest)));

// label the bars

cols.append('text')
.attr('x', d => {
return (xScale(d.party) + xScale.bandwidth() / 2);
})
.attr('y', d => {
return (yScale(d.latest) + 13);
})
.style('fill', '#333333')
.attr('text-anchor', 'middle')
.text(d => d.latest)
.style('font-size', '.8em')
.style('visibility', 'hidden')
.transition()
.delay((d, i) => 100 * i)
.style('visibility', 'visible');

function moveCols(data, period) {

cols.data(data)
.transition()
.attr('x', function(d) {
return xScale(d.party);
})
.attr('y', function(d) {
console.log(yScale(d[period]));
return yScale(d[period]);
})
.attr('width', xScale.bandwidth())
.attr('height', function(d) {
return (height - margin - yScale(d[period]));
});

cols.selectAll('text')
.remove();

cols.append('text')
.attr('x', d => {
return (xScale(d.party) + xScale.bandwidth() / 2);
})
.attr('y', d => {
return (yScale(d[period]) + 13);
})
.style('fill', '#333333')
.attr('text-anchor', 'middle')
.text(d => d[period])
.style('font-size', '.8em')
.style('visibility', (d, i) => {
// console.log(d[period]);
if (d[period] <= 0) {
return 'hidden';
} else {
return 'visible';
}
});
}

d3.select('#latest').on('click', () => {
moveCols(data, 'latest')
});

d3.select('#ge14').on('click', () => {
moveCols(data, 'ge14')
})

});


In the end, once I have clicked on #latest or #ge14, only the label of the bars changed, but not the bars themselves.



And there are errors showed in the console.



Uncaught TypeError: this.getAttribute is not a function
at ot.<anonymous> (d3.v5.min.js:2)
at ot.e (d3.v5.min.js:2)
at o (d3.v5.min.js:2)
at d3.v5.min.js:2
at fr (d3.v5.min.js:2)
at cr (d3.v5.min.js:2)









share|improve this question
















I am drawing a simple bar chart with two buttons to toggle the chart based on two datasets.



However, the chart does not do the transition when I click on the buttons.



The data is loaded from a csv file.



party,ge14,latest
PKR,47,50
DAP,42,42
Umno,54,38
GPS,0,19
PAS,18,18
Bersatu,13,16
Independent,3,12
Amanah,11,11
Warisan,8,9
GBS,0,3
Other BN parties,25,2
Upko,0,1


Source code



d3.csv('data/seatcount.csv')
.then(data => {

const width = 900,
height = 700,
margin = 25;

const svg = d3.select('#bar')
.append('svg')
.attr('width', width)
.attr('height', height)
.attr('viewBox', '0 0 ' + Math.min(width, height) + ' ' + Math.min(width, height))
.attr('preserveAspectRatio', 'xMinYMin')
.append('g');

// define scale
const xScale = d3.scaleBand()
.domain(data.map(d => d.party))
.range([margin, (width - margin)])
.padding(.2);

const yScale = d3.scaleLinear()
.domain([0, 60])
.range([(height - margin), margin]);

// define axes
const xAxis = d3.axisBottom(xScale)
.ticks(12)

const yAxis = d3.axisLeft(yScale)
.ticks(6);

svg.append('g')
.attr('transform', `translate(0, ${height - margin})`)
.call(xAxis)
.style('font-size', '.7em');

svg.append('g')
.attr('transform', `translate(${margin}, 0)`)
.call(yAxis)
.style('font-size', '.7em');

// plot columns
let cols = svg.selectAll('.col')
.data(data)
.enter();

cols.append('rect')
.attr('x', (d) => xScale(d.party))
.attr('y', (height - margin))
.attr('width', xScale.bandwidth())
.attr('height', 0)
.style('fill', '#dddddd')
.transition()
.delay((d, i) => 100 * i)
.attr('y', (d) => {
return yScale(d.latest)
})
.attr('height', (d) => (height - margin - yScale(d.latest)));

// label the bars

cols.append('text')
.attr('x', d => {
return (xScale(d.party) + xScale.bandwidth() / 2);
})
.attr('y', d => {
return (yScale(d.latest) + 13);
})
.style('fill', '#333333')
.attr('text-anchor', 'middle')
.text(d => d.latest)
.style('font-size', '.8em')
.style('visibility', 'hidden')
.transition()
.delay((d, i) => 100 * i)
.style('visibility', 'visible');

function moveCols(data, period) {

cols.data(data)
.transition()
.attr('x', function(d) {
return xScale(d.party);
})
.attr('y', function(d) {
console.log(yScale(d[period]));
return yScale(d[period]);
})
.attr('width', xScale.bandwidth())
.attr('height', function(d) {
return (height - margin - yScale(d[period]));
});

cols.selectAll('text')
.remove();

cols.append('text')
.attr('x', d => {
return (xScale(d.party) + xScale.bandwidth() / 2);
})
.attr('y', d => {
return (yScale(d[period]) + 13);
})
.style('fill', '#333333')
.attr('text-anchor', 'middle')
.text(d => d[period])
.style('font-size', '.8em')
.style('visibility', (d, i) => {
// console.log(d[period]);
if (d[period] <= 0) {
return 'hidden';
} else {
return 'visible';
}
});
}

d3.select('#latest').on('click', () => {
moveCols(data, 'latest')
});

d3.select('#ge14').on('click', () => {
moveCols(data, 'ge14')
})

});


In the end, once I have clicked on #latest or #ge14, only the label of the bars changed, but not the bars themselves.



And there are errors showed in the console.



Uncaught TypeError: this.getAttribute is not a function
at ot.<anonymous> (d3.v5.min.js:2)
at ot.e (d3.v5.min.js:2)
at o (d3.v5.min.js:2)
at d3.v5.min.js:2
at fr (d3.v5.min.js:2)
at cr (d3.v5.min.js:2)






d3.js






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Jan 4 at 10:33









rioV8

4,5442312




4,5442312










asked Jan 4 at 8:44









vertionvertion

63




63













  • use the margin in a better way, see examples for d3 charts made by Mike. Your use of cols is completely wrong, read the d3-select docs.

    – rioV8
    Jan 4 at 10:35













  • Thank you but I am quite new to D3. May I know what's wrong with the cols?

    – vertion
    Jan 5 at 4:41



















  • use the margin in a better way, see examples for d3 charts made by Mike. Your use of cols is completely wrong, read the d3-select docs.

    – rioV8
    Jan 4 at 10:35













  • Thank you but I am quite new to D3. May I know what's wrong with the cols?

    – vertion
    Jan 5 at 4:41

















use the margin in a better way, see examples for d3 charts made by Mike. Your use of cols is completely wrong, read the d3-select docs.

– rioV8
Jan 4 at 10:35







use the margin in a better way, see examples for d3 charts made by Mike. Your use of cols is completely wrong, read the d3-select docs.

– rioV8
Jan 4 at 10:35















Thank you but I am quite new to D3. May I know what's wrong with the cols?

– vertion
Jan 5 at 4:41





Thank you but I am quite new to D3. May I know what's wrong with the cols?

– vertion
Jan 5 at 4:41












1 Answer
1






active

oldest

votes


















0














I have reformatted my code and it works! I got no complaint.



const margin = { top: 20, right: 20, bottom: 50, left: 40 },
width = 900
height = 700

const svg = d3.select('#bar')
.append('svg')
.attr('width', width)
.attr('height', height)
.attr('viewBox', '0 0 ' + Math.min(width, height) + ' ' + Math.min(width, height))
.attr('preserveAspectRatio', 'xMinYMin');


const x = d3.scaleBand()
.rangeRound([0, (width - margin.left - margin.right)])
.padding(0.1);

const y = d3.scaleLinear()
.rangeRound([(height - margin.bottom), 0]);

const g = svg.append('g')
.attr('transform', `translate(${margin.left}, ${margin.top})`);

d3.csv('data/seatcount.csv')
.then(data => {

data.forEach(d => {
d.party = d.party;
d.ge14 = +d.ge14;
d.latest = +d.latest;
});

x.domain(data.map(d => d.party));
y.domain([0, d3.max(data, d => d.latest)]);

let duration = 1000;

// define axes
g.append('g')
.attr('class', 'axis, x-axis')
.attr('transform', `translate(0, ${height - margin.bottom})`)
.call(d3.axisBottom(x));

g.append('g')
.attr('class', 'axis, y-axis')
.call(d3.axisLeft(y));

// plot columns
g.selectAll('.col')
.data(data)
.enter()
.append('rect')
.attr('x', d => x(d.party))
.attr('y', height - margin.bottom)
.attr('width', x.bandwidth())
.attr('height', 0)
.attr('class', 'col')
.transition()
.duration(duration)
.attr('y', d => y(d.latest))
.attr('height', d => (height - margin.bottom - y(d.latest)))
.ease(d3.easeBounce);

g.selectAll('.label')
.data(data)
.enter()
.append('text')
.attr('class', 'label')
.attr('x', d => {
return (x(d.party) + x.bandwidth() / 2);
})
.attr('y', (d, i) => {
if (d.latest <= 5) {
return (y(d.latest) - 5);
} else {
return (y(d.latest) + 13);
}
})
.text(d => d.latest)
.style('font-size', '.8em')
.style('visibility', 'hidden')
.transition()
.delay(duration)
.style('visibility', 'visible');

function moveCols(data, period) {

y.domain([0, d3.max(data, d => d[period])]);

g.select('.y-axis')
.transition()
.call(d3.axisLeft(y));

g.selectAll('.label')
.remove();

g.selectAll('.col')
.data(data)
.transition()
.attr('x', d => x(d.party))
.attr('y', d => y(d[period]))
.attr('width', x.bandwidth())
.attr('height', d => (height - margin.bottom - y(d[period])))
.ease(d3.easeBounce);

g.selectAll('.label')
.data(data)
.enter()
.append('text')
.attr('class', 'label')
.attr('x', d => {
return (x(d.party) + x.bandwidth() / 2);
})
.attr('y', (d, i) => {
if (d[period] <= 5) {
return (y(d[period]) - 5);
} else {
return (y(d[period]) + 13);
}
})
.style('fill', '#333333')
.attr('text-anchor', 'middle')
.text(d => d[period])
.style('font-size', '.8em');
}

d3.select('#latest').on('click', () => {
moveCols(data, 'latest');
});

d3.select('#ge14').on('click', () => {
moveCols(data, 'ge14');
})

});





share|improve this answer
























    Your Answer






    StackExchange.ifUsing("editor", function () {
    StackExchange.using("externalEditor", function () {
    StackExchange.using("snippets", function () {
    StackExchange.snippets.init();
    });
    });
    }, "code-snippets");

    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "1"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });














    draft saved

    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54035577%2fbar-chart-unable-to-execute-transition-after-button-clicked%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    0














    I have reformatted my code and it works! I got no complaint.



    const margin = { top: 20, right: 20, bottom: 50, left: 40 },
    width = 900
    height = 700

    const svg = d3.select('#bar')
    .append('svg')
    .attr('width', width)
    .attr('height', height)
    .attr('viewBox', '0 0 ' + Math.min(width, height) + ' ' + Math.min(width, height))
    .attr('preserveAspectRatio', 'xMinYMin');


    const x = d3.scaleBand()
    .rangeRound([0, (width - margin.left - margin.right)])
    .padding(0.1);

    const y = d3.scaleLinear()
    .rangeRound([(height - margin.bottom), 0]);

    const g = svg.append('g')
    .attr('transform', `translate(${margin.left}, ${margin.top})`);

    d3.csv('data/seatcount.csv')
    .then(data => {

    data.forEach(d => {
    d.party = d.party;
    d.ge14 = +d.ge14;
    d.latest = +d.latest;
    });

    x.domain(data.map(d => d.party));
    y.domain([0, d3.max(data, d => d.latest)]);

    let duration = 1000;

    // define axes
    g.append('g')
    .attr('class', 'axis, x-axis')
    .attr('transform', `translate(0, ${height - margin.bottom})`)
    .call(d3.axisBottom(x));

    g.append('g')
    .attr('class', 'axis, y-axis')
    .call(d3.axisLeft(y));

    // plot columns
    g.selectAll('.col')
    .data(data)
    .enter()
    .append('rect')
    .attr('x', d => x(d.party))
    .attr('y', height - margin.bottom)
    .attr('width', x.bandwidth())
    .attr('height', 0)
    .attr('class', 'col')
    .transition()
    .duration(duration)
    .attr('y', d => y(d.latest))
    .attr('height', d => (height - margin.bottom - y(d.latest)))
    .ease(d3.easeBounce);

    g.selectAll('.label')
    .data(data)
    .enter()
    .append('text')
    .attr('class', 'label')
    .attr('x', d => {
    return (x(d.party) + x.bandwidth() / 2);
    })
    .attr('y', (d, i) => {
    if (d.latest <= 5) {
    return (y(d.latest) - 5);
    } else {
    return (y(d.latest) + 13);
    }
    })
    .text(d => d.latest)
    .style('font-size', '.8em')
    .style('visibility', 'hidden')
    .transition()
    .delay(duration)
    .style('visibility', 'visible');

    function moveCols(data, period) {

    y.domain([0, d3.max(data, d => d[period])]);

    g.select('.y-axis')
    .transition()
    .call(d3.axisLeft(y));

    g.selectAll('.label')
    .remove();

    g.selectAll('.col')
    .data(data)
    .transition()
    .attr('x', d => x(d.party))
    .attr('y', d => y(d[period]))
    .attr('width', x.bandwidth())
    .attr('height', d => (height - margin.bottom - y(d[period])))
    .ease(d3.easeBounce);

    g.selectAll('.label')
    .data(data)
    .enter()
    .append('text')
    .attr('class', 'label')
    .attr('x', d => {
    return (x(d.party) + x.bandwidth() / 2);
    })
    .attr('y', (d, i) => {
    if (d[period] <= 5) {
    return (y(d[period]) - 5);
    } else {
    return (y(d[period]) + 13);
    }
    })
    .style('fill', '#333333')
    .attr('text-anchor', 'middle')
    .text(d => d[period])
    .style('font-size', '.8em');
    }

    d3.select('#latest').on('click', () => {
    moveCols(data, 'latest');
    });

    d3.select('#ge14').on('click', () => {
    moveCols(data, 'ge14');
    })

    });





    share|improve this answer




























      0














      I have reformatted my code and it works! I got no complaint.



      const margin = { top: 20, right: 20, bottom: 50, left: 40 },
      width = 900
      height = 700

      const svg = d3.select('#bar')
      .append('svg')
      .attr('width', width)
      .attr('height', height)
      .attr('viewBox', '0 0 ' + Math.min(width, height) + ' ' + Math.min(width, height))
      .attr('preserveAspectRatio', 'xMinYMin');


      const x = d3.scaleBand()
      .rangeRound([0, (width - margin.left - margin.right)])
      .padding(0.1);

      const y = d3.scaleLinear()
      .rangeRound([(height - margin.bottom), 0]);

      const g = svg.append('g')
      .attr('transform', `translate(${margin.left}, ${margin.top})`);

      d3.csv('data/seatcount.csv')
      .then(data => {

      data.forEach(d => {
      d.party = d.party;
      d.ge14 = +d.ge14;
      d.latest = +d.latest;
      });

      x.domain(data.map(d => d.party));
      y.domain([0, d3.max(data, d => d.latest)]);

      let duration = 1000;

      // define axes
      g.append('g')
      .attr('class', 'axis, x-axis')
      .attr('transform', `translate(0, ${height - margin.bottom})`)
      .call(d3.axisBottom(x));

      g.append('g')
      .attr('class', 'axis, y-axis')
      .call(d3.axisLeft(y));

      // plot columns
      g.selectAll('.col')
      .data(data)
      .enter()
      .append('rect')
      .attr('x', d => x(d.party))
      .attr('y', height - margin.bottom)
      .attr('width', x.bandwidth())
      .attr('height', 0)
      .attr('class', 'col')
      .transition()
      .duration(duration)
      .attr('y', d => y(d.latest))
      .attr('height', d => (height - margin.bottom - y(d.latest)))
      .ease(d3.easeBounce);

      g.selectAll('.label')
      .data(data)
      .enter()
      .append('text')
      .attr('class', 'label')
      .attr('x', d => {
      return (x(d.party) + x.bandwidth() / 2);
      })
      .attr('y', (d, i) => {
      if (d.latest <= 5) {
      return (y(d.latest) - 5);
      } else {
      return (y(d.latest) + 13);
      }
      })
      .text(d => d.latest)
      .style('font-size', '.8em')
      .style('visibility', 'hidden')
      .transition()
      .delay(duration)
      .style('visibility', 'visible');

      function moveCols(data, period) {

      y.domain([0, d3.max(data, d => d[period])]);

      g.select('.y-axis')
      .transition()
      .call(d3.axisLeft(y));

      g.selectAll('.label')
      .remove();

      g.selectAll('.col')
      .data(data)
      .transition()
      .attr('x', d => x(d.party))
      .attr('y', d => y(d[period]))
      .attr('width', x.bandwidth())
      .attr('height', d => (height - margin.bottom - y(d[period])))
      .ease(d3.easeBounce);

      g.selectAll('.label')
      .data(data)
      .enter()
      .append('text')
      .attr('class', 'label')
      .attr('x', d => {
      return (x(d.party) + x.bandwidth() / 2);
      })
      .attr('y', (d, i) => {
      if (d[period] <= 5) {
      return (y(d[period]) - 5);
      } else {
      return (y(d[period]) + 13);
      }
      })
      .style('fill', '#333333')
      .attr('text-anchor', 'middle')
      .text(d => d[period])
      .style('font-size', '.8em');
      }

      d3.select('#latest').on('click', () => {
      moveCols(data, 'latest');
      });

      d3.select('#ge14').on('click', () => {
      moveCols(data, 'ge14');
      })

      });





      share|improve this answer


























        0












        0








        0







        I have reformatted my code and it works! I got no complaint.



        const margin = { top: 20, right: 20, bottom: 50, left: 40 },
        width = 900
        height = 700

        const svg = d3.select('#bar')
        .append('svg')
        .attr('width', width)
        .attr('height', height)
        .attr('viewBox', '0 0 ' + Math.min(width, height) + ' ' + Math.min(width, height))
        .attr('preserveAspectRatio', 'xMinYMin');


        const x = d3.scaleBand()
        .rangeRound([0, (width - margin.left - margin.right)])
        .padding(0.1);

        const y = d3.scaleLinear()
        .rangeRound([(height - margin.bottom), 0]);

        const g = svg.append('g')
        .attr('transform', `translate(${margin.left}, ${margin.top})`);

        d3.csv('data/seatcount.csv')
        .then(data => {

        data.forEach(d => {
        d.party = d.party;
        d.ge14 = +d.ge14;
        d.latest = +d.latest;
        });

        x.domain(data.map(d => d.party));
        y.domain([0, d3.max(data, d => d.latest)]);

        let duration = 1000;

        // define axes
        g.append('g')
        .attr('class', 'axis, x-axis')
        .attr('transform', `translate(0, ${height - margin.bottom})`)
        .call(d3.axisBottom(x));

        g.append('g')
        .attr('class', 'axis, y-axis')
        .call(d3.axisLeft(y));

        // plot columns
        g.selectAll('.col')
        .data(data)
        .enter()
        .append('rect')
        .attr('x', d => x(d.party))
        .attr('y', height - margin.bottom)
        .attr('width', x.bandwidth())
        .attr('height', 0)
        .attr('class', 'col')
        .transition()
        .duration(duration)
        .attr('y', d => y(d.latest))
        .attr('height', d => (height - margin.bottom - y(d.latest)))
        .ease(d3.easeBounce);

        g.selectAll('.label')
        .data(data)
        .enter()
        .append('text')
        .attr('class', 'label')
        .attr('x', d => {
        return (x(d.party) + x.bandwidth() / 2);
        })
        .attr('y', (d, i) => {
        if (d.latest <= 5) {
        return (y(d.latest) - 5);
        } else {
        return (y(d.latest) + 13);
        }
        })
        .text(d => d.latest)
        .style('font-size', '.8em')
        .style('visibility', 'hidden')
        .transition()
        .delay(duration)
        .style('visibility', 'visible');

        function moveCols(data, period) {

        y.domain([0, d3.max(data, d => d[period])]);

        g.select('.y-axis')
        .transition()
        .call(d3.axisLeft(y));

        g.selectAll('.label')
        .remove();

        g.selectAll('.col')
        .data(data)
        .transition()
        .attr('x', d => x(d.party))
        .attr('y', d => y(d[period]))
        .attr('width', x.bandwidth())
        .attr('height', d => (height - margin.bottom - y(d[period])))
        .ease(d3.easeBounce);

        g.selectAll('.label')
        .data(data)
        .enter()
        .append('text')
        .attr('class', 'label')
        .attr('x', d => {
        return (x(d.party) + x.bandwidth() / 2);
        })
        .attr('y', (d, i) => {
        if (d[period] <= 5) {
        return (y(d[period]) - 5);
        } else {
        return (y(d[period]) + 13);
        }
        })
        .style('fill', '#333333')
        .attr('text-anchor', 'middle')
        .text(d => d[period])
        .style('font-size', '.8em');
        }

        d3.select('#latest').on('click', () => {
        moveCols(data, 'latest');
        });

        d3.select('#ge14').on('click', () => {
        moveCols(data, 'ge14');
        })

        });





        share|improve this answer













        I have reformatted my code and it works! I got no complaint.



        const margin = { top: 20, right: 20, bottom: 50, left: 40 },
        width = 900
        height = 700

        const svg = d3.select('#bar')
        .append('svg')
        .attr('width', width)
        .attr('height', height)
        .attr('viewBox', '0 0 ' + Math.min(width, height) + ' ' + Math.min(width, height))
        .attr('preserveAspectRatio', 'xMinYMin');


        const x = d3.scaleBand()
        .rangeRound([0, (width - margin.left - margin.right)])
        .padding(0.1);

        const y = d3.scaleLinear()
        .rangeRound([(height - margin.bottom), 0]);

        const g = svg.append('g')
        .attr('transform', `translate(${margin.left}, ${margin.top})`);

        d3.csv('data/seatcount.csv')
        .then(data => {

        data.forEach(d => {
        d.party = d.party;
        d.ge14 = +d.ge14;
        d.latest = +d.latest;
        });

        x.domain(data.map(d => d.party));
        y.domain([0, d3.max(data, d => d.latest)]);

        let duration = 1000;

        // define axes
        g.append('g')
        .attr('class', 'axis, x-axis')
        .attr('transform', `translate(0, ${height - margin.bottom})`)
        .call(d3.axisBottom(x));

        g.append('g')
        .attr('class', 'axis, y-axis')
        .call(d3.axisLeft(y));

        // plot columns
        g.selectAll('.col')
        .data(data)
        .enter()
        .append('rect')
        .attr('x', d => x(d.party))
        .attr('y', height - margin.bottom)
        .attr('width', x.bandwidth())
        .attr('height', 0)
        .attr('class', 'col')
        .transition()
        .duration(duration)
        .attr('y', d => y(d.latest))
        .attr('height', d => (height - margin.bottom - y(d.latest)))
        .ease(d3.easeBounce);

        g.selectAll('.label')
        .data(data)
        .enter()
        .append('text')
        .attr('class', 'label')
        .attr('x', d => {
        return (x(d.party) + x.bandwidth() / 2);
        })
        .attr('y', (d, i) => {
        if (d.latest <= 5) {
        return (y(d.latest) - 5);
        } else {
        return (y(d.latest) + 13);
        }
        })
        .text(d => d.latest)
        .style('font-size', '.8em')
        .style('visibility', 'hidden')
        .transition()
        .delay(duration)
        .style('visibility', 'visible');

        function moveCols(data, period) {

        y.domain([0, d3.max(data, d => d[period])]);

        g.select('.y-axis')
        .transition()
        .call(d3.axisLeft(y));

        g.selectAll('.label')
        .remove();

        g.selectAll('.col')
        .data(data)
        .transition()
        .attr('x', d => x(d.party))
        .attr('y', d => y(d[period]))
        .attr('width', x.bandwidth())
        .attr('height', d => (height - margin.bottom - y(d[period])))
        .ease(d3.easeBounce);

        g.selectAll('.label')
        .data(data)
        .enter()
        .append('text')
        .attr('class', 'label')
        .attr('x', d => {
        return (x(d.party) + x.bandwidth() / 2);
        })
        .attr('y', (d, i) => {
        if (d[period] <= 5) {
        return (y(d[period]) - 5);
        } else {
        return (y(d[period]) + 13);
        }
        })
        .style('fill', '#333333')
        .attr('text-anchor', 'middle')
        .text(d => d[period])
        .style('font-size', '.8em');
        }

        d3.select('#latest').on('click', () => {
        moveCols(data, 'latest');
        });

        d3.select('#ge14').on('click', () => {
        moveCols(data, 'ge14');
        })

        });






        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Jan 7 at 9:00









        vertionvertion

        63




        63
































            draft saved

            draft discarded




















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54035577%2fbar-chart-unable-to-execute-transition-after-button-clicked%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            Mossoró

            Error while reading .h5 file using the rhdf5 package in R

            Pushsharp Apns notification error: 'InvalidToken'