我正在尝试使用 PGFplots 制作这样的图表(在 Origin 中制作):
但我不知道如何正确制作 x 轴。
这是我的 MWE:
\documentclass[tikz,12pt]{standalone}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[english]{babel}
\usepackage{mathptmx}
\usetikzlibrary{pgfplots.groupplots}
\usepackage{pgfplots}
\pgfplotsset{width=12cm,compat=1.9}
\usepackage{filecontents}
\begin{filecontents}{1.csv}
-.5 0
1 0.02
2 0.03
3 0.035
4 0.04
5 0.05
10 0.06
100 0.15
200 0.17
500 0.18
1000 0.2
15000 0.22
\end{filecontents}
\begin{filecontents}{2.csv}
-2 -.5
0 2
1 5
2 1
3 7
4 8
5 9
50 10
250 15
1000 20
5000 14
20000 12
\end{filecontents}
\begin{document}
\pgfplotsset{every axis/.append style={
%font=\footnotesize,
line width=1 pt,
tick style={line width=.6pt}}}
\begin{tikzpicture}
\begin{axis}[
clip mode=individual,
xmode=log,
height=8cm,
width=12cm,
ymax=.2,
ylabel={$\Delta$O.\,D.},
xlabel={Time delay, ps},
minor x tick num=4,
minor y tick num=4,
]
\addplot[green,mark=*] table [x index=0,y index=1] {1.csv};
\end{axis}
\begin{axis}[
clip mode=individual,
xmode=log,
height=8cm,
width=12cm,
hide x axis,
axis y line*=right,
]
\addplot[red,mark=square*] table [x index=0,y index=1] {2.csv};
\end{axis}
\end{tikzpicture}
\end{document}
通过这个例子,我当然看不到我的数据的负值。
答案1
您可以使用x coord trafo
来转换 x 输入坐标:
\documentclass[tikz,12pt]{standalone}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[english]{babel}
\usepackage{mathptmx}
\usetikzlibrary{pgfplots.groupplots}
\usepackage{pgfplots}
\pgfplotsset{width=12cm,compat=1.9}
\usepackage{filecontents}
\begin{filecontents}{1.csv}
-.5 0
1 0.02
2 0.03
3 0.035
4 0.04
5 0.05
10 0.06
100 0.15
200 0.17
500 0.18
1000 0.2
15000 0.22
\end{filecontents}
\begin{filecontents}{2.csv}
-2 -.5
0 2
1 5
2 1
3 7
4 8
5 9
50 10
250 15
1000 20
5000 14
20000 12
\end{filecontents}
\begin{document}
\pgfplotsset{every axis/.append style={
%font=\footnotesize,
line width=1 pt,
tick style={line width=.6pt}}}
\begin{tikzpicture}
\def\xBarrier{10}
\begin{axis}[
ylabel={$\Delta$O.\,D.},
xlabel={Time delay, ps},
minor x tick num=4,
minor y tick num=4,
x coord trafo/.code={%
\pgfkeys{/pgf/fpu}%
\pgfmathparse{#1 < \xBarrier ? #1 : (\xBarrier - ln(\xBarrier) +ln(#1))}%
},%
xtick={-6,-4,...,8,1e1,1e2,1e3,1e4,1e5},
xticklabel={%
\pgfkeys{/pgf/fpu}%
\pgfmathparse{\tick < \xBarrier ? \tick :
% the inverse of 'x coord trafo' is
% X=exp(\tick + ln(10)-10)
%
% in order to show log10, we have to compute log(X)/log10
% which is this:
(\tick + ln(10)-10)/ln(10)
}%
\ifpgfmathfloatcomparison
\pgfmathprintnumber\tick
\else
$10^{\pgfmathprintnumber\pgfmathresult}$%
\fi
\pgfkeys{/pgf/fpu=false}%
},
]
\addplot[green,mark=*] table [x index=0,y index=1] {1.csv};
\addplot[red,mark=square*] table [x index=0,y index=1] {2.csv};
\end{axis}
\end{tikzpicture}
\end{document}
通常情况下,人们会使用
x coord inv trafo/.code={%
\pgfkeys{/pgf/fpu}%
\pgfmathparse{#1 < \xBarrier ? #1 : exp(#1 + ln(10)-10)}%
\pgfkeys{/pgf/fpu=false}%
},%
撤消转换。但在这种情况下,采用xticklabel
(生成 x 刻度标签的代码)更简单。我的采用实现了该逆转换并对其应用了 log10。然后它排版10^log10(inverse)
。
我认为这种方法无法生成微小的刻度线。