Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript d3制作一张周和小时的条形图,并将项目设置在正确的位置_Javascript_Php_Jquery_Svg_D3.js - Fatal编程技术网

Javascript d3制作一张周和小时的条形图,并将项目设置在正确的位置

Javascript d3制作一张周和小时的条形图,并将项目设置在正确的位置,javascript,php,jquery,svg,d3.js,Javascript,Php,Jquery,Svg,D3.js,我正在用D3.js制作一个条形图,我对它完全陌生 我有两个问题 问题1: 我想要一个条形图,其中X轴有不同的星期(未来6周)和每个星期之间 有40个小时见下图: 问题2 im以后如何在条形图中的正确位置执行3个订单: 订单1:开始时间:第46周和第39小时 顺序2:第45周开始,第46周结束43小时 顺序3:从第45周开始,第48周结束126小时 我尝试了一些,并使用以下Json数据数组成功解析了Weeks和Order,但无法: PHP: //Hours $hours = array(1,

我正在用D3.js制作一个条形图,我对它完全陌生

我有两个问题

问题1: 我想要一个条形图,其中X轴有不同的星期(未来6周)和每个星期之间 有40个小时见下图:

问题2

im以后如何在条形图中的正确位置执行3个订单:

  • 订单1:开始时间:第46周和第39小时
  • 顺序2:第45周开始,第46周结束43小时
  • 顺序3:从第45周开始,第48周结束126小时
我尝试了一些,并使用以下Json数据数组成功解析了Weeks和Order,但无法:

PHP:

//Hours
$hours = array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40);
//Weekdays
$week = array(
        0 => array("week" => 45,
                   'hours' => $hours
                ),
        1 => array("week" => 46,
                    'hours' => $hours
                ),
        2 => array("week" => 47,
                    'hours' => $hours
                ),
        3 => array("week" => 48,
                    'hours' => $hours
                ),
        4 => array("week" => 49,
                    'hours' => $hours
                ),
);

$json_weekdays = json_encode($week);
$json_hours = json_encode($hours);
$json_plannedOrder = json_encode($plannedOrder);
Javascript

var weekdays = <?= $json_weekdays; ?>;
let hours = <?= $json_hours; ?>;
var data = <?= $json_plannedOrder; ?>;

// set the dimensions and margins of the graph
var margin = {top: 20, bottom: 30, left: 50, right: 50},
    width = 1050,
    height = 500 - (margin.top - margin.bottom);


var svg = d3.select("#dashboard-order")
    .append("svg")
    .attr("width", width)
    .attr("height", height)
    .attr("transform", "translate(0,0)");

// Scale the range of the data in the domains
var xScale = d3.scalePoint()
    .domain(weekdays.map(function(w){
            return w.week;
        })
    )
    .range([0, width])
    .padding(0);

var yScale = d3.scaleBand()
    .domain(data.map(function(d){ return d.Order.order_id }))
    .range([0, height])
    .padding(1);

// Bars anzeigen
// append the rectangles for the bar chart

svg.selectAll(".bar")
    .data(data)
    .enter()
    .append("rect")
    .attr("class", "bar")
    .attr("transform", function(d) {
        return "translate("+ xScale( d.Order.week ) +",0)"; 
    })
    .attr("width", function(d) { 
        return xScale( d.Order.hours ); 
    } )
    .attr("y", function(d) { return yScale(d.Order.order_id); })
    .attr("height", "50");

//append X Scale
svg.append("g")
    .call(d3.axisTop(xScale))
    .attr("transform",  "translate(0," + margin.top + ")");

//append Y Scale
svg.append("g")
    .call(d3.axisRight(yScale))
    .attr("transform",  "translate(0," + margin.top + ")");
