统一色彩图

统一色彩图

我绘制了示例 xyz 矩阵的轮廓。

\documentclass[border=5pt]{standalone}
\usepackage{pgfplots}
\usepackage{filecontents}

\pgfplotsset{compat=newest}

\usepgfplotslibrary{colormaps}

\pgfplotsset{/pgfplots/colormap={colmap}{
        rgb255=(0,0,102)
        rgb255=(0,0,255)
        rgb255=(0,255,255)
        rgb255=(255,255,255)
        rgb255=(255,255,0)
        rgb255=(255,0,0)
        rgb255=(102,0,0)
    }
}

\begin{filecontents}{test.txt}
1000    1000    1.29403
1001    1000    -0.95088
1002    1000    -0.30126
1003    1000    -0.40809
1004    1000    -2.75751
1005    1000    0.09494
1006    1000    0.3524
1007    1000    -0.22458
1008    1000    0.07528
1009    1000    -0.18389
1010    1000    -1.22863
1000    1005    0.37092
1001    1005    0.82494
1002    1005    -0.38305
1003    1005    0.55881
1004    1005    -0.86485
1005    1005    -1.22789
1006    1005    -2.14137
1007    1005    0.17896
1008    1005    -0.99818
1009    1005    -0.4235
1010    1005    1.06234
1000    1010    0.0401
1001    1010    1.29255
1002    1010    -0.9097
1003    1010    1.51249
1004    1010    -0.38255
1005    1010    0.99011
1006    1010    -0.192
1007    1010    0.01934
1008    1010    0.17867
1009    1010    0.69037
1010    1010    -0.8169
\end{filecontents}

\begin{document}
    \begin{tikzpicture}
        \begin{axis}[
            view={0}{90},
            colorbar,           
            ]
            
            \addplot3[
            surf,
            shader=interp,
            mesh/rows=3,
            mesh/cols=11,
            mesh/check=false,
            ]
            table[
            x index=0,
            y index=1,
            z index=2,
            ] {test.txt};           
        \end{axis}
    \end{tikzpicture}
\end{document}

在此处输入图片描述

现在,我的目标是围绕零创建一个统一的色彩图。因此,可以为相应的负值和正值定义两个单独的色彩图,但我想到的最简单的方法是找到所有 z 值的绝对值的最大值,并将其用作point meta min色彩point meta max图。

由于我还不太熟悉 LaTeX 中的编码,也许有人可以帮助我解决我的问题。

编辑:我看了pdfplotstable 文档并开始计算z值的绝对值。

\documentclass{article}
\usepackage{pgfplots}
\usepackage{pgfplotstable}
\pgfplotsset{compat=newest}
\usepackage{filecontents}

\begin{filecontents}[overwrite]{test.txt}
1000    1000    1.29403
1001    1000    -0.95088
1002    1000    -0.30126
1003    1000    -0.40809
1004    1000    -2.75751
1005    1000    0.09494
1006    1000    0.3524
1007    1000    -0.22458
1008    1000    0.07528
1009    1000    -0.18389
1010    1000    -1.22863
1000    1005    0.37092
1001    1005    0.82494
1002    1005    -0.38305
1003    1005    0.55881
1004    1005    -0.86485
1005    1005    -1.22789
1006    1005    -2.14137
1007    1005    0.17896
1008    1005    -0.99818
1009    1005    -0.4235
1010    1005    1.06234
1000    1010    0.0401
1001    1010    1.29255
1002    1010    -0.9097
1003    1010    1.51249
1004    1010    -0.38255
1005    1010    0.99011
1006    1010    -0.192
1007    1010    0.01934
1008    1010    0.17867
1009    1010    0.69037
1010    1010    -0.8169
\end{filecontents}

\pgfplotstableread{test.txt}{\testdata}

\begin{document}

\pgfplotstableset{
    create on use/abs/.style={
        create col/expr={abs(\thisrowno{2})}},
}
\pgfplotstabletypeset[
columns={abs},
]
{\testdata}

\end{document} 

现在我需要计算这个表的最大值并保存该值。但是我又卡在这里了,因为我不知道如何“保存”结果表以供进一步计算。

所以我的新问题是:如何使结果表可用于其他计算?

答案1

好吧,我会尝试一下。首先,我通过添加标题修改了您的输入文件(以便更好地理解发生了什么)。

\begin{filecontents}[overwrite]{test.txt}
    x       y       z
    1000    1000    1.29403
...
\end{filecontents}

然后我深入研究了文档pgfplotstable并使用了搜索功能。所以最后:这对你有用吗?

\documentclass[tikz]{standalone}
\usepackage{pgfplots}
\usepackage{pgfplotstable}
\pgfplotsset{compat=newest}
\usepackage{filecontents}

\newcommand{\findMinMax}[4]{%
    % Input arguments:
    %   1: Filename
    %   2: Name of column to search
    % Output argument:
    %   3: Minimum value
    %   4: Maximum value
    \pgfplotstableread[col sep=space]{#1}\intable%
    %
    \pgfplotstablegetrowsof{\intable}
    \pgfmathsetmacro{\nRowsTab}{\pgfplotsretval-1}
    \pgfplotstablegetcolsof{\intable}
    \pgfmathsetmacro{\nCols}{\pgfplotsretval-1}
    %
    \pgfplotstablegetelem{0}{#2}\of{\intable}%
    \pgfmathsetmacro{\maxval}{\pgfplotsretval}%
    \pgfmathsetmacro{\minval}{\pgfplotsretval}%
    %
    \pgfplotsinvokeforeach {1,...,\nRowsTab}{%
        \pgfplotstablegetelem{##1}{#2}\of{\intable}%
        %
        \pgfmathsetmacro{\currVal}{\pgfplotsretval}%
        %
        \ifdim \currVal pt > \maxval pt%
        \pgfmathsetmacro{\maxval}{\pgfplotsretval}%
        \fi%
        %
        \ifdim \currVal pt < \minval pt%
        \pgfmathsetmacro{\minval}{\pgfplotsretval}%
        \fi%
    }%
    \let#3\minval%
    \let#4\maxval%
}

\begin{document}

\pgfmathsetmacro{\pMax}{0}
\pgfmathsetmacro{\pMin}{0}
\findMinMax{test.txt}{z}{\pMin}{\pMax}
\pgfmathsetmacro{\pLim}{abs(\pMin) > abs(\pMax) ? abs(\pMin) : abs(\pMax)} % 1st EDIT

\begin{tikzpicture}
\begin{axis}[
view={0}{90},
xlabel={\pMax},% only to show an output
ylabel={\pMin},
colorbar,
colorbar style={
    point meta max=\pLim,  % 1st EDIT
    point meta min=-\pLim,
},  
colormap name=viridis, % nope, i won't use Jet - nobody should
]

\addplot3[surf, shader=interp, mesh/rows=3, mesh/cols=11, mesh/check=false, 
point meta=\thisrow{z},
]
table[x=x, y=y, z=z] {test.txt};           
\end{axis}
\end{tikzpicture}
\end{document}

相关内容