D3.js饼图显示每个季度的销售额百分比

D3.js饼图显示每个季度的销售额百分比,d3.js,pie-chart,D3.js,Pie Chart,使用d3.js,我想制作一个图表,以饼图的形式显示每个项目,显示不同节目的季度门票销售情况 这是我想制作的图表的示例图片,图表中的每个部分代表一个节目的门票及其在每个季度的销售百分比。现在使用此链接 我已经制作了一个图表,但它并不是我所需要的。d3.js中是否有任何图表可以显示我在图片中提到的图表,或者我们需要对其进行自定义以获得类似的图表 d3.js中是否有我提到的图表 在图片中,还是我们需要自定义它以获得这样的图形 不,没有现成的解决方案,d3因为问题注释上的是一组用于操作DOM的方法,这

使用d3.js,我想制作一个图表,以饼图的形式显示每个项目,显示不同节目的季度门票销售情况

这是我想制作的图表的示例图片,图表中的每个部分代表一个节目的门票及其在每个季度的销售百分比。现在使用此链接

我已经制作了一个图表,但它并不是我所需要的。d3.js中是否有任何图表可以显示我在图片中提到的图表,或者我们需要对其进行自定义以获得类似的图表

d3.js中是否有我提到的图表 在图片中,还是我们需要自定义它以获得这样的图形

不,没有现成的解决方案,d3因为问题注释上的是一组用于操作DOM的方法,这允许在创建自定义可视化方面有很大的灵活性(用户不像许多只允许定义修改的现成解决方案那样受到限制)。因此,是的,您可以制作一个类似d3的图表,从散点图和饼图实现中提取元素和想法,使用d3制作图表

这个答案显示了一种可以用来创建这样一个图表的方法。理想情况下,它可以提供构思自己的可视化,以满足您的需要

首先,您需要一种机制来制作可变大小的饼图并放置它们——可以说这是最难的部分(之后您只需要一个更容易操作的散点图)。这需要对数据结构进行一些思考,我使用了如下结构:

var data = [
  {x:100,y:100,radius:20,slices:[1,5]},
  {x:150,y:180,radius:10,slices:[1,2,3,4]},
您可以根据需要添加其他属性,只需指定饼图中心的x和y坐标、饼图的半径以及每个饼图的楔形值

这样,您就可以在svg中添加一个组元素(
g
),使用d3中的标准输入循环为每个饼图(或数据数组中的项目)添加一个组元素,并在运行时定位这些组:

var pies = svg.selectAll("g")
  .data(data)
  .enter()
  .append("g")
  .property("radius",function(d) { return d.radius; })
  .attr("transform",function(d) { return "translate("+d.x+","+d.y+")"; });
由于用于附加楔块本身的数据数组仅包含楔块值,因此我们可以将“半径”属性保存为组的属性,并在附加楔块时访问该属性:

pies.selectAll()
  .data(function(d){ return pie(d.slices); })
  .enter()
  .append("path")
  .attr("d",function(d) { 
      var radius = d3.select(this.parentNode).property("radius"); 
      arc.outerRadius(radius);
      return arc(d) })
  .attr("fill",function(d,i){
           return color[i];      
      });
一个基本示例可能如下所示:

var数据=[
{x:100,y:100,半径:20,切片:[1,5]},
{x:150,y:180,半径:10,切片:[1,2,3,4]},
{x:180,y:130,半径:30,切片:[1,2,3,4,5,6,7]},
{x:50,y:50,半径:15,切片:[5,3]},
{x:50,y:180,半径:40,切片:[6,3]}
]
var宽度=500;
var高度=300;
var svg=d3.选择(“正文”).追加(“svg”)
.attr(“宽度”,宽度)
.attr(“高度”,高度);
var arc=d3.arc()
.内半径(0)
.外层(50);
var pie=d3.pie()
.sort(空)
.value(函数(d){返回d;});
var color=d3.schemecategory 10;
//为每个饼图添加一个组,它将每个饼图的半径存储为属性
var pies=svg.selectAll(“g”)
.数据(数据)
.输入()
.附加(“g”)
.property(“radius”,函数(d){返回d.radius;})
.attr(“transform”,函数(d){return“translate”(“+d.x+”,“+d.y+”)”);});
//使用绑定到父对象g的数据的“切片”属性绘制每个饼图楔块
pies.selectAll()
.data(函数(d){返回饼图(d.slices);})
.输入()
.append(“路径”)
.attr(“d”,函数(d){
var radius=d3.select(this.parentNode).property(“radius”);
外弧(半径);
返回弧(d)})
.attr(“填充”,函数(d,i){
返回颜色[i];
});
d3.js中是否有我提到的图表 在图片中,还是我们需要自定义它以获得这样的图形

不,没有现成的解决方案,d3因为问题注释上的是一组用于操作DOM的方法,这允许在创建自定义可视化方面有很大的灵活性(用户不像许多只允许定义修改的现成解决方案那样受到限制)。因此,是的,您可以制作一个类似d3的图表,从散点图和饼图实现中提取元素和想法,使用d3制作图表

这个答案显示了一种可以用来创建这样一个图表的方法。理想情况下,它可以提供构思自己的可视化,以满足您的需要

首先,您需要一种机制来制作可变大小的饼图并放置它们——可以说这是最难的部分(之后您只需要一个更容易操作的散点图)。这需要对数据结构进行一些思考,我使用了如下结构:

var data = [
  {x:100,y:100,radius:20,slices:[1,5]},
  {x:150,y:180,radius:10,slices:[1,2,3,4]},
您可以根据需要添加其他属性,只需指定饼图中心的x和y坐标、饼图的半径以及每个饼图的楔形值

这样,您就可以在svg中添加一个组元素(
g
),使用d3中的标准输入循环为每个饼图(或数据数组中的项目)添加一个组元素,并在运行时定位这些组:

var pies = svg.selectAll("g")
  .data(data)
  .enter()
  .append("g")
  .property("radius",function(d) { return d.radius; })
  .attr("transform",function(d) { return "translate("+d.x+","+d.y+")"; });
由于用于附加楔块本身的数据数组仅包含楔块值,因此我们可以将“半径”属性保存为组的属性,并在附加楔块时访问该属性:

pies.selectAll()
  .data(function(d){ return pie(d.slices); })
  .enter()
  .append("path")
  .attr("d",function(d) { 
      var radius = d3.select(this.parentNode).property("radius"); 
      arc.outerRadius(radius);
      return arc(d) })
  .attr("fill",function(d,i){
           return color[i];      
      });
一个基本示例可能如下所示:

var数据=[
{x:100,y:100,半径:20,切片:[1,5]},
{x:150,y:180,半径:10,切片:[1,2,3,4]},
{x:180,y:130,半径:30,切片:[1,2,3,4,5,6,7]},
{x:50,y:50,半径:15,切片:[5,3]},
{x:50,y:180,半径:40,切片:[6,3]}
]
var宽度=500;
var高度=300;
var svg=d3.选择(“正文”).追加(“svg”)
.attr(“宽度”,宽度)
.attr(“高度”,高度);
var arc=d3.arc()
.内半径(0)
.外层(50);
var pie=d3.pie()
.sort(空)
.value(函数(d){返回d;});
var color=d3.schemecategory 10;
//为每个饼图添加一个组,它将每个饼图的半径存储为属性
var pies=svg.selectAll(“g”)
.数据(数据)
.输入()
.附加(“g”)
.属性(“半径”,函数(d){ret