¿Cómo agregar puntas de flecha (para lograr la dirección del flujo) a un diagrama de proceso con visualización de datos TikZ?

¿Cómo agregar puntas de flecha (para lograr la dirección del flujo) a un diagrama de proceso con visualización de datos TikZ?

Modifiqué el código deaquí. Lo intenté de dos maneras.

1.(fuente):

\documentclass{scrartcl}
\usepackage{tikz}
\usepackage[per-mode = fraction]{siunitx}
\usetikzlibrary{datavisualization.formats.functions,
                decorations.markings
               }
\begin{document}
  \begin{tikzpicture}
    \datavisualization[scientific axes = {clean,
                                          end labels
                                         },
                       x axis = {label = $\frac{v}{\si{\cubic\m\per\kg}}$},
                       y axis = {label = $\frac{p}{\si{\bar}}$},
                       data/format = function,
                       visualize as smooth line/.list = {isentropic_press,
                                                         isobaric,
                                                         isentropic_decompress
                                                        },
                       style sheet = vary dashing,
                       every visualizer/.style = {decoration = {markings,
                                                                mark = at position .5 with {\arrow{>}}
                                                               }
                                                 },
                       isentropic_press = {label in legend = {text = isentrope Verdichtung}},
                       isobaric = {label in legend = {text = isobare Abkühlung}},
                       isentropic_decompress = {label in legend = {text = isentrope Entspannung}}
                      ]
    data[set = isentropic_press] {var x : interval[.5 : 2];
                                  func y = 1 / \value x ^ 1.4;
                                 }
    data[set = isobaric] {var x : interval[.5 : 1];
                          func y = 1 / .5 ^ 1.4;
                         }
    data[set = isentropic_decompress] {var x : interval[1 : 2];
                                       func y = 1 / (\value x - .5) ^ 1.4;%-.5: shifts the function by - 0.5 to the right
                                      }
    %accents important points
    info {\draw (visualization cs:x = 2,
                                  y = {(1 / 2 ^ 1.4)}
                ) circle [radius = 1pt]
            node [right,
                  font = \footnotesize
                 ] {1};
         }
    info {\draw (visualization cs:x = .5,
                                  y = {(1 / .5 ^ 1.4)}
                ) circle [radius = 1pt]
            node [above,
                  font = \footnotesize
                 ] {2};
         }
    info {\draw (visualization cs:x = 1,
                                  y = {(1 / .5 ^ 1.4)}
                ) circle [radius = 1pt]
            node [above,
                  font = \footnotesize
                 ] {3};
         }
    info {\draw (visualization cs:x = 2,
                                  y = {(1 / 1.5 ^ 1.4)}
                ) circle [radius = 1pt]
            node [right,
                  font = \footnotesize
                 ] {4};
         };
  \end{tikzpicture}
\end{document}

2.(fuente):

\documentclass{scrartcl}
\usepackage{tikz}
\usepackage[per-mode = fraction]{siunitx}
\usetikzlibrary{datavisualization.formats.functions,
                decorations.markings
               }
