- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是我从它们的大小中找到的 d3js 折线图。我想增加图表中弹出的黑色工具提示详细信息的大小。有谁知道如何增加此折线图中工具提示的大小?我试过一段时间但找不到如何增加或减少它。
;( function() {
var data = {
lineChart : [
{
date : '2006-02-22',
label : 'foo',
value : 950
},
{
date : '2006-08-22',
label : 'bar',
value : 1000
},
{
date : '2007-01-11',
label : 'baz',
value : 700
},
{
date : '2008-10-01',
label : 'boing',
value : 534
},
{
date : '2009-02-24',
label : 'loool',
value : 1423
},
{
date : '2010-12-30',
label : 'YEAH',
value : 1222
},
{
date : '2011-05-15',
label : 'Hurray',
value : 948
},
{
date : '2012-04-02',
label : 'WTF',
value : 1938
},
{
date : '2013-08-19',
label : 'OMG',
value : 1245
},
{
date : '2013-11-11',
label : 'ROFL',
value : 888
}
],
pieChart : [
{
color : 'red',
description : 'Ipsem lorem text goes here. And foo goes bar goes baz. That\'s up!!!',
title : 'flowers',
value : 0.62
},
{
color : 'blue',
description : 'Another ipsem text goes here. And baz goes bar goes foo. Oh yeah, whazzz up?',
title : 'trains',
value : 0.38
}
]
};
var DURATION = 1500;
var DELAY = 500;
/**
* draw the fancy line chart
*
* @param {String} elementId elementId
* @param {Array} data data
*/
function drawLineChart( elementId, data ) {
// parse helper functions on top
var parse = d3.time.format( '%Y-%m-%d' ).parse;
// data manipulation first
data = data.map( function( datum ) {
datum.date = parse( datum.date );
return datum;
} );
// TODO code duplication check how you can avoid that
var containerEl = document.getElementById( elementId ),
width = containerEl.clientWidth,
height = width * 0.4,
margin = {
top : 30,
right : 10,
left : 10
},
detailWidth = 98,
detailHeight = 55,
detailMargin = 10,
container = d3.select( containerEl ),
svg = container.select( 'svg' )
.attr( 'width', width )
.attr( 'height', height + margin.top ),
x = d3.time.scale().range( [ 0, width - detailWidth ] ),
xAxis = d3.svg.axis().scale( x )
.ticks ( 8 )
.tickSize( -height ),
xAxisTicks = d3.svg.axis().scale( x )
.ticks( 16 )
.tickSize( -height )
.tickFormat( '' ),
y = d3.scale.linear().range( [ height, 0 ] ),
yAxisTicks = d3.svg.axis().scale( y )
.ticks( 12 )
.tickSize( width )
.tickFormat( '' )
.orient( 'right' ),
area = d3.svg.area()
.interpolate( 'linear' )
.x( function( d ) { return x( d.date ) + detailWidth / 2; } )
.y0( height )
.y1( function( d ) { return y( d.value ); } ),
line = d3.svg.line()
.interpolate( 'linear' )
.x( function( d ) { return x( d.date ) + detailWidth / 2; } )
.y( function( d ) { return y( d.value ); } ),
startData = data.map( function( datum ) {
return {
date : datum.date,
value : 0
};
} ),
circleContainer;
// Compute the minimum and maximum date, and the maximum price.
x.domain( [ data[ 0 ].date, data[ data.length - 1 ].date ] );
// hacky hacky hacky :(
y.domain( [ 0, d3.max( data, function( d ) { return d.value; } ) + 700 ] );
svg.append( 'g' )
.attr( 'class', 'lineChart--xAxisTicks' )
.attr( 'transform', 'translate(' + detailWidth / 2 + ',' + height + ')' )
.call( xAxisTicks );
svg.append( 'g' )
.attr( 'class', 'lineChart--xAxis' )
.attr( 'transform', 'translate(' + detailWidth / 2 + ',' + ( height + 7 ) + ')' )
.call( xAxis );
svg.append( 'g' )
.attr( 'class', 'lineChart--yAxisTicks' )
.call( yAxisTicks );
// Add the line path.
svg.append( 'path' )
.datum( startData )
.attr( 'class', 'lineChart--areaLine' )
.attr( 'd', line )
.transition()
.duration( DURATION )
.delay( DURATION / 2 )
.attrTween( 'd', tween( data, line ) )
.each( 'end', function() {
drawCircles( data );
} );
// Add the area path.
svg.append( 'path' )
.datum( startData )
.attr( 'class', 'lineChart--area' )
.attr( 'd', area )
.transition()
.duration( DURATION )
.attrTween( 'd', tween( data, area ) );
// Helper functions!!!
function drawCircle( datum, index ) {
circleContainer.datum( datum )
.append( 'circle' )
.attr( 'class', 'lineChart--circle' )
.attr( 'r', 0 )
.attr(
'cx',
function( d ) {
return x( d.date ) + detailWidth / 2;
}
)
.attr(
'cy',
function( d ) {
return y( d.value );
}
)
.on( 'mouseenter', function( d ) {
d3.select( this )
.attr(
'class',
'lineChart--circle lineChart--circle__highlighted'
)
.attr( 'r', 7 );
d.active = true;
showCircleDetail( d );
} )
.on( 'mouseout', function( d ) {
d3.select( this )
.attr(
'class',
'lineChart--circle'
)
.attr( 'r', 6 );
if ( d.active ) {
hideCircleDetails();
d.active = false;
}
} )
.on( 'click touch', function( d ) {
if ( d.active ) {
showCircleDetail( d )
} else {
hideCircleDetails();
}
} )
.transition()
.delay( DURATION / 10 * index )
.attr( 'r', 6 );
}
function drawCircles( data ) {
circleContainer = svg.append( 'g' );
data.forEach( function( datum, index ) {
drawCircle( datum, index );
} );
}
function hideCircleDetails() {
circleContainer.selectAll( '.lineChart--bubble' )
.remove();
}
function showCircleDetail( data ) {
var details = circleContainer.append( 'g' )
.attr( 'class', 'lineChart--bubble' )
.attr(
'transform',
function() {
var result = 'translate(';
result += x( data.date );
result += ', ';
result += y( data.value ) - detailHeight - detailMargin;
result += ')';
return result;
}
);
details.append( 'path' )
.attr( 'd', 'M2.99990186,0 C1.34310181,0 0,1.34216977 0,2.99898218 L0,47.6680579 C0,49.32435 1.34136094,50.6670401 3.00074875,50.6670401 L44.4095996,50.6670401 C48.9775098,54.3898926 44.4672607,50.6057129 49,54.46875 C53.4190918,50.6962891 49.0050244,54.4362793 53.501875,50.6670401 L94.9943116,50.6670401 C96.6543075,50.6670401 98,49.3248703 98,47.6680579 L98,2.99898218 C98,1.34269006 96.651936,0 95.0000981,0 L2.99990186,0 Z M2.99990186,0' )
.attr( 'width', detailWidth )
.attr( 'height', detailHeight );
var text = details.append( 'text' )
.attr( 'class', 'lineChart--bubble--text' );
text.append( 'tspan' )
.attr( 'class', 'lineChart--bubble--label' )
.attr( 'x', detailWidth / 2 )
.attr( 'y', detailHeight / 3 )
.attr( 'text-anchor', 'middle' )
.text( data.label );
text.append( 'tspan' )
.attr( 'class', 'lineChart--bubble--value' )
.attr( 'x', detailWidth / 2 )
.attr( 'y', detailHeight / 4 * 3 )
.attr( 'text-anchor', 'middle' )
.text( data.value );
}
function tween( b, callback ) {
return function( a ) {
var i = d3.interpolateArray( a, b );
return function( t ) {
return callback( i ( t ) );
};
};
}
}
function ಠ_ಠ() {
drawLineChart( 'lineChart', data.lineChart );
}
// yeah, let's kick things off!!!
ಠ_ಠ();
})();
/**
* Variable power
*/
* {
-moz-box-sizing: border-box;
box-sizing: border-box;
}
body {
font-size: 14px;
font-family: sans-serif;
font-weight: 100;
background-color: #ccc;
background-image: linear-gradient(transparent 50%, rgba(255, 255, 255, 0.5) 25%);
background-size: 4px 4px;
}
body ul {
list-style: none;
}
body ul, body li {
margin: 0;
padding: 0;
}
.chart {
min-height: 400px;
border-bottom: 1px solid #eee;
padding: 1em;
}
.chart--headline, .chart--subHeadline {
text-align: center;
}
.chart--headline {
position: relative;
font-weight: 100;
font-size: 28px;
}
.chart--headline:before {
position: absolute;
content: '';
bottom: 133%;
left: 50%;
width: 25%;
margin: 0 0 0 -12.5%;
border-top: 1px dashed #999999;
}
.chart--subHeadline {
font-weight: 400;
font-size: 14px;
letter-spacing: 1px;
}
.charts--container {
background-color: #fff;
width: 100%;
}
@media screen and (min-width: 700px) {
.charts--container {
max-width: 700px;
left: 50%;
top: 10%;
margin: 5em auto;
box-shadow: 0 2em 2em #333;
}
}
.charts--headline {
text-align: center;
color: #444;
background-color: #fff;
padding: 1em;
}
.lineChart--area {
fill: url(#lineChart--gradientBackgroundArea);
}
.lineChart--areaLine {
fill: none;
stroke: #6bb7c7;
stroke-width: 3;
}
.lineChart--bubble--label {
fill: none;
stroke: #6bb7c7;
font-size: 12.6px;
font-style: italic;
font-weight: 100;
}
.lineChart--bubble--value {
fill: #fff;
stroke: #fff;
font-size: 21px;
font-weight: 100;
}
.lineChart--circle {
fill: #6bb7c7;
stroke: #fff;
stroke-width: 3;
}
.lineChart--circle__highlighted {
fill: #fff;
stroke: #3f94a7;
}
.lineChart--gradientBackgroundArea--top {
stop-color: #6bb7c7;
stop-opacity: 0.1;
}
.lineChart--gradientBackgroundArea--bottom {
stop-color: #6bb7c7;
stop-opacity: 0.6;
}
.lineChart--svg {
border: 1px solid #eee;
}
.lineChart--xAxisTicks .domain, .lineChart--xAxis .domain, .lineChart--yAxisTicks .domain {
display: none;
}
.lineChart--xAxis .tick line {
display: none;
}
.lineChart--xAxisTicks .tick line, .lineChart--yAxisTicks .tick line {
fill: none;
stroke: #b3b3b3;
stroke-width: 1;
stroke-dasharray: 2,2;
}
/**
* Helper classes
*/
.hidden {
display: none;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
<h1 class="charts--headline">Wanna check the code?<br>Click "Edit this pen" in left bottom corner.</h1>
<div class="charts--container">
<ul>
<li class="chart">
<div id="pieChart">
<svg id="pieChartSVG">
<defs>
<filter id='pieChartInsetShadow'>
<feOffset dx='0' dy='0'/>
<feGaussianBlur stdDeviation='3' result='offset-blur' />
<feComposite operator='out' in='SourceGraphic' in2='offset-blur' result='inverse' />
<feFlood flood-color='black' flood-opacity='1' result='color' />
<feComposite operator='in' in='color' in2='inverse' result='shadow' />
<feComposite operator='over' in='shadow' in2='SourceGraphic' />
</filter>
<filter id="pieChartDropShadow">
<feGaussianBlur in="SourceAlpha" stdDeviation="3" result="blur" />
<feOffset in="blur" dx="0" dy="3" result="offsetBlur" />
<feMerge>
<feMergeNode />
<feMergeNode in="SourceGraphic" />
</feMerge>
</filter>
</defs>
</svg>
</div>
</li>
<li class="chart">
<h3 class="chart--subHeadline">Chart 2</h3>
<h2 class="chart--headline">Area Label Would Go Here</h2>
<div id="lineChart">
<svg id="lineChartSVG" class="lineChart--svg">
<defs>
<linearGradient id="lineChart--gradientBackgroundArea" x1="0" x2="0" y1="0" y2="1">
<stop class="lineChart--gradientBackgroundArea--top" offset="0%" />
<stop class="lineChart--gradientBackgroundArea--bottom" offset="100%" />
</linearGradient>
</defs>
</svg>
</div>
</li>
</ul>
</div>
非常感谢任何帮助来解决这个问题。
最佳答案
在上面的示例工具提示中,使用 svg 路径创建气泡。
details.append( 'path' )
.attr( 'd', 'M2.99990186,0 C1.34310181,0 0,1.34216977 0,2.99898218 L0,47.6680579 C0,49.32435 1.34136094,50.6670401 3.00074875,50.6670401 L44.4095996,50.6670401 C48.9775098,54.3898926 44.4672607,50.6057129 49,54.46875 C53.4190918,50.6962891 49.0050244,54.4362793 53.501875,50.6670401 L94.9943116,50.6670401 C96.6543075,50.6670401 98,49.3248703 98,47.6680579 L98,2.99898218 C98,1.34269006 96.651936,0 95.0000981,0 L2.99990186,0 Z M2.99990186,0' )
.attr( 'width', detailWidth )
.attr( 'height', detailHeight );
要更改工具提示的宽度,您需要相应地更改 svg 路径值。您可以使用在线 svg 编辑器来编辑 svg 路径。
关于javascript - d3js 工具提示大小/宽度变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32003085/
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
我试图用这种形式简单地获取数字 28 integer+space+integer+integer+space+integer我试过这个正则表达式 \\s\\d\\d\\s 但我得到了两个数字11 和
最近一直在学习D语言。我一直对运行时感到困惑。 从我能收集到的关于它的信息中,(这不是很多)我知道它是一种有助于 D 的一些特性的运行时。像垃圾收集一样,它与您自己的程序一起运行。但是既然 D 是编译
想问一下这两个正则表达式有区别吗? \d\d\d 与 \d{3} 我已经在我的本地机器上使用 Java 和 Windows 操作系统对此进行了测试,两者都工作正常并且结果相同。但是,当在 linux
我正在学习 Go,而且我坚持使用 Go 之旅(exercise-stringer.go:https://tour.golang.org/methods/7)。 这是一些代码: type IPAddr
我在Java正则表达式中发现了一段令我困惑的代码: Pattern.compile( "J.*\\d[0-35-9]-\\d\\d-\\d\\d" ); 要编译的字符串是: String string
我在 ruby 代码上偶然发现了这个。我知道\d{4})\/(\d\d)\/(\d\d)\/(.*)/是什么意思,但是\1-\2-\3-\4 是什么意思? 最佳答案 \1-\2-\3-\4 是 b
我一直在努力解决这个问题,这让我很恼火。我了解 D 运行时库。它是什么,它做什么。我也明白你可以在没有它的情况下编译 D 应用程序。就像 XoMB 所做的那样。好吧,XoMB 定义了自己的运行时,但是
我有两个列表列表,子列表代表路径。我想找到所有路径。 List> pathList1 List> pathList2 当然是天真的解决方案: List> result = new ArrayList>
我需要使用 Regex 格式化一个字符串,该字符串包含数字、字母 a-z 和 A-Z,同时还包含破折号和空格。 从用户输入我有02-219 8 53 24 输出应该是022 198 53 24 我正在
目标是达到与this C++ example相同的效果: 避免创建临时文件。我曾尝试将 C++ 示例翻译为 D,但没有成功。我也尝试过不同的方法。 import std.datetime : benc
tl;dr:你好吗perfect forwarding在 D? 该链接有一个很好的解释,但例如,假设我有这个方法: void foo(T)(in int a, out int b, ref int c
有什么方法可以在 D 中使用abstract auto 函数吗? 如果我声明一个类如下: class MyClass { abstract auto foo(); } 我收到以下错误: mai
有没有人为内存中重叠的数组切片实现交集?算法在没有重叠时返回 []。 当 pretty-print (使用重叠缩进)内存中重叠的数组切片时,我想要这个。 最佳答案 如果您确定它们是数组,那么只需取 p
我已经开始学习 D,但我在使用 Andrei Alexandrescu 所著的 The D Programming Language 一书中提供的示例时遇到了一些麻烦。由于 int 和 ulong 类
如何创建一个不可变的类? 我的目标是创建一个实例始终不可变的类。现在我只是用不可变的方法和构造函数创建了一个“可变”类。我将其称为 mData,m 表示可变。然后我创建一个别名 alias immut
不久前我买了《The D Programming Language》。好书,很有教育意义。但是,我在尝试编译书中列出的语言功能时遇到了麻烦:扩展函数。 在这本书中,Andrei 写了任何可以像这样调用
我在 D http://www.digitalmars.com/d/2.0/lazy-evaluation.html 中找到了函数参数的惰性求值示例 我想知道如何在 D 中实现可能的无限数据结构,就像
这个问题在这里已经有了答案: 12 年前关闭。 Possible Duplicate: Could anyone explain these undefined behaviors (i = i++
当前是否可以跨模块扫描/查询/迭代具有某些属性的所有函数(或类)? 例如: source/packageA/something.d: @sillyWalk(10) void doSomething()
我是一名优秀的程序员,十分优秀!