score:1
Accepted answer
That behaviour is actually expected: when you call the axis again, the axis generator resets the dx
and dy
attributes.
You can apply them again after the second call, just as you did in the first one, but you'll notice that the texts will quickly flicker before going to their new positions.
So, an easy alternative, that avoids the flickering, is setting the labels' positions using the rotate
itself. For instance (hardcoded values):
.attr("transform", "rotate(-65 12 32)");
Here is the code with that change:
var margin = {
top: 20,
right: 20,
bottom: 60,
left: 40
},
width = 960 - margin.left - margin.right,
height = 600 - margin.top - margin.bottom;
var formatPercent = d3.format(".0%");
var x = d3.scale.ordinal()
.rangeRoundBands([0, width], .1, 1);
var y = d3.scale.linear()
.range([height, 0]);
var xAxis = d3.svg.axis()
.scale(x)
.orient("bottom");
var yAxis = d3.svg.axis()
.scale(y)
.orient("left")
.tickFormat(formatPercent);
var svg = d3.select("body").append("svg")
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top + margin.bottom)
.append("g")
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
data = [{
letter: "Alongname1",
frequency: 0.08167
},
{
letter: "Alongname2",
frequency: 0.01492
},
{
letter: "Alongname3",
frequency: 0.0278
},
{
letter: "Alongname4",
frequency: 0.04253
},
{
letter: "Alongname5",
frequency: 0.12702
},
{
letter: "Alongname6",
frequency: 0.02288
},
{
letter: "Alongname7",
frequency: 0.02022
},
{
letter: "Alongname8",
frequency: 0.06094
},
{
letter: "Alongname9",
frequency: 0.06973
},
{
letter: "Alongname10",
frequency: 0.00153
},
{
letter: "Alongname11",
frequency: 0.00747
},
{
letter: "Alongname12",
frequency: 0.04025
},
{
letter: "Alongname13",
frequency: 0.02517
},
{
letter: "Alongname14",
frequency: 0.06749
},
{
letter: "Alongname15",
frequency: 0.07507
},
{
letter: "Alongname16",
frequency: 0.01929
},
{
letter: "Alongname17",
frequency: 0.00098
},
{
letter: "Alongname18",
frequency: 0.05987
}
];
data.forEach(function(d) {
d.frequency = +d.frequency;
});
x.domain(data.map(function(d) {
return d.letter;
}));
y.domain([0, d3.max(data, function(d) {
return d.frequency;
})]);
svg.append("g")
.attr("class", "x axis")
.attr("transform", "translate(0," + height + ")")
.call(xAxis)
.selectAll("text")
.attr("transform", "rotate(-65 12 32)");
svg.append("g")
.attr("class", "y axis")
.call(yAxis)
.append("text")
.attr("transform", "rotate(-90)")
.attr("y", 6)
.attr("dy", ".71em")
.style("text-anchor", "end")
.text("Frequency");
svg.selectAll(".bar")
.data(data)
.enter().append("rect")
.attr("class", "bar")
.attr("x", function(d) {
return x(d.letter);
})
.attr("width", x.rangeBand())
.attr("y", function(d) {
return y(d.frequency);
})
.attr("height", function(d) {
return height - y(d.frequency);
});
var sortTimeout = setTimeout(function() {
d3.select("input").property("checked", true).each(change);
}, 2000);
function change() {
clearTimeout(sortTimeout);
// Copy-on-write since tweens are evaluated after a delay.
var x0 = x.domain(data.sort(this.checked ?
function(a, b) {
return b.frequency - a.frequency;
} :
function(a, b) {
return d3.ascending(a.letter, b.letter);
})
.map(function(d) {
return d.letter;
}))
.copy();
svg.selectAll(".bar")
.sort(function(a, b) {
return x0(a.letter) - x0(b.letter);
});
var transition = svg.transition().duration(750),
delay = function(d, i) {
return i * 50;
};
transition.selectAll(".bar")
.delay(delay)
.attr("x", function(d) {
return x0(d.letter);
});
transition.select(".x.axis")
.call(xAxis)
.selectAll("g")
.delay(delay);
}
body {
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
position: relative;
width: 960px;
}
.axis text {
font: 10px sans-serif;
}
.axis path,
.axis line {
fill: none;
stroke: #000;
shape-rendering: crispEdges;
}
.bar {
fill: steelblue;
fill-opacity: .9;
}
.x.axis path {
display: none;
}
label {
position: absolute;
top: 10px;
right: 10px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
<label><input type="checkbox"> Sort values</label>
Source: stackoverflow.com
Related Query
- Sortable bar chart with long x axis labels rotated
- Make simple bar chart using C3 with separate columns on the x axis
- nvd3.js-Line Chart with View Finder: rotate axis labels and show line values when mouse over
- d3.js bar chart sorting: can't figure out how to sort x-axis labels along with bars
- DC.js bar chart with date axis
- Need help lining up x axis ticks with bars in D3.js bar chart
- dc.js bar chart with ordinal x axis scale doesn't render correctly
- How to modify axis labels in d3 for a stacked bar chart when the axis labels are mapped as part of the scale's domain
- x axis labels overlapping for grouped category bar chart in d3
- d3 show labels only for ticks with data in a bar chart
- Increase margins for rotated axis labels with Crossfilter
- How to line up x axis on stacked bar chart with a line overlay in d3.js
- d3.js v4 bar chart with negative values on y axis
- d3 bar chart with fixed bar width and fixed spacing to align in center axis line
- NVD3 Horizontal Bar Chart labels too long
- D3.js bar chart - axis and labels not working / transitioning
- trying to get the circles next to the y axis labels in bar chart d3.js
- D3 Bar and Linear Chart With Multiple Axis
- Nivo bar chart axis labels overlapping
- Wrapping long labels with axis transition in D3.js v4
- rendering issue in d3 radial bar chart with labels
- D3.js Bar chart - Aligning labels with custom bar width
- d3 bar chart with custom x axis and bar width
- d3.js axis labels not displaying in responsive bar chart
- D3 bar chart where axis labels are hyperlinks from data
- D3 Bar chart - Remove labels with zero value
- Labels do not display with D3 v4 bar chart
- D3 v4 bar chart X axis with negative values
- D3 js bar chart with 24 hour x axis
- DC.js bar chart x-axis labels not aligned with bars
More Query from same tag
- d3 chart refresh duplicate
- Appending "size" element to last json child element for a sunburst diagram
- Parsing string to date in d3.js
- How to filter d3.nested data in javascript - nested function
- D3.js hierarchy calculated summary by field
- In an example for a worldmap for d3v4 world_countries.json can't be found
- Accessing C# function in Javascript
- How can I remove regular line jumps?
- How to Convert Java Object in to GeoJSON (Required by d3 Graph)
- How to place 3 d3.js charts in a row
- D3 update tick values without updating the domain
- NetworkD3 Sankey diagram in R: How to calculate value for each link?
- D3: Passing object array data to a barchart on mouseover
- Select the complete bar of stacked bar chart D3
- Restrict Panning of d3.js chart to One Direction
- Conflict between d3.forceCollide() and d3.forceX/Y() with high strength() value
- Passing an object containing an array to D3
- Converting csv file data to a JavaScript dictionary
- D3JS how to get the y postition with bisector?
- nvd3 - Format Milliseconds to h:m:s in Chart (Period of Time, not Date)
- Does Force-Directed Layout of d3-js support image as node?
- Adding tooltips to line graph data points AFTER lines animate
- d3.js Tree - Paging with search
- d3.json what kind of request its making?
- Filter d3.s to show specific data
- Bubble visualization with a JSON file
- D3 time axis - why do tick marks seem to be invisible by default?
- Events in d3 graphs
- Filter and combine two arrays, matching two fields/columns : Javascript
- d3js - How to ignore specific object in JSON