d3中具有顺序x轴的水平平移

本·亨特

我想用一个简单的条形图进行垂直缩放和水平平移。这是我的示例:http : //jsfiddle.net/bjames/rR7ee/

我尝试的大部分内容都涉及到了viewBox,我知道我可能会更幸运clipPath但是我发现的所有示例在缩放功能中都使用连续的x轴来完成任务。

在我的示例中,有8条,但只有4条可见。我想将面板拖到左侧。我想念什么?

提前致谢。

width = 600
height = 600
padding = {left:40, top:20, right:20, bottom:30}
size = {
    x: width - padding.left - padding.right,
    y: height - padding.top - padding.bottom
}
var svg = d3.select('.container').append('div')
    .append("svg")
    .attr("width", 300)
    .attr("height", height)
    .attr('class', 'frame')
    .append("g")
    .attr("transform", "translate(" + padding.left + "," + 
          padding.top + ")")


svg.append('rect')
    .attr('class', 'background')
    .attr('pointer-events', 'all')
    .attr('fill', 'none')
    .attr('height', size.y + 'px')
    .attr('width', size.x + 'px')


var d = [5,6,7,8,9,10,11,12]

var x = d3.scale.ordinal()
      .domain(d3.range(d.length))
      .rangeRoundBands([0, size.x], .15)

var y = d3.scale.linear()
            .domain([0,d3.max(d)])
            .range([size.y, 0])

var xax = d3.svg.axis().scale(x)
            .tickSize(-size.y).orient('bottom')

var yax = d3.svg.axis().scale(y)
            .tickSize(-size.x).orient('left')

svg.append("g")
    .attr("class", "y axis")
    .call(yax)

svg.append("g")
    .attr("class", "x axis")
    .attr("transform", "translate(0," + size.y+ ")")
    .call(xax)

svg.append('g').attr('class', 'rects')

function update(){

    var rects = d3.select('.rects').selectAll('rect')
                    .data(d)

    rects.attr('x', function(d,i) { return x(i)})
        .attr('width', x.rangeBand())
        .attr('y',  function(d) { return y(d)})
        .attr('height', function(d) { return size.y - y(d)})

    rects.enter().append('rect')
        .attr('x', function(d,i) { return x(i) })
        .attr('width', x.rangeBand())
        .attr('y',  function(d) { return y(d)})
        .attr('height', function(d) { return size.y - y(d)})
        .style('fill', 'orange')
    svg.select('.y.axis')
        .call(yax)
    svg.select('.x.axis')
        .call(xax)
    svg.select('.background')
        .call(zoom)
}


var zoom = d3.behavior.zoom()
          .on("zoom", zoomed)

function zoomed() {
    y.domain([0, d3.max(d)*1/d3.event.scale])
    update();
}
update()
西里尔·谢里安(Cyril Cherian)

垂直缩放已经实现。我实现了水平平移。

注意:缩放和平移都发生在背景中的矩形上,因为侦听器已附加到矩形上。

我在小提琴代码中添加了注释,这些注释应该在逻辑上有帮助。

width = 600
height = 600
padding = {left:40, top:20, right:20, bottom:30}
size = {
    x: width - padding.left - padding.right,
    y: height - padding.top - padding.bottom
}
var svg = d3.select('.container').append('div')
    .append("svg")
    .attr("width", 300)
    .attr("height", height)
    .attr('class', 'frame')
    .append("g")
    .attr("transform", "translate(" + padding.left + "," + 
          padding.top + ")")



svg.append('rect')
    .attr('class', 'background')
    .attr('pointer-events', 'all')
    .attr('fill', 'none')
    .attr('height', size.y + 'px')
    .attr('width', size.x + 'px')


var d = [5,6,7,8,9,10,11,12]

var x = d3.scale.ordinal()
      .domain(d3.range(d.length))
      .rangeRoundBands([0, size.x], .15)

var y = d3.scale.linear()
            .domain([0,d3.max(d)])
            .range([size.y, 0])

var xax = d3.svg.axis().scale(x)
            .tickSize(-size.y).orient('bottom')

var yax = d3.svg.axis().scale(y)
            .tickSize(-size.x).orient('left')

svg.append("g")
    .attr("class", "y axis")
    .call(yax)

