首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在D3.js中用模式将图表保存/导出到.svg文件?

如何在D3.js中用模式将图表保存/导出到.svg文件?
EN

Stack Overflow用户
提问于 2022-08-26 21:50:31
回答 1查看 115关注 0票数 0

我用D3.js创建了一个条形图,并在条形图中填充了<pattern>。现在,我想将条形图保存到一个.svg文件中。我遵循了this question的密码。但是,我只能保存一个条形图而不填写。我认为问题在于<pattern>不是dom元素,因此不能以这种方式导出。

您知道如何解决这个问题并将带有模式的条形图保存到svg文件中吗?

这是我的密码。您可以单击Save按钮来保存SVG文件。

代码语言:javascript
运行
复制
var btn = document.getElementById("btn");
var rotateRect = document.getElementById("rotateRect");
  var data = [{ year: '2001', value:10 },
            { year: '2002', value:30 },
            { year: '2003', value:20 },
           ]
var svg = d3.select("svg#barchart"),
            margin = 200,
            width = svg.attr("width") - margin,
            height = svg.attr("height") - margin


var xScale = d3.scaleBand().range([0, width]).padding(0.4),
            yScale = d3.scaleLinear().range([height, 0]);

var g = svg.append("g")
            .attr("transform", "translate(" + 100 + "," + 100 + ")");

    

        xScale.domain(data.map(function(d) { return d.year; }));
        yScale.domain([0, d3.max(data, function(d) { return d.value; })]);

        g.append("g")
         .attr("transform", "translate(0," + height + ")")
         .call(d3.axisBottom(xScale));

        g.append("g")
         .call(d3.axisLeft(yScale).tickFormat(function(d){
             return d;
         }).ticks(10));

        g.selectAll(".bar")
         .data(data)
         .enter().append("rect")
         .attr("class", "bar")
         .attr("x", function(d) { return xScale(d.year); })
         .attr("y", function(d) { return yScale(d.value); })
         .attr("width", xScale.bandwidth())
         .attr("height", function(d) { return height - yScale(d.value); })
         .attr('stroke', "black")
         .attr('stroke-width', '1')
         // .attr("fill", "white")
         .attr("fill", function(d,i) { return  "url(#pattern" + (i+1) +")"});

btn.onclick = function(){
  console.log("save svg")
  var svgData = $("#barchart")[0].outerHTML;
var svgBlob = new Blob([svgData], {type:"image/svg+xml;charset=utf-8"});
var svgUrl = URL.createObjectURL(svgBlob);
var downloadLink = document.createElement("a");
downloadLink.href = svgUrl;
downloadLink.download = "new.svg";
document.body.appendChild(downloadLink);
downloadLink.click();
document.body.removeChild(downloadLink);
}
代码语言:javascript
运行
复制
#rotateRect{
  transform:rotate(45deg);
    transform-origin: center center;
    transform-box: fill-box;
}
代码语言:javascript
运行
复制
<script src="https://d3js.org/d3.v4.min.js"></script>
<script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js">
</script>

<svg id = "barchart" width="600" height="500"></svg>

<svg width="0" height="0">
    
    <defs>
        <pattern id="pattern1"
                 x="0" y="0" width="20" height="20"
                 patternUnits="userSpaceOnUse" >
      
<!--             <circle cx="10" cy="10" r="10" style="stroke: none; fill: #0000ff" /> -->
          <rect id="rotateRect" x="5" y = "5" width = "10" height = "10" />
      
        </pattern>
      </defs>
    
      <defs>
        <pattern id="pattern2"
                 x="0" y="0" width="20" height="20"
                 patternUnits="userSpaceOnUse" >
      
            <circle cx="10" cy="10" r="5" style="stroke: none; fill: #0000ff" />
      
        </pattern>
      </defs>
    
      <defs>
        <pattern id="pattern3"
                 x="0" y="0" width="20" height="20"
                 patternUnits="userSpaceOnUse" >
      
            <circle cx="10" cy="10" r="3" style="stroke: none; fill: #0000ff" />
      
        </pattern>
      </defs>
 
