%20%D0%BD%D0%B0%20%D0%B4%D0%B8%D0%B0%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D1%83%20%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81%D0%B0%20%D1%81%20%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E%20%D0%B2%D0%B8%D0%B7%D1%83%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20TikZ%3F.png)
Я изменил код сздесь. Я попробовал два способа.
1.(источник):
\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.(источник):
\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}
Но результат в обоих случаях одинаков:
Что я не так делаю? Как мне сделать что-то вроде этого (стрелки почти между двумя точками):
Заранее благодарю вас за вашу помощь и усилия!
решение1
Вот метод, который разделяет каждый набор данных на два, делает их обоих с одинаковым стилем, за исключением того, что один заканчивается стрелкой, а другой нет. Я не слишком хорошо знаком с пакетом datavisualization
, но поскольку он, похоже, строит функции, нахождение "половинной" точки на функции потребовало бы нахождения длины дуги кривой, для чего, я не уверен, TikZ
есть ли у него возможности. В моем подходе вы можете видеть, что некоторые интервалы разделены пополам с точки зрения домена, некоторые нет, чтобы стрелка появилась в "середине" кривой.
Вот результат:
Вот код (с некоторыми удаленными пробелами):
\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}
Возможно, кто-то более умный, чем я, сможет превратить это в макрос.
решение2
Я пытался и позорно не смог заставить ваш пример сотрудничать желаемым образом. Будет ли решение с pgfplots
помощью вам полезно?
Результат:
\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}