亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

JQuery 滑塊不與 d3 在垂直線上繪制的數據交互

JQuery 滑塊不與 d3 在垂直線上繪制的數據交互

一只甜甜圈 2023-05-18 10:44:25
我試圖讓我的數據與 jQuery 滑塊交互。我的數據用鋼藍色的垂直線表示,但 jQuery 滑塊僅與淺灰色垂直線 xAxis 交互,因為我使用 xAxis x.axis 及其路徑設置它。它只隨滑塊移動,而不是鋼藍中的實際垂直線。我不能使用 d3 滑塊,我被這個 d3 v2 困住了。我問了一個關于垂直線的問題:(How to interact JQuery slider with d3 vertical lines for every data point),但建議對這個滑塊問題提出一個單獨的問題:(任何輸入都會有幫助!這是代碼:// define dimensions of graphvar m = [80, 80, 80, 80]; // marginsvar w = 1000 - m[1] - m[3]; // widthvar h = 350 - m[0] - m[2]; // height// create a simple data array that we'll plot with a line (this array represents only the Y values, X will just be the index location)var data = [0];for (var i = 1; i < 50; i++) {  var sign = Math.random() > 0.5 ? +1 : -1;  data.push(data[i - 1] + sign * Math.random());}// X scale will fit all values from data[] within pixels 0-wvar x = d3.scale.linear().domain([0, data.length]).range([0, w]);// Y scale will fit values from 0-10 within pixels h-0 (Note the inverted domain for the y-scale: bigger is up!)var y = d3.scale.linear().domain([d3.min(data), d3.max(data)]).range([h, 0]);// Add an SVG element with the desired dimensions and margin.var graph = d3.select("#graph").append("svg:svg")  .attr("width", w + m[1] + m[3])  .attr("height", h + m[0] + m[2])  .append("svg:g")  .attr("transform", "translate(" + m[3] + "," + m[0] + ")");// create yAxisvar xAxis = d3.svg.axis().scale(x).tickSize(-h).tickSubdivide(3);// Add the x-axis.graph.append("svg:g")  .attr("class", "x axis")  .attr("transform", "translate(0," + h + ")")  .call(xAxis);// create left yAxisvar yAxisLeft = d3.svg.axis().scale(y).ticks(4).orient("left");// Add the y-axis to the leftgraph.append("svg:g")  .attr("class", "y axis")  .attr("transform", "translate(-25,0)")  .call(yAxisLeft);var circle = graph.selectAll("circle")  .data(data);circle.enter()  .append("circle")  .attr("cx", function(d, i) {    return x(i)  })  .attr("cy", function(d) {    return y(d)  })  .attr("class", "circle")  .attr("r", 2)  .attr("fill", "red");
查看完整描述

1 回答

?
holdtom

TA貢獻1805條經驗 獲得超10個贊

我建議使用d3-brush, 因為它本質上是您想要的,但由 d3 團隊為 d3 構建。

但是,如果您不能,我已經在下面使用您的 jQuery 滑塊使其工作。您正在擺弄軸刻度,但我建議您重新繪制軸并讓 d3 為您完成。每次勾選我都會更新x.domain(),然后調用draw()函數讓垂直線和圓重新繪制`并重新繪制 x 軸。我已將域外的所有線條和圓圈的不透明度設置為 0,因此它們被隱藏了。

var m = [40, 80, 40, 80]; // margins

var w = 1000 - m[1] - m[3]; // width

var h = 300 - m[0] - m[2]; // height


var data = [0];

for (var i = 1; i < 50; i++) {

? var sign = Math.random() > 0.5 ? +1 : -1;

? data.push(data[i - 1] + sign * Math.random());

}


var x = d3.scale.linear().domain([0, data.length]).range([0, w]);

var y = d3.scale.linear().domain([d3.min(data), d3.max(data)]).range([h, 0]);


var graph = d3.select("#graph").append("svg:svg")

? .attr("width", w + m[1] + m[3])

? .attr("height", h + m[0] + m[2])

? .append("svg:g")

? .attr("transform", "translate(" + m[3] + "," + m[0] + ")");


var xAxis = d3.svg.axis().scale(x).tickSize(-h).tickSubdivide(3);

var xAxisGroup = graph.append("svg:g")

? .attr("class", "x axis")

? .attr("transform", "translate(0," + h + ")");


var yAxisLeft = d3.svg.axis().scale(y).ticks(4).orient("left");

graph.append("svg:g")

? .attr("class", "y axis")

? .attr("transform", "translate(-25,0)")

? .call(yAxisLeft);


function draw() {

? var circle = graph.selectAll("circle")

? ? .data(data);


? circle.exit().remove();

? circle.enter()

? ? .append("circle");


? circle

? ? .attr("cx", function(d, i) {

? ? ? return x(i)

? ? })

? ? .attr("cy", function(d) {

? ? ? return y(d)

? ? })

? ? .attr("opacity", function(d, i) {

? ? ? return x.domain()[0] <= i && i <= x.domain()[1] ? 1 : 0;

? ? })

? ? .attr("class", "circle")

? ? .attr("r", 2)

? ? .attr("fill", "red");


? var verticalLine = graph.selectAll(".vertical-line")

? ? .data(data);


? verticalLine.exit().remove();

? verticalLine.enter()

? ? .append("line");


? verticalLine

? ? .attr("x1", function(d, i) {

? ? ? return x(i)

? ? })

? ? .attr("x2", function(d, i) {

? ? ? return x(i)

? ? })

? ? .attr("opacity", function(d, i) {

? ? ? return x.domain()[0] <= i && i <= x.domain()[1] ? 1 : 0;

? ? })

? ? .attr({

? ? ? y1: 0,

? ? ? y2: h,

? ? ? stroke: 'steelblue',

? ? ? class: 'vertical-line'

? ? });


? xAxisGroup.call(xAxis);

}


draw();


function zoom(begin, end) {

? x.domain([begin, end]);

? draw();

}


$(function() {

? $("#slider-range").slider({

? ? range: true,

? ? min: 0,

? ? max: data.length,

? ? values: [0, data.length],

? ? slide: function(event, ui) {

? ? ? var begin = d3.min([ui.values[0], data.length]);

? ? ? var end = d3.max([ui.values[1], 0]);

? ? ? zoom(begin, end);

? ? }

? });

});

path {

? stroke: steelblue;

? stroke-width: 1;

? fill: none;

}


.axis {

? shape-rendering: crispEdges;

}


.x.axis line {

? stroke: lightgrey;

}


.x.axis .minor {

? stroke-opacity: .5;

}


.x.axis path {

? display: none;

}


.y.axis line,

.y.axis path {

? fill: none;

? stroke: #000;

}

<script src="https://mbostock.github.com/d3/d3.v2.js"></script>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>

<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.23/jquery-ui.min.js"></script>

<link rel="stylesheet" type="text/css" media="all" />

<div id="graph" class="aGraph"></div>

<div id="slider-range" style="width: 80%px; margin-left:10%; margin-right:10%"></div>


查看完整回答
反對 回復 2023-05-18
  • 1 回答
  • 0 關注
  • 135 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號