\begin{document}
  \makeatletter
    \tikzset{nomorepostaction/.code = {\let\tikz@postactions\pgfutil@empty}}
  \makeatother
  \begin{tikzpicture}
    \datavisualization[scientific axes = {clean,
                                          end labels
                                         },
                       x axis = {label = $\frac{v}{\si{\cubic\m\per\kg}}$},
                       y axis = {label = $\frac{p}{\si{\bar}}$},
                       data/format = function,
                       visualize as smooth line/.list = {isentropic_press,
                                                         isobaric,
                                                         isentropic_decompress
                       },
                       style sheet = vary dashing,
                       every visualizer/.style = {postaction = {nomorepostaction,
                                                                decorate,
                                                                decoration = {markings,
                                                                              mark = at position .5 with {\arrow{>}}
                                                                             }
                                                               }
                                                 },
                       isentropic_press = {label in legend = {text = isentrope Verdichtung}},
                       isobaric = {label in legend = {text = isobare Abkühlung}},
                       isentropic_decompress = {label in legend = {text = isentrope Entspannung}}
                      ]
      data[set = isentropic_press] {var x : interval[.5 : 2];
                                    func y = 1 / \value x ^ 1.4;
                                   }
      data[set = isobaric] {var x : interval[.5 : 1];
                            func y = 1 / .5 ^ 1.4;
                           }
      data[set = isentropic_decompress] {var x : interval[1 : 2];
                                         func y = 1 / (\value x - .5) ^ 1.4;%-.5: shifts the function by - 0.5 to the right
                                        }
      %accents important points
      info {\draw (visualization cs:x = 2,
                                    y = {(1 / 2 ^ 1.4)}
                  ) circle [radius = 1pt]
              node [right,
                    font = \footnotesize
                   ] {1};
           }
      info {\draw (visualization cs:x = .5,
                                    y = {(1 / .5 ^ 1.4)}
                  ) circle [radius = 1pt]
              node [above,
                    font = \footnotesize
                   ] {2};
           }
      info {\draw (visualization cs:x = 1,
                                    y = {(1 / .5 ^ 1.4)}
                  ) circle [radius = 1pt]
              node [above,
                    font = \footnotesize
                   ] {3};
           }
      info {\draw (visualization cs:x = 2,
                                    y = {(1 / 1.5 ^ 1.4)}
                  ) circle [radius = 1pt]
              node [right,
                    font = \footnotesize
                   ] {4};
           };
  \end{tikzpicture}
\end{document}

Pero el resultado en ambos casos es el mismo:

resultado

¿Qué me equivoco? ¿Cómo puedo hacer algo como esto (las puntas de las flechas casi entre dos puntos)?

desear

¡Gracias por su ayuda y esfuerzo de antemano!

Respuesta1

Aquí hay un método que divide cada conjunto de datos en dos, hace que ambos tengan el mismo estilo, excepto que uno termina con una flecha y el otro no. No estoy muy familiarizado con el datavisualizationpaquete, pero dado que parece estar trazando funciones, encontrar el punto "medio" de una función requeriría encontrar la longitud del arco de una curva, para lo cual no estoy seguro de que TikZtenga las capacidades. En mi enfoque, puede ver que algunos intervalos se dividen a la mitad del dominio, otros no, para que la flecha aparezca en el "medio" de la curva.

Este es el resultado:

ingrese la descripción de la imagen aquí

Este es el código (sin espacios):

\documentclass{scrartcl}
\usepackage{tikz}
\usepackage[per-mode = fraction]{siunitx}
\usetikzlibrary{datavisualization.formats.functions,arrows.meta}
\begin{document}
\begin{tikzpicture}[
  % Arrow styles for both ends of lines
  midarrA/.style={-{Straight Barb[width=4pt,length=4pt,line width=1pt]}},
  midarrB/.style={{Straight Barb[width=4pt,length=4pt,line width=1pt]}-}
]
\datavisualization[
  scientific axes = {clean,end labels},
  x axis = {label = $\frac{v}{\si{\cubic\m\per\kg}}$},
  y axis = {label = $\frac{p}{\si{\bar}}$},
  data/format = function,
  % Two parts for each data set
  visualize as smooth line/.list = {
    isentropic_press 1, isentropic_press 2,
    isobaric 1, isobaric 2,
    isentropic_decompress 1, isentropic_decompress 2
  },
  style sheet = vary dashing,
  % Manually set pairs of data sets to have the same style
  /data point/set/isentropic_press 1/.initial=1,
  /data point/set/isentropic_press 2/.initial=1, 
  /data point/set/isobaric 1/.initial=2,
  /data point/set/isobaric 2/.initial=2, 
  /data point/set/isentropic_decompress 1/.initial=3,
  /data point/set/isentropic_decompress 2/.initial=3, 
  % Manually choose which part has the arrow at the end or beginning
  isentropic_press 1 = {label in legend = {text = isentrope Verdichtung}},
  isentropic_press 2 = {style={midarrB}},
  isobaric 1 = {style={midarrA}},
  isobaric 2 = {label in legend = {text = isobare Abkühlung}},
  isentropic_decompress 1 = {style={midarrA}},
  isentropic_decompress 2 = {label in legend = {text = isentrope Entspannung}}
]

