4

I modified the code from here. I tried two ways.

1. (source):

\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. (source):

\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}

But the result in both cases is the same:

result

What do I wrong? How can I do something like this (arrow tips nearly between to points):

wish

Thank you for your help and effort in advance!

Su-47
  • 2,508

2 Answers2

4

I have tried and shamefully failed to get your example to cooperate in the desired fashion. Would a solution with pgfplots be of use to you?

Result:

result

\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}
alpenwasser
  • 2,455
  • Hello @alpenwasser! Thank you for your answer, effort and solution! I prefer TikZ. I don't have experience with pgfplots. But any solution is better as no solution! Maybe can someone of the professionals help us. – Su-47 Apr 30 '17 at 12:28
  • 1
    @Su-47 Not a problem. It can be annoying, having to rewrite all your existing code to use a new package. As a general remark, if you ever get time to look into pgfplots: If you're familiar with TikZ, you shouldn't have much trouble feeling at home in pgfplots, since they're both based on pgf underneath anyway. Documentation is good as well. Still, I'd be curious about an answer to your actual question, if for no other reason than it bugs me that I've not gotten it to work. :D Good luck! – alpenwasser Apr 30 '17 at 13:39
1

Here's a method that splits every data set in two, makes them both have the same style, except that one ends with an arrow and the other doesn't. I'm not too familiar with the datavisualization package, but since it seems to be plotting functions, finding the "halfway" point on a function would require finding the arclength of a curve, which I'm not sure TikZ has the capabilities for. In my approach, you can see that some intervals are split halfway interms of the domain, some are not, to make the arrow appear in the "middle" of the curve.

This is the result:

enter image description here

This is the code (with some spacing removed):

\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}

Perhaps someone more clever than me can make this into a macro.