</svg>

<button id="btn">Save SVG</button>

我想要的是一个svg文件看起来像:

我从当前代码中得到的是一个svg文件,看起来如下:

提前谢谢你。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-26 23:32:35

将模式与条形图放在同一个svg中,即使用一个svg元素,而不是两个。

代码语言:javascript
运行
复制
var btn = document.getElementById("btn");
var rotateRect = document.getElementById("rotateRect");
  var data = [{ year: '2001', value:10 },
            { year: '2002', value:30 },
            { year: '2003', value:20 },
           ]
var svg = d3.select("svg#barchart"),
            margin = 200,
            width = svg.attr("width") - margin,
            height = svg.attr("height") - margin


var xScale = d3.scaleBand().range([0, width]).padding(0.4),
            yScale = d3.scaleLinear().range([height, 0]);

var g = svg.append("g")
            .attr("transform", "translate(" + 100 + "," + 100 + ")");

    

        xScale.domain(data.map(function(d) { return d.year; }));
        yScale.domain([0, d3.max(data, function(d) { return d.value; })]);

        g.append("g")
         .attr("transform", "translate(0," + height + ")")
         .call(d3.axisBottom(xScale));

        g.append("g")
         .call(d3.axisLeft(yScale).tickFormat(function(d){
             return d;
         }).ticks(10));

        g.selectAll(".bar")
         .data(data)
         .enter().append("rect")
         .attr("class", "bar")
         .attr("x", function(d) { return xScale(d.year); })
         .attr("y", function(d) { return yScale(d.value); })
         .attr("width", xScale.bandwidth())
         .attr("height", function(d) { return height - yScale(d.value); })
         .attr('stroke', "black")
         .attr('stroke-width', '1')
         // .attr("fill", "white")
         .attr("fill", function(d,i) { return  "url(#pattern" + (i+1) +")"});

btn.onclick = function(){
  console.log("save svg")
  var svgData = $("#barchart")[0].outerHTML;
  console.log(svgData);
var svgBlob = new Blob([svgData], {type:"image/svg+xml;charset=utf-8"});
var svgUrl = URL.createObjectURL(svgBlob);
var downloadLink = document.createElement("a");
downloadLink.href = svgUrl;
downloadLink.download = "new.svg";
document.body.appendChild(downloadLink);
downloadLink.click();
document.body.removeChild(downloadLink);
}
代码语言:javascript
运行
复制
#rotateRect{
  transform:rotate(45deg);
    transform-origin: center center;
    transform-box: fill-box;
}
代码语言:javascript
运行
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script src="https://d3js.org/d3.v4.min.js"></script>

<svg id = "barchart" width="600" height="500">    <defs>
        <pattern id="pattern1"
                 x="0" y="0" width="20" height="20"
                 patternUnits="userSpaceOnUse" >
      
<!--             <circle cx="10" cy="10" r="10" style="stroke: none; fill: #0000ff" /> -->
          <rect id="rotateRect" x="5" y = "5" width = "10" height = "10" />
      
        </pattern>
      </defs>
    
      <defs>
        <pattern id="pattern2"
                 x="0" y="0" width="20" height="20"
                 patternUnits="userSpaceOnUse" >
      
            <circle cx="10" cy="10" r="5" style="stroke: none; fill: #0000ff" />
      
        </pattern>
      </defs>
    
      <defs>
        <pattern id="pattern3"
                 x="0" y="0" width="20" height="20"
                 patternUnits="userSpaceOnUse" >
      
            <circle cx="10" cy="10" r="3" style="stroke: none; fill: #0000ff" />
      
        </pattern>
      </defs>
</svg>

<button id="btn">Save SVG</button>

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73506795

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档