![График нагрева, возрастающая и убывающая оси](https://rvso.com/image/405363/%D0%93%D1%80%D0%B0%D1%84%D0%B8%D0%BA%20%D0%BD%D0%B0%D0%B3%D1%80%D0%B5%D0%B2%D0%B0%2C%20%D0%B2%D0%BE%D0%B7%D1%80%D0%B0%D1%81%D1%82%D0%B0%D1%8E%D1%89%D0%B0%D1%8F%20%D0%B8%20%D1%83%D0%B1%D1%8B%D0%B2%D0%B0%D1%8E%D1%89%D0%B0%D1%8F%20%D0%BE%D1%81%D0%B8.png)
Для начала позвольте мне прояснить: я не знаю, как правильно назвать это по-английски, поэтому не стесняйтесь редактировать название или оставлять комментарии.
Мне нужно отобразить эти данные таким образом, чтобы нагрев и охлаждение (Tr) отображались на одной оси ив том же направлении. Смотрите картинку. Я не смог найти способ заставить ось x дойти до 900, а затем уменьшиться обратно, продолжая движение слева направо.
Я могу получить желаемый результат, только если построю график по времени (t), однако мне нужна ось, показывающая температуру.
Я пробовал разбить на два участка и сделать их зеркальными, но это заняло бы у меня слишком много времени с другими участками, подобными этому, в будущем. Кроме того, это было не слишком элегантно, и визуально это далеко не хорошо в случае сложной кривой.
\documentclass[]{standalone}
% UNITS
\usepackage{siunitx}
\sisetup{per-mode=fraction, abbreviations}
% GRAPHICS
\usepackage{pgfplots}
\pgfplotsset{width=9cm,height=6cm,compat=newest}
% Style to select only points from #1 to #2 (inclusive)
\pgfplotsset{select coords between index/.style 2 args={
x filter/.code={
\ifnum\coordindex<#1\def\pgfmathresult{}\fi
\ifnum\coordindex>#2\def\pgfmathresult{}\fi
}
}}
\usepackage{filecontents}
\begin{filecontents}{datax.dat}
t,HF,Gewicht,Normal,DTG,Tr
574,1.20838,8.47718,0.981320918,-0.00509898,67.8333
3794,27.9521,2.06633,0.239198985,-0.009580838,372.333
6944,6.17274,0.420004,0.04861979,0,897.333
6964,3.65761,0.419016,0.048505419,0,900
7424,-19.0714,0.413001,0.047809121,0,900
13984,-28.3111,0.367016,0.0424858830,900
15194,-4.02426,0.321001,0.037159173,0,727.667
17074,28.3149,0.190241,0.022022356,0,414.333
18914,13.0023,-0.164632,-0.01905785,0,107.667
\end{filecontents}
\begin{document}
{\footnotesize
\begin{tikzpicture}
\bigskip
\pgfplotsset{
scale only axis,
minor x tick num=3,
}
\begin{axis}[
axis y line*=left,
ymin=-0.1, ymax=1.1,
minor y tick num=4,
xlabel=Time (\si{\second}),
%xlabel=Temperature (\si{\degreeCelsius}),
ylabel=\ref{TGA} Mass ($\%$),
,
]
\addplot [smooth,thick,cyan,] table [,x=t, y=Normal, col sep=comma] {datax.dat};
\label{TGA}
\end{axis}
\begin{axis}[
axis y line*=right,
minor y tick num=4,
ylabel=\ref{DTG} Derivative Mass ($\% /\ \si{\degreeCelsius}$),
]
\addplot [smooth,thick,dashed,green!60!black,] table [x=t, y=HF, col sep=comma] {datax.dat};
\label{DTG};
\end{axis}
\end{tikzpicture}
}
\end{document}
решение1
Это добавляет температуру как функцию времени на верхней оси x. Поскольку температуры не равноудалены, некоторые тики подавляются, поскольку в противном случае они перекрывались бы. Минимальное расстояние кодируется в
\pgfmathtruncatemacroFPU{\itest}{ifthenelse(abs(\Time/10000-\LastTime/10000)>0.1,1,0)}%
Обратите внимание, что строка, начинающаяся с 13984
в вашем файле данных, имеет только 5 элементов. Я добавил элемент. Когда вы запускаете этот код, убедитесь, что вы действительно перезаписываете файл данных, с вашим исходным набором данных вы получите ошибку unbalanced columns
.
\documentclass[]{standalone}
% UNITS
\usepackage{siunitx}
\sisetup{per-mode=fraction, abbreviations}
% GRAPHICS
\usepackage{pgfplots}
\pgfplotsset{width=9cm,height=6cm,compat=newest}
% Style to select only points from #1 to #2 (inclusive)
\pgfplotsset{select coords between index/.style 2 args={
x filter/.code={
\ifnum\coordindex<#1\def\pgfmathresult{}\fi
\ifnum\coordindex>#2\def\pgfmathresult{}\fi
}
}}
\usepackage{filecontents}
\begin{filecontents*}{datax.dat}
t,HF,Gewicht,Normal,DTG,Tr
574,1.20838,8.47718,0.981320918,-0.00509898,67.8333
3794,27.9521,2.06633,0.239198985,-0.009580838,372.333
6944,6.17274,0.420004,0.04861979,0,897.333
6964,3.65761,0.419016,0.048505419,0,900
7424,-19.0714,0.413001,0.047809121,0,900
13984,-28.3111,0.367016,0.0424858830,0,900
15194,-4.02426,0.321001,0.037159173,0,727.667
17074,28.3149,0.190241,0.022022356,0,414.333
18914,13.0023,-0.164632,-0.01905785,0,107.667
\end{filecontents*}
\newcommand*{\ReadOutElement}[4]{%
\pgfplotstablegetelem{#2}{[index]#3}\of{#1}%
\let#4\pgfplotsretval
}
\def\pgfmathtruncatemacroFPU#1#2{\begingroup%
\pgfkeys{/pgf/fpu,/pgf/fpu/output format=fixed}%
\pgfmathtruncatemacro{#1}{#2}%
\pgfmathsmuggle#1\endgroup}%
\begin{document}
{\footnotesize%<- am not sure about this one
\begin{tikzpicture}
\pgfplotstableread[header=true,col sep=comma]{datax.dat}{\datatable}%
\pgfplotstablegetrowsof{\datatable}%
\pgfmathtruncatemacro{\numrows}{\pgfplotsretval}%
\pgfplotsforeachungrouped \iloop in {0,...,\the\numexpr\numrows-1}
{\ReadOutElement{\datatable}{\iloop}{0}{\Time}%
\ReadOutElement{\datatable}{\iloop}{5}{\Temp}%
\pgfmathtruncatemacro{\Temp}{\Temp}%
\ifnum\iloop=0
\edef\LstTimes{\Time}
\edef\LstTemps{\Temp}
\edef\LastTime{\Time}
\else
\pgfmathtruncatemacroFPU{\itest}{ifthenelse(abs(\Time/10000-\LastTime/10000)>0.1,1,0)}%
\ifnum\itest=1
\edef\LstTimes{\LstTimes,\Time}
\edef\LstTemps{\LstTemps,\Temp}
\edef\LastTime{\Time}
\fi
\fi}
%\pgfmathsetmacro{\LstTemps}{{\LstTemps}[0]}
% \show\LstTemps
%\typeout{\LstTimes,\LstTemps}
\pgfplotsset{
scale only axis,
minor x tick num=3,
}
\begin{axis}[
axis y line*=left,
ymin=-0.1, ymax=1.1,
minor y tick num=4,
xlabel=Time (\si{\second}),
ylabel=\ref{TGA} Mass ($\%$),
,
]
\addplot [smooth,thick,cyan,] table [,x=t, y=Normal, col sep=comma] {datax.dat};
\label{TGA}
\end{axis}
\begin{axis}[
axis y line*=right,
minor y tick num=4,
axis x line*=right,scaled ticks = false,
xlabel={Temperature (\si{\degreeCelsius})},
xtick=\LstTimes,xticklabels/.expanded=\LstTemps,
%xticklabel style={/pgf/number format/precision = 0},
ylabel=\ref{DTG} Derivative Mass ($\% /\ \si{\degreeCelsius}$),
]
\addplot [smooth,thick,dashed,green!60!black,] table [x=t, y=HF, col sep=comma] {datax.dat};
\label{DTG};
\end{axis}
\end{tikzpicture}
}
\end{document}