pgfplots 中的自动数据识别和绘图处理

pgfplots 中的自动数据识别和绘图处理

我是 LaTeX 的初学者,正在尝试将其用于工业文档,例如测量报告。一个例子是 MWE 的真实位置图。圆圈表示真实位置公差。圆圈外的数据点不符合要求。

我想通过以下方式改进它:

  1. 根据实际数据自动指定图表的限制(即通过扩展某个因素的 X 或 Y 列中的最大值,X 轴和 Y 轴相同),而不是在以下几行中手动指定:

    xmin = -0.35, xmax =  0.35,
    ymin = -0.35, ymax =  0.35,
    
  2. 类似地,以下线条创建的垂直线和水平线应自动适应图形大小。

     \addplot+[sharp plot, mark=none, black] coordinates {(-0.50,0)  (0.5,0)};
     \addplot+[sharp plot, mark=none, black] coordinates {(0,-0.5)  (0,0.5)};
    
  3. 如果可能的话,请根据到中心的极点距离而不是 Y 值来指定点的颜色。

  4. 垂直对齐颜色条标签,即小数点分隔符,而不是当前位置。

  5. 作为奖励,为所有符合公差的点(在圆内或圆上)分配中性(即蓝色)颜色,并仅对不符合要求的点进行颜色编码......

\documentclass{article}
\usepackage[T1]{fontenc} 
\usepackage{pgfplots}
\usepackage{pgfplotstable}
\usepackage[active,tightpage]{preview} %produces the plot only when activated
\PreviewEnvironment{tikzpicture} %produces the plot only when activated
\pgfplotsset{compat=1.5.1}
\usepackage{filecontents}

\begin{document}
\thispagestyle{empty}
\begin{filecontents}{Data.dat}
X       Y      
0.059   0.207      
-0.030  0.198      
-0.035  0.042      
0.064   0.130      
-0.118  0.133      
-0.128  0.195      
-0.143  0.022      
-0.148  0.182      
-0.079  -0.005     
-0.081  0.124      
-0.091  0.126      
-0.090  0.261      
-0.049  -0.037     
-0.045  0.063      
-0.048  0.124      
-0.051  0.199      
-0.040  -0.063     
-0.025  0.035      
-0.028  0.117      
-0.057  0.270      
-0.020  -0.075   
-0.022  0.025
-0.024  0.138
-0.33   0.288
0.012   -0.111
0.069   0.004
0.014   0.101
-0.021  -0.293
\end{filecontents}


\pgfplotstableread{Data.dat}\mytable % Creating a macro containin the data of external file

\tikzset{every mark/.append style={scale=0.7}} %Adjusting size of marks in plot

\begin{tikzpicture}
\begin{axis}[scale= 2, width=8cm,height=8cm,
%axis on top,
ticklabel style={/pgf/number format/.cd, fixed, precision=2,use comma},
  xmin = -0.35, xmax =  0.35, %Plot X size
  ymin = -0.35, ymax =  0.35, % Plot Y size
    xlabel = {True position (mm), X axis},
    ylabel = {True position (mm), Y axis},
title= Pin tip location (solder side),
    colorbar, colorbar style={ticklabel style={/pgf/number format/.cd, fixed, fixed zerofill, precision=2,use comma}},
]

\addplot[scatter, only marks, mark=*]
 table {\mytable};
 \draw[red] (axis cs:0,0) circle[radius=0.1];
\addplot+[sharp plot, mark=none, black] coordinates {(-0.50,0)  (0.5,0)}; 
\addplot+[sharp plot, mark=none, black] coordinates {(0,-0.5)  (0,0.5)}; 
\end{axis}
\end{tikzpicture}

\end{document}

答案1

  1. 我假设您想将原点保持在图的中心,因此enlargelimits, axis equal这里无济于事。我们需要计算表中的最大绝对值并使用它来设置xminxmax等。我编写了一个宏\findmaxAbs{<table>}{<first column name>}{<second column name>}{<fraction>},它可以找到最大绝对值,将其增加<fraction>并将其存储在中\maxAbs。然后您可以使用它来设置限制。

  2. 正如 percusse 所说,你可以使用以下方法之一如何在绘图中添加零线?

  3. 颜色由值定义meta,您可以使用 将其设置为任何您喜欢的值meta expr=< expression >。在这种情况下,您可以使用meta expr={sqrt((\thisrow{X})^2+(\thisrow{Y})^2)}来获取欧几里得距离。通过设置point meta min=0.1,颜色条将从 0.1 开始。

  4. 这比较棘手,我认为这应该是一个单独的问题。

  5. 您可以使用scatter/@pre marker code/.append code。手册里有一个很好的例子。