svg.append("g")
    .attr("class", "x axis")
    .attr("transform", "translate(0," + size.y+ ")")
    .call(xax)
var svg1 = svg.append('svg')
    .attr('height', size.y + 'px')
    .attr('width', size.x + 'px')
svg1.append('g').attr('class', 'rects')

function update(){

    var rects = d3.select('.rects').selectAll('rect')
                    .data(d)

    rects.attr('x', function(d,i) { return x(i)})
        .attr('width', x.rangeBand())
        .attr('y',  function(d) { return y(d)})
        .attr('height', function(d) { return size.y - y(d)})

    rects.enter().append('rect')
        .attr('x', function(d,i) { return x(i) })
        .attr('width', x.rangeBand())
        .attr('y',  function(d) { return y(d)})
        .attr('height', function(d) { return size.y - y(d)})
        .style('fill', 'orange')
    svg.select('.y.axis')
        .call(yax)
    svg.select('.x.axis')
        .call(xax)
    svg.select('.background')
        .call(zoom)
    svg.select('.background')
        .call(drag)
}


var zoom = d3.behavior.zoom()
          .on("zoom", zoomed)

function zoomed() {
    y.domain([0, d3.max(d)*1/d3.event.scale])
    update();
}
var drag = d3.behavior.drag()
    .on("drag", dragmove).on("dragstart", dragstart);

 var moved = 0;//record the translate x moved by the g which contains the bars.
 var dragStartX = 0;//record the point from where the drag started
 var oldTranslateX = 0;

function dragstart(d){
    dragStartX = d3.event.sourceEvent.clientX;
    oldTranslateX = moved;//record the old translate 
     console.log(d3.event)  
}
function dragmove(d) {
  var x = d3.event.x;
  var y = d3.event.y;
  var dx =   x-dragStartX 
  x = dx + oldTranslateX + 50; //add the old translate to the dx to get the resultant translate
  moved = x; //record the translate x given
  //move the bars via translate x
  d3.select('.rects').attr("transform", "translate(" + x + "," + 0 + ")");
    //move the x axis via translate x
  d3.select('.x').attr("transform", "translate("+x +" ," + size.y+ ")")
}
update()

这是小提琴:http : //jsfiddle.net/cyril123/o0qeom7n/3/

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

D3有界平移

来自分类Dev

如何在D3中的水平条形图上的X轴上添加一条线

来自分类Dev

如何在D3中的水平条形图上的X轴上添加一条线

来自分类Dev

如何在D3中更改x轴?

来自分类Dev

X轴文本标签未在d3中旋转

来自分类Dev

如何更改 D3 中 x 轴的标签

来自分类Dev

在x轴上平移3D立方体

来自分类Dev

x轴上的自定义D3`tickValue`-水平条形图

来自分类Dev

D3:是否可以缩放+平移一个轴而仅平移另一个轴?

来自分类Dev

D3中是否有“轴相等”?

来自分类Dev

d3-笔刷/平移缩放-禁用上x轴的平移

来自分类Dev

每周D3的X轴

来自分类Dev

D3在X轴上缩放

来自分类Dev

D3 x 轴数据重叠

来自分类Dev

数组以映射顺序y轴d3

来自分类Dev

如何纠正D3酒窝类别轴的顺序?

来自分类Dev

绘制具有反应的d3轴,无需直接进行D3 DOM操作

来自分类Dev

约束d3中的轴标签

来自分类Dev

约束d3中的轴标签

来自分类Dev

页面上具有不同(线性和对数)轴的多个d3图表

来自分类Dev

如何在具有缩放功能的时间轴中的 d3 v4 中添加过滤器或 ScaleExtent

来自分类Dev

带有UNIX时间戳记的d3时间刻度x轴

来自分类Dev

D3 X轴上带有工具提示的条形图

来自分类Dev

我的X轴未呈现我想要的所有刻度线-D3 JS

来自分类Dev

D3 x 轴未显示所有数据

来自分类Dev

当 x 轴改变时,d3 圆圈没有响应

来自分类Dev

D3中具有投影的动态简化

来自分类Dev

奇怪的D3平移/缩放行为-加速平移

来自分类Dev

如何从json文件分配Sankey图(D3)中的节点的x轴位置