【问题标题】:Making a Sankey diagram in R for printing在 R 中制作用于打印的 Sankey 图
【发布时间】:2016-04-17 05:12:11
【问题描述】:

我正在尝试使用 R 为打印报告制作桑基图。我目前使用了 2 种方法来做到这一点,但都没有达到我想要的效果。

第一个使用 Riverplot 函数并生成:

我对这个情节的问题是我无法弄清楚如何控制情节周围的空白(它似乎是固定的,不适合不同大小的数据集)或带注释的文本的定位。我想为许多相似但大小不同的数据集重复此图,但文本放置在其位置上是非常可变的。这是我目前用来添加文本注释的代码:

riverplot(a, srt = 0)
y_lim<-par("yaxp") #gets y axis limits to spicify text placements
#  text(1.5,y_lim[1], Name,font=2) #labels plot with Name (LA)
text(1,y_lim[1],"2004")
text(2,y_lim[1],"2010")

第二个使用 rCharts 并生成:

我的问题是(a)我想修复每一侧的类别顺序(如第一张图片)和(b)我想像第一张图片一样注释图表。 我的问题是:

  1. 如何微调 Riverplot 图形(第一张图片)的格式,或者,
  2. 如何向 rCharts Sankey 图添加注释(我猜这可能是通过脚本部分,但我是 rCharts、d3 和 javascript 的新手),并且,
  3. 是否可以修复 rCharts sankey 图中的类别顺序。

【问题讨论】:

    标签: r d3.js rcharts sankey-diagram riverplot


    【解决方案1】:

    在从一堆地方大量修补和捏造代码之后,我设法产生了我想要的东西(解决了我最初问题的第 2 点)。
    该代码可以在许多地方进行改进,并且可能会做得更优雅,但我将其包含在下面以防它对其他人有所帮助。

    sankeyPlot$setTemplate(
      afterScript = "
    <script>
    
    var cscale = d3.scale.ordinal()
    .domain(['N','E', 'G' ,'I','T','N ','E ', 'G ' ,'I ','T '])
    .range(['#d3d3d3', '#32ca32', '#1f78b4', '#e31a1c','#ecd736','#d3d3d3',    '#32ca32', '#1f78b4', '#e31a1c','#ecd736'])
    
    
    
    d3.selectAll('#{{ chartId }} svg path.link')
    .style('stroke', function(d){
    return cscale(d.source.name);
    //returns grey links
    })
    
    d3.selectAll('#{{ chartId }} svg .node rect')
    .style('fill', function(d){
    return cscale(d.name)
    })
    .style('stroke', 'none')
    
    var text_box = d3.selectAll('#{{ chartId }}').append('svg')
        .attr('width', 500)
        .attr('height', 100)
    
    var TextData = [
        { 'cx': 0, 'cy': 20 ,'label': 'Type A', 'pos': 'left'},
        { 'cx': 250, 'cy': 20,'label': 'Label','pos': 'middle'},
        { 'cx': 500, 'cy': 20, 'label': 'Type B','pos': 'end'}];
    
    var text = text_box.selectAll('text')
                        .data(TextData)
                        .enter()
                        .append('text');
    
    //Add the text attributes
    var textLabels = text
                 .attr('x', function(d) { return d.cx; })
                 .attr('y', function(d) { return d.cy; })
                 .text( function (d) { return d.label ; })
                  .attr('text-anchor', function(d) { return d.pos ;})
                 .attr('font-family', 'sans-serif')
                 .attr('font-size', '14px')
                 .attr('fill', 'black');
    
    </script>
    ")
    

    【讨论】:

      猜你喜欢
      • 2018-06-09
      • 1970-01-01
      • 2022-10-04
      • 1970-01-01
      • 2015-12-30
      • 1970-01-01
      • 2015-04-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多