- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
作为起始行,我采用了以下代码:https://bl.ocks.org/mbostock/882152我正在尝试创建一个分组条形图,该图(例如)将包含三个系列,每个系列都有 6 个样本。我希望每个系列都根据从后端传递的信息相对于其自己的 Y 轴(主要或次要)。例如,如果系列之一具有 AxisType = "1"
那么它将与左 Y 轴相关,否则如果 AxisType = "2"
那么它将是与右 Y 轴相关。我试图自己实现我想要的结果,但是我被困在脚本创建矩形的部分。看看下面的结果,如何才能实现该系列的最后一个(绿色条)与第二个 Y 轴相关,而不是第一个 Y 轴?
var n = 6, // number of samples
m = 3; // number of series
var dataset = {
GraphType: 0,
Data: []
};
dataset.Data.push(
{
Axes: [],
AxisType: "1",
SeriesData: [{ state: 'CA', age: 2704659 },
{ state: 'TX', age: 2027307 },
{ state: 'NY', age: 1208495 },
{ state: 'FL', age: 1140516 },
{ state: 'IL', age: 894368 },
{ state: 'PA', age: 737462 }],
GraphType: 0,
SeriesName: "Under 5 Years"
},
{
Axes: [],
AxisType: "1",
SeriesData: [{ state: 'CA', age: 4499890 },
{ state: 'TX', age: 3277946 },
{ state: 'NY', age: 2141490 },
{ state: 'FL', age: 1938695 },
{ state: 'IL', age: 1558919 },
{ state: 'PA', age: 1345341 }],
GraphType: 0,
SeriesName: "5 to 13 Years"
},
{
Axes: [],
AxisType: "2",
SeriesData: [{ state: 'CA', age: 2159981 },
{ state: 'TX', age: 1420518 },
{ state: 'NY', age: 1058031 },
{ state: 'FL', age: 925060 },
{ state: 'IL', age: 725973 },
{ state: 'PA', age: 1679201}],
GraphType: 0,
SeriesName: "14 to 17 Years"
}
);
var margin = { top: 20, right: 80, bottom: 30, left: 80 },
width = 960 - margin.left - margin.right,
height = 500 - margin.top - margin.bottom;
var y = d3.scale.linear()
.domain([0, 4499890]) // the biggest number for Primary Axis
.range([height, 0]);
var y2 = d3.scale.linear()
.domain([0, 1679201]) // the biggest number for Secondary Axis
.range([height, 0]);
var x0 = d3.scale.ordinal();
x0.domain(dataset.Data[0].SeriesData.map(function (d) { return d.state; }));
x0.rangeBands([0, width], .2);
var x1 = d3.scale.ordinal()
.domain(d3.range(m))
.rangeBands([0, x0.rangeBand()]);
// colors
var z = d3.scale.category10();
var xAxis = d3.svg.axis()
.scale(x0)
.orient("bottom");
var yAxis = d3.svg.axis()
.scale(y)
.orient("left");
var ySecAxis = d3.svg.axis()
.scale(y2)
.orient("right");
// Append svg
var svg = d3.select("body").append("svg")
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top + margin.bottom)
.append("svg:g")
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
// Append y axis
svg.append("g")
.attr("class", "y axis")
.call(yAxis);
// Append secondary y axis
svg.append("g")
.attr("class", "y2 axis")
.attr("transform", "translate(" + width + " ,0)")
.call(ySecAxis);
// Append x axis
svg.append("g")
.attr("class", "x axis")
.attr("transform", "translate(0," + height + ")")
.call(xAxis);
svg.append("g").selectAll("g")
.data(dataset.Data)
.enter().append("g")
.style("fill", function (d, i) { return z(i); })
.attr("transform", function (d, i) { return "translate(" + x1(i) + ",0)"; })
.selectAll("rect")
.data(function(d) { return d.SeriesData; })
.enter().append("rect")
.attr("width", x1.rangeBand())
.attr("height", function (d) { return height - y(d.age); })
.attr("x", function (d) { return x0(d.state); })
.attr("y", function (d) { return y(d.age); });
.axis text {
font: 10px sans-serif;
}
.axis path,
.axis line {
fill: none;
stroke: #000;
shape-rendering: crispEdges;
}
.x.axis path {
display: none;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
最佳答案
我找到了一种方法来做到这一点:不要忘记匿名函数也可以有三个参数:
function (d, i, j) { .... }
其中 d
是数据,i
是内部迭代器,j
是外部迭代器。解决方案如下例所示:
var n = 6, // number of samples
m = 3; // number of series
var dataset = {
GraphType: 0,
Data: []
};
dataset.Data.push(
{
Axes: [],
AxisType: "1",
SeriesData: [{ state: 'CA', age: 2704659 },
{ state: 'TX', age: 2027307 },
{ state: 'NY', age: 1208495 },
{ state: 'FL', age: 1140516 },
{ state: 'IL', age: 894368 },
{ state: 'PA', age: 737462 }],
GraphType: 0,
SeriesName: "Under 5 Years"
},
{
Axes: [],
AxisType: "1",
SeriesData: [{ state: 'CA', age: 4499890 },
{ state: 'TX', age: 3277946 },
{ state: 'NY', age: 2141490 },
{ state: 'FL', age: 1938695 },
{ state: 'IL', age: 1558919 },
{ state: 'PA', age: 1345341 }],
GraphType: 0,
SeriesName: "5 to 13 Years"
},
{
Axes: [],
AxisType: "2",
SeriesData: [{ state: 'CA', age: 2159981 },
{ state: 'TX', age: 1420518 },
{ state: 'NY', age: 1058031 },
{ state: 'FL', age: 925060 },
{ state: 'IL', age: 725973 },
{ state: 'PA', age: 1679201}],
GraphType: 0,
SeriesName: "14 to 17 Years"
}
);
var margin = { top: 20, right: 80, bottom: 30, left: 80 },
width = 960 - margin.left - margin.right,
height = 500 - margin.top - margin.bottom;
var y = d3.scale.linear()
.domain([0, 4499890]) // the biggest number for Primary Axis
.range([height, 0]);
var y2 = d3.scale.linear()
.domain([0, 1679201]) // the biggest number for Secondary Axis
.range([height, 0]);
var x0 = d3.scale.ordinal();
x0.domain(dataset.Data[0].SeriesData.map(function (d) { return d.state; }));
x0.rangeBands([0, width], .2);
var x1 = d3.scale.ordinal()
.domain(d3.range(m))
.rangeBands([0, x0.rangeBand()]);
// colors
var z = d3.scale.category10();
var xAxis = d3.svg.axis()
.scale(x0)
.orient("bottom");
var yAxis = d3.svg.axis()
.scale(y)
.orient("left");
var ySecAxis = d3.svg.axis()
.scale(y2)
.orient("right");
// Append svg
var svg = d3.select("body").append("svg")
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top + margin.bottom)
.append("svg:g")
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
// Append y axis
svg.append("g")
.attr("class", "y axis")
.call(yAxis);
// Append secondary y axis
svg.append("g")
.attr("class", "y2 axis")
.attr("transform", "translate(" + width + " ,0)")
.call(ySecAxis);
// Append x axis
svg.append("g")
.attr("class", "x axis")
.attr("transform", "translate(0," + height + ")")
.call(xAxis);
svg.append("g").selectAll("g")
.data(dataset.Data)
.enter().append("g")
.style("fill", function (d, i) { return z(i); })
.attr("transform", function (d, i) { return "translate(" + x1(i) + ",0)"; })
.selectAll("rect")
.data(function (d) { return d.SeriesData; })
.enter().append("rect")
.attr("width", x1.rangeBand())
.attr("height", function (d, i, j) { // <----- the change is from here
if (dataset.Data[j].AxisType === "1")
return height - y(d.age);
return height - y2(d.age);
})
.attr("x", function (d) { return x0(d.state); })
.attr("y", function (d, i, j) {
if (dataset.Data[j].AxisType === "1")
return y(d.age);
return y2(d.age);
}); // <------ to here
.axis text {
font: 10px sans-serif;
}
.axis path,
.axis line {
fill: none;
stroke: #000;
shape-rendering: crispEdges;
}
.x.axis path {
display: none;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
关于javascript - d3.js,具有两个 Y 轴的分组条形图,与 Y1 或 Y2 相关的系列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36486259/
您好,我正在处理 BIRT 报告。我有一个查询,我必须对父级的重复数据进行分组,但子级也不能分组! 在我的查询中: item 是父项,item_ledger_entry 是子项。我有来自 item.N
我正在使用 GA API。 这是针对 MCF 目标报告(底部)的标准目标完成指标表(顶部) 看一下这个: 总数加起来 (12,238),但看看按 channel 分组的分割有多么不同!我以为这些会很接
我正在开发一个流量计数器,我想获得 IP 和重复计数,但是如何? 就像是 :select ip, count(ip) from Redirect 返回 : null total ip count 重定
我尝试编写一个正则表达式来匹配条件表达式,例如: a!=2 1+2=2+a 我尝试提取运算符。我当前的正则表达式是“.+([!=<>]+).+” 但问题是匹配器总是尝试匹配组中可能的最短字符串
在 MS Transact SQL 中,假设我有一个这样的表(订单): Order Date Order Total Customer # 09/30/2008 8
我想按 m.ID 分组,并对每个 m.id 求和 (pm.amount_construction* prod.anzahl) 实际上我有以下结果: Meterial_id | amount_const
我想根据多列中的值对值进行分组。这是一个例子: 我想得到输出: {{-30,-50,20},{-20,30,60},{-30,NULL or other value, 20}} 我设法到达: SELE
我正在尝试找出运行此查询的最佳方式。我基本上需要返回在我们的系统中只下了一个订单的客户的“登录”字段列表(登录字段基本上是客户 ID/ key )。 我们系统的一些背景...... 客户在同一日期下的
给定以下mysql结果集: id code name importance '1234', 'ID-CS-B', 'Chocolate Sauce'
大家好,我的数据框中有以下列: LC_REF 1 DT 16 2C 2 DT 16 2C 3 DT 16 2C 1 DT 16 3C 6 DT 16 3C 3
我有这样的 mongoDB 集合 { "_id" : "EkKTRrpH4FY9AuRLj", "stage" : 10, }, { "_id" : "EkKTRrpH4FY9
假设我有一组数据对,其中 index 0 是值,index 1 是类型: input = [ ('11013331', 'KAT'), ('9085267',
java中用stream进行去重,排序,分组 一、distinct 1. 八大基本数据类型 List collect = ListUtil.of(1, 2, 3, 1, 2).stream().fil
基本上,我从 TABLE_A 中的这个开始 France - 100 France - 200 France - 300 Mexico - 50 Mexico - 50 Mexico - 56 Pol
我希望这个正则表达式 ([A-Z]+)$ 将选择此示例中的最后一次出现: AB.012.00.022ABC-1 AB.013.00.022AB-1 AB.014.00.022ABAB-1 但我没有匹配
我创建了一个数据透视表,但数据没有组合在一起。 任何人都可以帮助我获得所需的格式吗? 我为获取数据透视表而编写的查询: DECLARE @cols AS NVARCHAR(MAX), -- f
我想按时间段(月,周,日,小时,...)选择计数和分组。例如,我想选择行数并将它们按 24 小时分组。 我的表创建如下。日期是时间戳。 CREATE TABLE MSG ( MSG_ID dec
在 SQL Server 2005 中,我有一个包含如下数据的表: WTN------------Date 555-111-1212 2009-01-01 555-111-1212 2009-
题 假设我有 k 个标量列,如果它们沿着每列彼此在一定距离内,我想对它们进行分组。 假设简单 k 是 2 并且它们是我唯一的列。 pd.DataFrame(list(zip(sorted(choice
问题 在以下数据框中 df : import random import pandas as pd random.seed(999) sz = 50 qty = {'one': 1, 'two': 2
我是一名优秀的程序员,十分优秀!