Saltar al contenido

Cómo hacer un diagrama de Sankey

Nuestro grupo de redactores ha pasado mucho tiempo buscando la resolución a tu búsqueda, te dejamos la soluciones de modo que esperamos que sea de mucha ayuda.

Solución:

Aquí está el comienzo de un SankeyDiagram función:

Options[SankeyDiagram] = Join[
    ColorFunction -> "Start" -> ColorData[97], "End" -> ColorData["GrayTones"],
    Options[Graphics]
];

SankeyDiagram[rules_, opts:OptionsPattern[]]:=Module[
    
    startcolors, svalues, slens, startsplit, 
    endcolors, evalues, elens, endsplit, 
    len, endpos, linecolors
    ,

    len = Length[rules];
    endpos = Ordering @ Ordering @ Sort[rules][[All, 2]];

    startcolors = OptionValue[ColorFunction->"Start"];
    endcolors = OptionValue[ColorFunction->"End"];

    svalues, slens = Through @ Map[First], Map[Length] @ Split[Sort @ rules[[All, 1]]];
    startsplit = Accumulate @ Prepend[-slens, len-.5];
    linecolors = Flatten @ Table[
        ConstantArray[startcolors[i], slens[[i]]],
        i, Length[slens]
    ];

    evalues, elens = Through @ Map[First], Map[Length] @ Split[Sort @ rules[[All, 2]]];
    endsplit = Accumulate @ Prepend[-elens, len-.5];

    Graphics[
        
        Table[
            
            startcolors[i], 
            Rectangle[Offset[-40, 0, 0, startsplit[[i]]], Offset[-10, 0, 0, startsplit[[i+1]]]]
            ,
            i, Length[startsplit]-1
        ],
        Table[
            
            endcolors[(i-1)/(Length[endsplit]-1)],
            Rectangle[Offset[40, 0, 1, endsplit[[i]]], Offset[10, 0, 1, endsplit[[i+1]]]]
            ,
            i, Length[endsplit]-1
        ],
        Table[
            
            White,
            Text[
                svalues[[i]],
                Offset[-23, 0, 0, (startsplit[[i]]+startsplit[[i+1]])/2],
                0, 0,
                0, 1
            ]
            ,
            i, Length[slens]
        ],
        Table[
            
            LightGreen,
            Text[
                evalues[[i]],
                Offset[23, 0, 1, (endsplit[[i]]+endsplit[[i+1]])/2],
                0, 0,
                0, -1
            ]
            ,
            i, Length[elens]
        ],
        Thickness[.03], Opacity[.7],
        Table[
            linecolors[[i]], Line[connector[len-i, len-endpos[[i]]]],
            i, len
        ]
        ,
        opts,
        AspectRatio->1
    ]
]

connector[y1_, y2_] := Table[
    t, y1+(y2-y1) LogisticSigmoid[Rescale[t, 0,1, -10,10]],
    t, Subdivide[0, 1, 30]
]

Aquí hay una aproximación justa de su diagrama deseado:

SankeyDiagram[
    1->1,1->2,1->3,1->4,1->5,
    2->1,2->2,2->3,2->4,2->5,
    3->1,3->2,3->3,3->4,3->5
]

ingrese la descripción de la imagen aquí

Consulte: https://visualign.wordpress.com/2012/05/14/sankey-diagrams/

Código y nota explicativa: https://github.com/calischs/Sankey

Si crees que ha resultado de provecho nuestro post, nos gustaría que lo compartas con más seniors y nos ayudes a extender nuestro contenido.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *