2016-01-12 2 views
1

Я пытаюсь сделать диаграмму Санки с использованием R для печатного отчета. В настоящее время я использовал 2 метода для этого, но ни один из них не достигает того, чего я хотел.Создание диаграммы Sankey в R для печати

Первая использует функцию Riverplot и производит это: enter image description here

Мои проблемы с этим сюжетом, что я не могу работать, как контролировать пустое пространство вокруг участка (это, кажется, фиксируется и не регулируется к наборам данных различного размера) или позиционирование аннотированного текста. Я хочу повторить этот график для нескольких похожих, но разных по размеру наборов данных, но размещение текста очень изменчиво в его позиционировании. Это код, я в настоящее время использую, чтобы добавить текст аннотации:

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 и производит это: enter image description here

Мои проблемы с этим являются (а) я хотел бы исправить заказ категорий на каждой стороне (как на первом изображении), и (б) я хотел бы аннотировать диаграмму как в первом изображении. Мои вопросы:

  1. Как можно точно настроить форматирование рисунка Riverplot (первое изображение), или,
  2. Как добавить аннотации к сюжету rCharts Санки (я предполагаю, что это может быть через раздел сценария, но я новичок в rCharts, d3 и javascript), и
  3. Можно ли зафиксировать порядок категорий, включенных в график rCharts sankey.

ответ

3

После того, как я купил много места, мне удалось создать то, что я хотел (решение пункта 2 моего первоначального вопроса). enter image description here
Код может быть уточнен в нескольких местах и, возможно, может быть выполнен более элегантно, но я включил его ниже, если он помогает кому-либо еще.

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> 
") 
Смежные вопросы