- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用 blockbuilder.org 和 Mike Bostock 可重用图表技术的一些片段创建了 d3 图表。
但是,我想为多个图表设置一个 y 轴。在这里,每当我调用 select 函数时,我都会为每个折线图创建 Y 轴。
还有更多我必须在这里提到的事情,我必须只为最后选中的复选框图表显示 Y 轴,这将是底部图表。
这里是 Jsfiddle我工作过
以下是加载片段
$(window).load(function () {
var textareas$ = $('#chartarea div');
textareas$.hide();
$('input[name="Air"]').change(function () {
var elem$ = $(this);
var correspelem$ = textareas$.eq(elem$.val() - 1);
if (elem$.val() == 1) {
select('Retail', "#Retail");
} else if (elem$.val() == 2) {
select("Gas", "#Gas");
} else if (elem$.val() == 3) {
select("Dining", "#Dining");
} else {};
if (elem$.is(':checked')) correspelem$.show();
else correspelem$.hide();
});
});
var data = [ // <-A
{
date: "2014/01",
Gas: 10,
Retail: 22,
Dining: 120
},
{
date: "2014/02",
Gas: 10,
Retail: 42,
Dining: 53
},
{
date: "2014/03",
Gas: 30,
Retail: 24,
Dining: 76
},
{
date: "2014/04",
Gas: 50,
Retail: 29,
Dining: 49
},
{
date: "2014/05",
Gas: 80,
Retail: 47,
Dining: 47
},
{
date: "2014/06",
Gas: 65,
Retail: 78,
Dining: 64
},
{
date: "2014/07",
Gas: 55,
Retail: 38,
Dining: 29
},
{
date: "2014/08",
Gas: 43,
Retail: 34,
Dining: 47
},
{
date: "2014/09",
Gas: 20,
Retail: 54,
Dining: 34
},
{
date: "2014/10",
Gas: 10,
Retail: 34,
Dining: 27
},
{
date: "2014/11",
Gas: 43,
Retail: 8,
Dining: 45
},
{
date: "2014/12",
Gas: 40,
Retail: 26,
Dining: 28
},
{
date: "2015/01",
Gas: 10,
Retail: 34,
Dining: 54
},
{
date: "2015/02",
Gas: 15,
Retail: 29,
Dining: 28
},
{
date: "2015/03",
Gas: 30,
Retail: 19,
Dining: 43
},
{
date: "2015/04",
Gas: 50,
Retail: 23,
Dining: 43
},
{
date: "2015/05",
Gas: 80,
Retail: 49,
Dining: 43
},
{
date: "2015/06",
Gas: 65,
Retail: 32,
Dining: 43
},
{
date: "2015/07",
Gas: 55,
Retail: 25,
Dining: 39
},
{
date: "2015/08",
Gas: 30,
Retail: 35,
Dining: 47
},
{
date: "2015/09",
Gas: 20,
Retail: 54,
Dining: 37
},
{
date: "2015/10",
Gas: 10,
Retail: 34,
Dining: 54
},
{
date: "2015/11",
Gas: 8,
Retail: 29,
Dining: 44
},
{
date: "2015/12",
Gas: 40,
Retail: 14,
Dining: 45
},
{
date: "2016/01",
Gas: 10,
Retail: 15,
Dining: 34
},
{
date: "2016/02",
Gas: 15,
Retail: 34,
Dining: 23
},
{
date: "2016/03",
Gas: 30,
Retail: 28,
Dining: 45
},
{
date: "2016/04",
Gas: 50,
Retail: 34,
Dining: 65
},
{
date: "2016/05",
Gas: 80,
Retail: 45,
Dining: 67
},
{
date: "2016/06",
Gas: 65,
Retail: 35,
Dining: 65
},
{
date: "2016/07",
Gas: 55,
Retail: 43,
Dining: 36
},
{
date: "2016/08",
Gas: 30,
Retail: 34,
Dining: 53
},
{
date: "2016/09",
Gas: 20,
Retail: 54,
Dining: 76
},
{
date: "2016/10",
Gas: 10,
Retail: 45,
Dining: 65
},
{
date: "2016/11",
Gas: 8,
Retail: 43,
Dining: 56
},
{
date: "2016/12",
Gas: 40,
Retail: 23,
Dining: 64
}
];
var formatDate = d3.time.format("%b %Y");
function timeSeriesChart() {
var margin = {top: 20, right: 40, bottom: 30, left: 40},
width = 1150,
height = 120,
xValue = function(d) { return d[0]; },
yValue = function(d) { return d[1]; },
xScale = d3.time.scale(),
yScale = d3.scale.linear(),
xAxis = d3.svg.axis()
.scale(xScale)
.orient("bottom")
.tickFormat(formatDate)
.tickSize(6, 0)
.tickPadding(1),
area = d3.svg.area()
.x(X)
.y1(Y),
line = d3.svg.line()
.x(X)
.y(Y);
function chart(selection) {
selection.each(function(data) {
// Convert data to standard representation greedily;
// this is needed for nondeterministic accessors.
data = data.map(function(d, i) {
return [xValue.call(data, d, i), yValue.call(data, d, i)];
});
// Update the x-scale.
xScale
.domain(d3.extent(data, function(d) { return d[0]; }))
.range([0, width - margin.left - margin.right]);
// Update the y-scale.
yScale
.domain([0, d3.max(data, function(d) { return d[1]; })])
.range([height - margin.top - margin.bottom, 0]);
// Select the svg element, if it exists.
var svg = d3.select(this).selectAll("svg")
.data([data]);
// Otherwise, create the skeletal chart.
var gEnter = svg.enter().append("svg")
.append("g");
gEnter.append("path")
.attr("class", "area");
gEnter.append("path")
.attr("class", "line");
gEnter.append("g")
.attr("class", "x axis");
// Update the outer dimensions.
svg .attr("width", width)
.attr("height", height);
// Update the inner dimensions.
var g = svg.select("g")
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
// Update the area path.
// g.select(".area")
// .attr("d", area.y0(yScale.range()[0]));
// Update the line path.
g.select(".line")
.attr("d", line);
// Update the x-axis.
g.select(".x.axis")
.attr("transform", "translate(0," + yScale.range()[0] + ")")
.call(xAxis);
});
}
// The x-accessor for the path generator; xScale ∘ xValue.
function X(d) {
return xScale(d[0]);
}
// The x-accessor for the path generator; yScale ∘ yValue.
function Y(d) {
return yScale(d[1]);
}
chart.margin = function(_) {
if (!arguments.length) return margin;
margin = _;
return chart;
};
chart.width = function(_) {
if (!arguments.length) return width;
width = _;
return chart;
};
chart.height = function(_) {
if (!arguments.length) return height;
height = _;
return chart;
};
chart.x = function(_) {
if (!arguments.length) return xValue;
xValue = _;
return chart;
};
chart.y = function(_) {
if (!arguments.length) return yValue;
yValue = _;
return chart;
};
return chart;
}
var chart = timeSeriesChart()
.x(function(d) { return new Date(d.date); })
.y(function(d) { return +d['category']; });
function select(category, id) {
var dataset = [];
dataset = data.map(function(d) {
return {
date:d.date,
category:d[category]
};
})
d3.select(id)
.datum(dataset)
.call(chart);
}
ul {
list-style: none;
}
ul li {
margin: 10px;
font-size: 15px;
display: inline-block;
}
#chartarea {
display: table;
height: 470px;
width: 1150px;
box-shadow: 10px 10px 5px #c0c0c0
}
#Retail {
margin: 5px;
padding: 5px 5px 5px 5px;
width: 1150px;
box-shadow: 5px 5px 5px #808080;
}
#Gas {
margin: 5px;
padding: 5px 5px 5px 5px;
width: 720px;
box-shadow: 5px 5px 5px #808080;
}
#Dining {
margin: 5px;
padding: 5px 5px 5px 5px;
width: 720px;
box-shadow: 5px 5px 5px #808080;
}
.line {
fill: none;
stroke: #000;
stroke-width: 1.5px;
}
.area {
fill: #969696;
}
.attention {
background: yellow;
margin: -4px;
padding: 4px;
}
.Retail,
.Gas,
.Dining {
min-height: 22px;
min-width: 10px;
width: 0px;
height: 0px;
background-color: steelblue;
margin-bottom: 3px;
font-size: 11px;
color: #f0f8ff;
text-align: right;
padding-right: 2px;
}
#Gas,
#Dining,
#Retail {
display: table-row;
height: auto;
width: auto;
overflow: hidden;
}
<script src="http://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min.js"></script>
<script src="http://code.jquery.com/jquery-1.9.1.js"></script>
<div id="options">
<h2>Options</h2>
<ul>
<li><input type="checkbox" name="Air" id="Ground1" value="1">Retail</li>
<li><input type="checkbox" name="Air" id="Ground2" value="2">Gas</li>
<li><input type="checkbox" name="Air" id="Ground2" value="3">Dining</li>
</ul>
</div>
<h2>Chart Area</h2>
<div id="chartarea">
<div id="Retail">Retail</div>
<div id="Gas">Gas</div>
<div id="Dining">Dining</div>
</div>
请指教,如果需要任何进一步的信息。
最佳答案
将此代码添加到您的“更改”处理程序中:
var chartAxis = document.querySelectorAll('#chartarea .axis.x');
chartAxis.forEach((elem, index) => index !== chartAxis.length - 1 ? elem.style.display = 'none' : elem.style.display = 'block');
关于javascript - 使用 d3 的相同 X 轴多折线图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45690734/
问题故障解决记录 -- Java RMI Connection refused to host: x.x.x.x .... 在学习JavaRMI时,我遇到了以下情况 问题原因:可
我正在玩 Rank-N-type 并尝试输入 x x .但我发现这两个函数可以以相同的方式输入,这很不直观。 f :: (forall a b. a -> b) -> c f x = x x g ::
这个问题已经有答案了: How do you compare two version Strings in Java? (31 个回答) 已关闭 8 年前。 有谁知道如何在Java中比较两个版本字符串
这个问题已经有答案了: How do the post increment (i++) and pre increment (++i) operators work in Java? (14 个回答)
下面是带有 -n 和 -r 选项的 netstat 命令的输出,其中目标字段显示压缩地址 (127.1/16)。我想知道 netstat 命令是否有任何方法或选项可以显示整个目标 IP (127.1.
我知道要证明 : (¬ ∀ x, p x) → (∃ x, ¬ p x) 证明是: theorem : (¬ ∀ x, p x) → (∃ x, ¬ p x) := begin intro n
x * x 如何通过将其存储在“auto 变量”中来更改?我认为它应该仍然是相同的,并且我的测试表明类型、大小和值显然都是相同的。 但即使 x * x == (xx = x * x) 也是错误的。什么
假设,我们这样表达: someIQueryable.Where(x => x.SomeBoolProperty) someIQueryable.Where(x => !x.SomeBoolProper
我有一个字符串 1234X5678 我使用这个正则表达式来匹配模式 .X|..X|X. 我得到了 34X 问题是为什么我没有得到 4X 或 X5? 为什么正则表达式选择执行第二种模式? 最佳答案 这里
我的一个 friend 在面试时遇到了这个问题 找到使该函数返回真值的 x 值 function f(x) { return (x++ !== x) && (x++ === x); } 面试官
这个问题在这里已经有了答案: 10年前关闭。 Possible Duplicate: Isn't it easier to work with foo when it is represented b
我是 android 的新手,我一直在练习开发一个针对 2.2 版本的应用程序,我需要帮助了解如何将我的应用程序扩展到其他版本,即 1.x、2.3.x、3 .x 和 4.x.x,以及一些针对屏幕分辨率
为什么案例 1 给我们 :error: TypeError: x is undefined on line... //case 1 var x; x.push(x); console.log(x);
代码优先: # CASE 01 def test1(x): x += x print x l = [100] test1(l) print l CASE01 输出: [100, 100
我正在努力温习我的大计算。如果我有将所有项目移至 'i' 2 个空格右侧的函数,我有一个如下所示的公式: (n -1) + (n - 2) + (n - 3) ... (n - n) 第一次迭代我必须
给定 IP 字符串(如 x.x.x.x/x),我如何或将如何计算 IP 的范围最常见的情况可能是 198.162.1.1/24但可以是任何东西,因为法律允许的任何东西。 我要带198.162.1.1/
在我作为初学者努力编写干净的 Javascript 代码时,我最近阅读了 this article当我偶然发现这一段时,关于 JavaScript 中的命名空间: The code at the ve
我正在编写一个脚本,我希望避免污染 DOM 的其余部分,它将是一个用于收集一些基本访问者分析数据的第 3 方脚本。 我通常使用以下内容创建一个伪“命名空间”: var x = x || {}; 我正在
我尝试运行我的test_container_services.py套件,但遇到了以下问题: docker.errors.APIError:500服务器错误:内部服务器错误(“ b'{” message
是否存在这两个 if 语句会产生不同结果的情况? if(x as X != null) { // Do something } if(x is X) { // Do something } 编
我是一名优秀的程序员,十分优秀!