var工作日=;
让小时=;
var数据=;
//设置图形的尺寸和边距
var margin={顶部:20,底部:30,左侧:50,右侧:50},
宽度=1050,
高度=500-(页边距.顶部-页边距.底部);
var svg=d3。选择(“仪表板顺序”)
.append(“svg”)
.attr(“宽度”,宽度)
.attr(“高度”,高度)
.attr(“转换”、“翻译(0,0)”);
//缩放域中数据的范围
var xScale=d3.scalePoint()
.domain(工作日.map)(函数(w){
返回w周;
})
)
.范围([0,宽度])
.填充(0);
var yScale=d3.scaleBand()
.domain(data.map(函数(d){return d.Order.Order_id}))
.范围([0,高度])
.填充(1);
//酒吧
//为条形图添加矩形
svg.selectAll(“.bar”)
.数据(数据)
.输入()
.append(“rect”)
.attr(“类”、“条”)
.attr(“转换”,函数(d){
返回“translate(“+xScale(d.Order.week)+”,0)”;
})
.attr(“宽度”,函数(d){
返回xScale(d.Order.hours);
} )
.attr(“y”,函数(d){return yScale(d.Order.Order_id);})
.attr(“高度”、“50”);
//附加X刻度
svg.append(“g”)
.call(d3.axisTop(xScale))
.attr(“转换”、“转换(0)”+margin.top+”);
//附加Y刻度
svg.append(“g”)
.call(d3.axisRight(yScale))
.attr(“转换”、“转换(0)”+margin.top+”);

我需要做些什么来显示周与周之间的小时数,并将周与小时数的顺序设置在正确的位置?

我已经得到了解决方案,我已经改变了结构,每周都在这些解决方案中设置了40个小时,例如

n(周)*40

所以D3知道横杆必须进入X轴的哪个点,我将Week数组更改为以下结构:

0: {isAWeek: 1, weekCalender: "45", hour: 0}
1: {isAWeek: 0, hour: 1}
2: {isAWeek: 0, hour: 2}
3: {isAWeek: 0, hour: 3}
4: {isAWeek: 0, hour: 4}
5: {isAWeek: 0, hour: 5}
6: {isAWeek: 0, hour: 6}
7: {isAWeek: 0, hour: 7}
8: {isAWeek: 0, hour: 8}
9: {isAWeek: 0, hour: 9}
10: {isAWeek: 0, hour: 10}
11: {isAWeek: 0, hour: 11}
12: {isAWeek: 0, hour: 12}
13: {isAWeek: 0, hour: 13}
14: {isAWeek: 0, hour: 14}
15: {isAWeek: 0, hour: 15}
16: {isAWeek: 0, hour: 16}
17: {isAWeek: 0, hour: 17}
18: {isAWeek: 0, hour: 18}
19: {isAWeek: 0, hour: 19}
20: {isAWeek: 0, hour: 20}
21: {isAWeek: 0, hour: 21}
22: {isAWeek: 0, hour: 22}
23: {isAWeek: 0, hour: 23}
24: {isAWeek: 0, hour: 24}
25: {isAWeek: 0, hour: 25}
26: {isAWeek: 0, hour: 26}
27: {isAWeek: 0, hour: 27}
28: {isAWeek: 0, hour: 28}
29: {isAWeek: 0, hour: 29}
30: {isAWeek: 0, hour: 30}
31: {isAWeek: 0, hour: 31}
32: {isAWeek: 0, hour: 32}
33: {isAWeek: 0, hour: 33}
34: {isAWeek: 0, hour: 34}
35: {isAWeek: 0, hour: 35}
36: {isAWeek: 0, hour: 36}
37: {isAWeek: 0, hour: 37}
38: {isAWeek: 0, hour: 38}
39: {isAWeek: 0, hour: 39}
40: {isAWeek: 1, weekCalender: "46", hour: 40}
41: {isAWeek: 0, hour: 41}
42: {isAWeek: 0, hour: 42}
....
通过这种结构,我可以标记哪一小时是新的一周,并且可以在X刻度中定义当他用isAWeek==1点击该数据时,他显示该周并继续小时点:

//append X Scale
svg.append("g")
    .call(
        d3.axisTop(xScale).tickFormat( function(w, i) {
            if( weekdays[i].isAWeek == 1 ) {
                return weekdays[i].weekCalender;
            } else {
                return "";
            }  
        })
    );

请每个问题问一个问题,否则,如果有人只能回答一部分,他们可能会觉得回答整个问题不舒服。另外,请将您的代码转换为一个,并提供一些示例数据。请看!