我是 Ti 新手钾Z 绘图。:)
我想用以下方式绘制 CSV 数据pgfplots
在 axis 环境中。数据的范围非常大,线性 y 轴不太合适。在 Python 中,matplotlib
有一种称为symlog
(对称对数:围绕 x 轴的镜像对数刻度)的缩放比例,它也允许负值(例如,范围从 -(10^5) 到 10^5)由于ymode=symlog
不起作用,还有其他方法可以创建symlog
类似图吗?
我的代码相当于(仅适用于正值):
\begin{tikzpicture}
\begin{axis}[
xmode=linear,
ymode=log,
xlabel=$f$ (Hz),
ylabel=$T$ (-),
title={Measured transfer function of analogue filter},
grid=both,
minor grid style={gray!25},
major grid style={gray!25},
width=0.75\linewidth,
no marks]
\addplot[line width=1pt,solid,color=blue] %
coordinates {(0,-1000) (1,-100) (2,-10) (3,-1) (4,0) (5,1) (6,10) (7,100) (8,1000)};
\addlegendentry{Transfer function};
\end{axis}
\end{tikzpicture}
来源:https://olivierpieters.be/blog/2015/10/23/latex-plotting-from-file.html
编辑:
结果是:
但是对于coordinates {(0,-1000) (1,-100) (2,-10) (3,-1) (4,0) (5,1) (6,10) (7,100) (8,1000)};
情节来说应该是这样的(-1和+1之间的比例是线性的):
答案1
现在我们开始使用y coord trafo
中的密钥pgfplots
。
该symlog
函数是使用 定义的tikzmath
。
由于某种原因,我似乎无法绘制tikzmath
包含if
条件的函数pgfplots
,因此内部结构很笨拙symlog
。
我们还定义了逆变换symexp
并将其提供给y coord inv trafo
密钥,以便能够使用axis coordinate system
。
代码
产生以下输出:
\documentclass[tikz]{standalone}
\usepackage{pgfplots}
\usetikzlibrary{math}
\tikzmath
{
function symlog(\x,\a){
\yLarge = ((\x>\a) - (\x<-\a)) * (ln(max(abs(\x/\a),1)) + 1);
\ySmall = (\x >= -\a) * (\x <= \a) * \x / \a ;
return \yLarge + \ySmall ;
};
function symexp(\y,\a){
\xLarge = ((\y>1) - (\y<-1)) * \a * exp(abs(\y) - 1) ;
\xSmall = (\y>=-1) * (\y<=1) * \a * \y ;
return \xLarge + \xSmall ;
};
}
\begin{document}
\begin{tikzpicture}
\def\basis{1}
\pgfplotsset
{
y coord trafo/.code={\pgfmathparse{symlog(#1,\basis)}\pgfmathresult},
y coord inv trafo/.code={\pgfmathparse{symexp(#1,\basis)}\pgfmathresult},
yticklabel style={/pgf/number format/.cd,int detect,precision=2},
}
\begin{axis}
[
height=12cm,
legend pos=north west,
scaled ticks = base 10:0,
domain = -5:5.5,
ytick = {-100,-10, -1,0,1,10,100},
minor ytick = {-90,-80,...,-20,-9,-8,...,-2,-.9,-.8,...,.9,2,3,...,9,20,30,...,90},
tick label style = {fill=white, fill opacity=.7},
yminorgrids = true,
ymajorgrids = true,
xmajorgrids = true,
samples=200,
axis lines=center,
]
\addplot+ [mark=none] {x} ;
\addplot+ [mark=none] {exp(x)} ;
\addplot+ [mark=none] {-exp(-x)} ;
\legend {$x$,$e^x$,$-e^{-x}$}
\end{axis}
\end{tikzpicture}
\end{document}
干杯,