【发布时间】:2020-12-13 10:54:53
【问题描述】:
我对 SVG 比较陌生。我正在绘制一个图表,它将分别在 x、y 轴上动态绘制温度或风值。我擅长 x 轴定位。
但是当谈到 Y 轴时,位置是正确的,但是如果该值高于父图表高度,它会被切断,如图所示。
需要有关如何强制使圆形/元素可见的帮助,即使它超过了父元素的宽度或高度?
我为此使用 d3.js。
这里是用文字生成圆圈的代码
let svg = container
.append("svg")
.attr("width", width)
.attr("height", height+(height*0.7));
const chart = svg
.append("g")
.attr('class','chartwind')
.attr("transform", "translate(" + padding.left + "," + (padding.top) + ")")
chart.append("path")
.data(datapoints)
.attr("class", "line wind-line")
.style("stroke", colorScale("wind"))
.style('stroke-width', '2px')
.attr("d", windLine)
let windPoint = chart.selectAll('g.windpoint').data(datapoints).enter().append('g').attr('class', 'windpoint').attr('transform', function (d) {
return 'translate(' + (Math.round(xScale(d.parsedUtcDateTimeNow)) - 10) + ',' + yScale(d.windSpeed) + ')';
})
chart.selectAll('.windcircle')
.data(Infos)
.enter().append('circle')
.attr("class", "windcircle")
.style("stroke", colorScale("wind"))
.style('stroke-width', '2px')
.attr("cx", (d) => xScale(d.parsedUtcDateTimeNow))
.attr("cy", (d) => {
return yScale(d.windSpeed);
})
.attr('r', 3)
.style("fill", colorScale("wind"))
windPoint
.append('circle')
.attr("cx", 0)
.attr("cy", 0)
.attr("r", function (d) {
return 8;
})
.attr("fill", "green")
.attr("transform", "translate(0,-23)")
windPoint
.append('text')
.attr("fill", "white")
.attr("transform", "translate(0,-19)")
.attr("text-anchor", "middle")
.attr("font-size", "12px")
.attr("font-weight", "600")
.text((d) => {
return d.windGust;
});
windPoint
.append('text')
.attr('text-anchor', 'middle')
//.attr("transform","translate(0,5)")
.text((d) => {
return d.windSpeed;
});
更新
这就是我构建 SVG 高度和宽度的方式
function getSizesById(id) {
const container = document.querySelector(`#${id}`)
if (!container)
return null
return {
height: container.clientHeight,
width: container.clientWidth,
}
}
const { width, height } = (() => {
return getSizesById(containerID)
})()
const { width, height } = (() => {
return getSizesById(containerID)
})(),
padding = {
...size.padding,
top: 20,
bottom: 20
},
chartHeight = height - padding.bottom - padding.top,
chartWidth = width - padding.left - padding.right
const container = d3.select(`#${containerID}`)
let svg = container
.append("svg")
.attr("width", width)
.attr("height", height);
注意:SVG 高度(或图表)应该在 DIV 中查看,并且只有当数据点超过比例时,我们才需要数据在 div 高度上可见。
【问题讨论】:
-
元素没有宽度和高度。他们总是和他们的孩子一样大。最好的办法是使 -
更明确地说:切断图形的不是
<g>元素,而是<svg>元素。您必须保留足够的垂直空间,不仅可以显示您的数据点,还可以显示它们相关的图形表示。您没有展示<svg>元素是如何构造的,所以我无法给出答案。您需要做的是增加.chartwind组的垂直向下平移,并可能增加svg>元素的高度,或者设置一个viewBox属性来包含需要可见的每个可能的图形元素。 -
嗨@ccprog 感谢您的评论,我用代码更新了关于如何构建 SVG 的问题。基本上在加载时,我正在从 DOM 读取容器宽度和高度,并将其用于 SVG 高度和宽度,并具有固定的 20px 填充。
-
@RobertLongson 我的 SVG 是根据 DIV 容器中的可用区域构建的。有没有办法给 svg 下的第一个 g 填充?
-
元素可以被翻译,例如transform="翻译(0, 100)"