我已经使D3甜甜圈图具有响应性,但是我希望它在任何屏幕(div)调整大小时都具有100%响应性。这个想法是计算父div的对角线,并使用它来更改半径,字体大小等。在下面的这种情况下,我使用了对角线,但没有使用大小调整功能。
是否可以快速使用大小调整功能来更改图例的半径,字体大小和矩形大小?如果是条形图,则调整大小功能非常简单。在这种情况下,我想知道是否值得在每个D3图表中创建基准。如果我使用以下基础:http://jsfiddle.net/radomer/zc8akt40/,我是否可以更改代码以使图形响应?我想,如果是的话,我将不得不更改基本代码,因为我将鼠标悬停在图表上时会丢失动画。
from google.cloud import storage
def object_metadata(bucket_name, blob_name):
"""Prints out a blob's metadata."""
storage_client = storage.Client()
bucket = storage_client.get_bucket(bucket_name)
blob = bucket.get_blob(blob_name)
print('Blob: {}'.format(blob.name))
print('Bucket: {}'.format(blob.bucket.name))
print('Storage class: {}'.format(blob.storage_class))
print('ID: {}'.format(blob.id))
print('Size: {} bytes'.format(blob.size))
print('Updated: {}'.format(blob.updated))
print('Generation: {}'.format(blob.generation))
print('Metageneration: {}'.format(blob.metageneration))
print('Etag: {}'.format(blob.etag))
print('Owner: {}'.format(blob.owner))
print('Component count: {}'.format(blob.component_count))
print('Crc32c: {}'.format(blob.crc32c))
print('md5_hash: {}'.format(blob.md5_hash))
print('Cache-control: {}'.format(blob.cache_control))
print('Content-type: {}'.format(blob.content_type))
print('Content-disposition: {}'.format(blob.content_disposition))
print('Content-encoding: {}'.format(blob.content_encoding))
print('Content-language: {}'.format(blob.content_language))
print('Metadata: {}'.format(blob.metadata))
object_metadata('bucketName', 'objectName')
//Calculate the diagonal of the parent sreen div
console.log('width')
console.log(window.innerWidth);
console.log('height')
console.log(window.innerHeight);
console.log('final');
console.log(Math.sqrt(Math.pow(window.innerWidth,2) + Math.pow(window.innerHeight,2)));
var diagonal = Math.sqrt(Math.pow(window.innerWidth,2) + Math.pow(window.innerHeight,2))/5;
//Create the D3 chart
var margin = {top: 20, right: 20, bottom: 50, left: 20},
width = parseInt(d3.select("#chart").style("width")) - margin.left - margin.right,
height = parseInt(d3.select("#chart").style("width")) - margin.top - margin.bottom,
r = diagonal,
inner = diagonal/2,
color= d3.scale.ordinal()
.range(["#124", "#214183", "#3061c2", "#4876d1", "#87a5e1", "#c5d4f1"]);
data = [{"label":"ONE", "value":194},
{"label":"TWO", "value":567},
{"label":"THREE", "value":1314},
{"label":"FOUR", "value":793},
{"label":"FIVE", "value":1929},
{"label":"SIX", "value":1383}];
var total = d3.sum(data, function(d) {
return d3.sum(d3.values(d));
});
var svg = d3.select('#chart').append("svg:svg");
var vis = svg.data([data])
.attr("width", '100%')
.attr("height", '100%')
.attr('viewBox',(-width / 2 ) + ' ' + (-height/2) + ' '+width +' '+height)
.attr('preserveAspectRatio','xMinYMin')
var textTop = vis.append("text")
.attr("dy", ".35em")
.style("text-anchor", "middle")
.attr("class", "textTop")
.text( "TOTAL" )
.attr("y", -10),
textBottom = vis.append("text")
.attr("dy", ".35em")
.style("text-anchor", "middle")
.attr("class", "textBottom")
.text(total.toFixed(2) + "m")
.attr("y", 10);
var arc = d3.svg.arc()
.innerRadius(inner)
.outerRadius(r);
var arcOver = d3.svg.arc()
.innerRadius(inner + 5)
.outerRadius(r + 5);
var pie = d3.layout.pie()
.value(function(d) { return d.value; });
var arcs = vis.selectAll("g.slice")
.data(pie)
.enter()
.append("svg:g")
.attr("class", "slice")
.on("mouseover", function(d) {
d3.select(this).select("path").transition()
.duration(200)
.attr("d", arcOver)
textTop.text(d3.select(this).datum().data.label)
.attr("y", -10);
textBottom.text(d3.select(this).datum().data.value.toFixed(2))
.attr("y", 10);
})
.on("mouseout", function(d) {
d3.select(this).select("path").transition()
.duration(100)
.attr("d", arc);
textTop.text( "TOTAL" )
.attr("y", -10);
textBottom.text(total.toFixed(2) + "m");
});
arcs.append("svg:path")
.attr("fill", function(d, i) { return color(i); } )
.attr("d", arc);
var legend = svg.append("svg")
.attr("class", "legend")
//.attr("width", r)
//.attr("height", r * 2)
.selectAll("g")
.data(data)
.enter().append("g")
.attr("transform", function(d, i) { return "translate(" + (r + 20) + "," + i * 20 + ")"; });
legend.append("rect")
.attr("width", 18)
.attr("height", 18)
.style("fill", function(d, i) { return color(i); });
legend.append("text")
.attr("x", 24)
.attr("y", 9)
.attr("dy", ".35em")
.text(function(d) { return d.label; });
*{
font-family: 'Roboto', sans-serif;
text-transform:capitalize;
margin: 0 auto;
text-align:left;
}
body {
font-family: "Roboto"!important;
width: 100%;
height: 400px;
position: relative;
}
.slice path {
stroke: #fff;
stroke-width: 1px;
}
.textTop {
font-size: 12pt;
fill: #bbb;
}
.textBottom {
fill: #444;
font-weight: bold;
font-size: 18pt;
}
.top {
border: 1px solid #bbb;
color: #777;
padding: 5px;
text-decoration: none;
}
.top:hover {
border: 1px solid #555;
color: #333;
}
答案 0 :(得分:1)
您可以使用viewBox
标签中的svg
属性来创建一个与实际屏幕尺寸无关的坐标系,然后使用style="width: x%; "
根据可用的尺寸调整图像的大小。宽度(与img
相同,您只能使用height / width中的一个来使另一个通过纵横比进行调整)。
这是这样的:
<svg id="scalesvg" viewBox="0 0 100 100">
和CSS
#scalesvg { width: 20%; }
我现在有一个100x100坐标系,可以在其中绘制绝对坐标,范围为0到100。浏览器仍会调整大小。
但是,它也会调整字体大小,因此您可能会想到更改字体大小的媒体查询,并可能将文本向上/向下转换几个像素,从而真正创造出良好的体验。
我找到了一篇很棒的博客文章,其中解释了所有详细信息(不是我的-赞扬归功于谁撰写和分享了它):http://www.sarasoueidan.com/blog/svg-coordinate-systems/
plus:您可以在这里找到我的测试驱动器代码笔(更改浏览器窗口的大小以进行测试):https://codepen.io/sebredhh/pen/jvJGry