¿Cómo mejorar este diagrama?

¿Cómo mejorar este diagrama?

Tengo este diagrama que visualiza la interrelación de varias reacciones que extienden Xi a las tareas de los reactores R101 y R102, dictando en consecuencia la relación de reciclaje R, purga y flujo de reposición. Después de jugar con mi primer borrador durante unas horas, todavía no estoy del todo satisfecho con el resultado:

ingrese la descripción de la imagen aquí

Ese es mi código. Se agradecen mucho las sugerencias de mejora.

\begin{figure}[!ht]
\centering
\scalebox{1.2}[1.2]{
\begin{tikzpicture}[node distance=2cm,>=stealth',bend angle=45,auto]
\tikzstyle{place}=[circle,thick,draw=blue!75,fill=blue!20,minimum size=6mm]
\tikzstyle{red place}=[place,draw=red!75,fill=red!20]
\tikzstyle{transition}=[rectangle,thick,draw=black!75,
          fill=black!10,minimum size=13mm]

\tikzstyle{every label}=[red]

\begin{scope}[xshift=0cm]

\node[] 
at (-4, -2)   (start) {};
\node[] 
at (4, -2)   (end) {};

\node [red place,tokens=0]
                  (w1')                                                {};
\node [place]     (c1') [below of=w1']                                 {};
\node [red place] (s1') [below of=c1',xshift=-15mm,label=left:$\xi_1$]      {};
\node [red place,tokens=0]
                  (s2') [below of=c1',xshift=15mm,label=right:$\xi_2$] {};


\node [transition] (e1') [left of=c1'] {}
  edge [post,bend left]                  (w1')
  edge [post]                            (s1')
  edge [pre]                             (s2')
  edge [pre]                             (c1')
  edge [pre,dotted]                      (start);


\node [transition] (l1') [right of=c1'] {}
  edge [post]                            (c1')
  edge [pre]                             (s1')
  edge [post]                            (s2')
  edge [pre,bend right] node[swap] {}    (w1')
  edge[post,dotted] (end);

\node[] 
at (-2, -2)   (c)  {R101};
\node[] 
at (2, -2)    (c2) {R102};
\node[red] 
at (0, +0.65) (c2) {$\xi_3$};
\node[blue] 
at (0, -1.35) (c2) {$R$};
\node[black] 
at (-5, -2)   (c2) {make-up};
\node[black] 
at (4.5, -2)  (c2) {purge};

\end{scope}

\end{tikzpicture}
 }
\end{figure}

Respuesta1

Sólo para mostrar esoMetapostTambién está disponible, aquí tienes una versión con un diseño diferente. ¿Te gusta más esto? ¿Esto muestra lo que necesitas?

ingrese la descripción de la imagen aquí

\documentclass[border=5mm]{standalone}
\usepackage{luatex85}
\usepackage{luamplib}
\begin{document}
\mplibtextextlabel{enable}
\begin{mplibcode}
beginfig(1);

    path R, X[], reactor[];

    R  = fullcircle scaled 20 shifted 84 down;
    X1 = fullcircle scaled 20 shifted 42 up;
    X2 = fullcircle scaled 20 shifted 42 down;
    X3 = fullcircle scaled 20 shifted 84 up;

    reactor0 = unitsquare shifted -(1/2, 1/2) scaled 42;
    reactor1 = reactor0 shifted 63 left;
    reactor2 = reactor0 shifted 63 right;

    forsuffixes $=1,2:
        fill reactor$ withcolor 7/8 white;
        draw reactor$;
        label("R10" & decimal $, center reactor$);
    endfor

    fill R withcolor 3/4[blue, white];
    draw R withcolor 1/2 blue;
    label.top("$R$", point 2 of R) withcolor 1/2 blue;

    forsuffixes $=1,2,3:
        fill X$ withcolor 3/4[red, white];
        draw X$ withcolor 1/2 red;
        label.top("$\xi_{" & decimal $ & "}$", point 2 of X$) withcolor 1/2 red;
    endfor

    z1 = point -1/2 of reactor1 shifted 42 left;
    z2 = point  3/2 of reactor2 shifted 42 right;

    label.lft("make up", z1); drawarrow z1 -- point -1/2 of reactor1 dashed withdots scaled 1/2;
    label.rt ("purge", z2); drawarrow point 3/2 of reactor2 -- z2 dashed withdots scaled 1/2;

    forsuffixes $=X1,X3:
        drawarrow center reactor1 {up} .. {right} center $
            cutbefore reactor1 cutafter fullcircle scaled 22 shifted center $;
        drawarrow center $ {right} .. {down} center reactor2
            cutbefore $ cutafter reactor2 shifted 1 up;
    endfor

    forsuffixes $=R, X2:
        drawarrow center reactor2 {down} .. {left} center $
            cutbefore reactor2 cutafter fullcircle scaled 22 shifted center $;
        drawarrow center $ {left} .. {up} center reactor1
            cutbefore $ cutafter reactor1 shifted 1 down;
    endfor

endfig;
\end{mplibcode}
\end{document}

Compila esto con lualatex.

Respuesta2

Como solicita una mejora del código, tengo algunas sugerencias:

  1. Deberías usar \tikzseten lugar de \tikzstyle. Leer másaquí.
  2. TikZ ya te ofrece la opción scale, por lo que su uso \scaleboxno es muy TikZ-ish.
  3. Poner un scopedónde xshift=0cmes innecesario.
  4. La distancia entre "maquillaje" y la flecha no es la misma que entre "purga" y la flecha. Es menor pero deberíamos solucionarlo.
  5. La flecha curva de "R101" parece bajar un poco antes de llegarξ3 . La flecha curva hacia "R102" parece subir un poco antes de descender.

Por cierto, me gustaría mostrarles mi código para esa figura. No uso todos \nodelos s, es decir, los comandos deberían ser más comprensibles ( \drawsignifica dibujar algo y \nodesignifica que hay algunos nodos en los que insertar). Además, esto no utiliza coordenadas cartesianas/polares.que difiere TikZ de otras herramientas gráficas.

\documentclass[tikz]{standalone}
\usetikzlibrary{positioning,arrows.meta}
\begin{document}
\begin{tikzpicture}[scale=1.2,-stealth]
\tikzset{
    reactor/.style={rectangle,thick,draw=black!75,fill=black!10,minimum size=13mm},
    place/.style={circle,thick,draw=blue!75,fill=blue!20,minimum size=6mm},
    red place/.style={place,draw=red!75,fill=red!20}
}
\node[place] (r) {} node[above=1em,blue!75] {$R$};
\node[reactor,left=1.5 cm of r] (101) {R101};
\node[reactor,right=1.5 cm of r] (102) {R102};
\node[red place,above=2 cm of r] (3) {};
    \draw (3) node[above=1em,red] {$\xi_3$};
\node[red place,below=1.5cm of 101.south east] (1) {};
    \draw (1) node[left=1em,red] {$\xi_1$};
\node[red place,below=1.5cm of 102.south west] (2) {};
    \draw (2) node[right=1em,red] {$\xi_2$};
\node[left=2cm of 101] (start) {make-up};
\node[right=2cm of 102] (end) {purge};
\draw (101)--(1);
\draw (1)--(102);
\draw (102)--(r);
\draw (r)--(101);
\draw (101) to[out=90,in=180] (3);
\draw (3) to[out=0,in=90] (102);
\draw (102)--(2);
\draw (2)--(101);
\draw[dotted] (start)--(101);
\draw[dotted] (102)--(end);
\end{tikzpicture}
\end{document}

ingrese la descripción de la imagen aquí

información relacionada