\documentclass{article}
\usepackage[T1]{fontenc} 
\usepackage{pgfplots}
\usepackage{pgfplotstable}
\usepgfplotslibrary{colormaps}
\usepackage[active,tightpage]{preview} %produces the plot only when activated
\PreviewEnvironment{tikzpicture} %produces the plot only when activated
\pgfplotsset{compat=1.5.1}
\usepackage{filecontents}

\newcommand{\findmax}[3]{
    \pgfplotstablesort[sort key={#2},sort cmp={float >}]{\sorted}{#1}%
    \pgfplotstablegetelem{0}{#2}\of{\sorted}%
    \pgfmathsetmacro#3{\pgfplotsretval}
}

\newcommand{\findmin}[3]{
    \pgfplotstablesort[sort key={#2},sort cmp={float <}]{\sorted}{#1}%
    \pgfplotstablegetelem{0}{#2}\of{\sorted}%
    \pgfmathsetmacro#3{\pgfplotsretval}
}

\newcommand{\findmaxAbs}[4]{
    \findmax{#1}{#2}{\maxX}
    \findmax{#1}{#3}{\maxY}
    \findmin{#1}{#2}{\minX}
    \findmin{#1}{#3}{\minY}
    \pgfmathsetmacro\maxAbs{(1+#4)*max(abs(\maxX),abs(\maxY),abs(\minX),abs(\minY))}
}




\begin{document}
\thispagestyle{empty}
\begin{filecontents}{Data.dat}
X       Y      
0.059   0.207      
-0.030  0.198      
-0.035  0.042      
0.064   0.130      
-0.118  0.133      
-0.128  0.195      
-0.143  0.022      
-0.148  0.182      
-0.079  -0.005     
-0.081  0.124      
-0.091  0.126      
-0.090  0.261      
-0.049  -0.037     
-0.045  0.063      
-0.048  0.124      
-0.051  0.199      
-0.040  -0.063     
-0.025  0.035      
-0.028  0.117      
-0.057  0.270      
-0.020  -0.075   
-0.022  0.025
-0.024  0.138
-0.33   0.288
0.012   -0.111
0.069   0.004
0.014   0.101
-0.021  -0.293
\end{filecontents}


\pgfplotstableread{Data.dat}\mytable % Creating a macro containin the data of external file


\findmaxAbs{\mytable}{X}{Y}{0.1}

\tikzset{mark size=2} %Adjusting size of marks in plot
\makeatletter
\begin{tikzpicture}
\begin{axis}[scale= 2, width=8cm,height=8cm,
%axis on top,
ticklabel style={/pgf/number format/.cd, fixed, precision=2,use comma},
    xmin=-\maxAbs, xmax=\maxAbs,
    ymin=-\maxAbs, ymax=\maxAbs,
    extra y ticks       = 0,
      extra y tick labels = ,
      extra y tick style  = { grid = major },
        extra x ticks       = 0,
      extra x tick labels = ,
      extra x tick style  = { grid = major },
    axis equal,enlargelimits=0,
    xlabel = {True position (mm), X axis},
    ylabel = {True position (mm), Y axis},
    title= Pin tip location (solder side),
    colorbar, colorbar style={ticklabel style={/pgf/number format/.cd, fixed, fixed zerofill, precision=2,use comma}},
    point meta=explicit,
    colormap={errormap}{color(0cm)=(yellow); color(1cm)=(red)},
    scatter/@pre marker code/.append code={%
        \pgfkeys{/pgf/fpu=true,/pgf/fpu/output format=fixed}
        \pgfmathtruncatemacro\iserror{\pgfplotspointmeta>0.1}
        \ifnum\iserror=0
            \def\markopts{fill=blue, draw=blue}%
        \else
            \def\markopts{}%
        \fi
        \expandafter\scope\expandafter[\markopts]
        \pgfkeys{/pgf/fpu=false}
    },%
    scatter/@post marker code/.append code={%
        \endscope
    },
    point meta min=0.1
]

\addplot[scatter, only marks, mark=*]
 table [meta expr={sqrt((\thisrow{X})^2+(\thisrow{Y})^2)}] {\mytable};
 \draw[red] (axis cs:0,0) circle[radius=0.1];
\end{axis}
\end{tikzpicture}

\end{document}

相关内容