% Split intervals of data sets as appropriate
data[set = isentropic_press 1] {var x : interval[.5:1]; func y = 1 / \value x ^ 1.4;}
data[set = isentropic_press 2] {var x : interval[1:2]; func y = 1 / \value x ^ 1.4;}
data[set = isobaric 1] {var x : interval[.5:.75]; func y = 1 / .5 ^ 1.4;}
data[set = isobaric 2] {var x : interval[.75:1]; func y = 1 / .5 ^ 1.4;}
data[set = isentropic_decompress 1] {var x : interval[1:1.35]; func y = 1 / (\value x - .5) ^ 1.4;}
data[set = isentropic_decompress 2] {var x : interval[1.35:2]; func y = 1 / (\value x - .5) ^ 1.4;}

% Accent important points
info {\draw (visualization cs:x = 2, y = {(1 / 2 ^ 1.4)}) circle [radius = 1pt] node [right, font = \footnotesize] {1};}
info {\draw (visualization cs:x = .5, y = {(1 / .5 ^ 1.4)}) circle [radius = 1pt] node [above, font = \footnotesize] {2};}
info {\draw (visualization cs:x = 1, y = {(1 / .5 ^ 1.4)}) circle [radius = 1pt] node [above, font = \footnotesize] {3};}
info {\draw (visualization cs:x = 2, y = {(1 / 1.5 ^ 1.4)}) circle [radius = 1pt] node [right, font = \footnotesize] {4};};
\end{tikzpicture}
\end{document}

Quizás alguien más inteligente que yo pueda convertir esto en una macro.

Respuesta2

He intentado, y vergonzosamente fracasé, lograr que su ejemplo coopere de la manera deseada. ¿ pgfplotsLe resultaría útil una solución ?

Resultado:

resultado

\documentclass[margin=2mm,tikz]{standalone}
\usepackage{pgfplots}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usetikzlibrary{decorations.markings}
\usepackage[per-mode = fraction]{siunitx}

\begin{document}
\begin{tikzpicture}

    \begin{axis}[
            cycle list name=linestyles,
            legend style={
                cells={anchor=east},
                legend pos=outer north east,
            },
            xlabel = {$\frac{v}{\si{\cubic\m\per\kg}}$},
            ylabel = {$\frac{p}{\si{\bar}}$},
            xlabel style = {at={(axis description cs:1.1,0.2)}},
            ylabel style = {at={(axis description cs:0.1,1.1)},rotate=-90},
        ]

        \addplot+[
            domain=2:0.5,
            decoration={
                markings,
                mark=at position 0.5 with {\arrow [scale=1.5]{stealth}}},
            postaction={decorate},
        ] {1/(x^1.4)};
        \addplot+[
            domain=0.5:1,
            decoration={
                markings,
                mark=at position 0.5 with {\arrow [scale=1.5]{stealth}}},
            %postaction={nomorepostaction,decorate},
            postaction={decorate},
        ] {1/(0.5^1.4)};
        \addplot+[
            domain=1:2,
            decoration={
                markings,
                mark=at position 0.5 with {\arrow [scale=1.5]{stealth}}},
            postaction={decorate},
        ] {1/((x-0.5)^1.4)};

        \draw (axis cs:2,1/2^1.4)     circle (1pt) node[right,font=\footnotesize] {1};
        \draw (axis cs:0.5,1/0.5^1.4) circle (1pt) node[above,font=\footnotesize] {2};
        \draw (axis cs:1.0,1/0.5^1.4) circle (1pt) node[above,font=\footnotesize] {3};
        \draw (axis cs:2,1/1.5^1.4)   circle (1pt) node[right,font=\footnotesize] {4};

        \legend{isentrope Verdichtung,isobare Abkühlung,isentrope Entspannung}
    \end{axis}

\end{tikzpicture}
\end{document}

información relacionada