我是 LaTeX 的初学者,正在尝试将其用于工业文档,例如测量报告。一个例子是 MWE 的真实位置图。圆圈表示真实位置公差。圆圈外的数据点不符合要求。
我想通过以下方式改进它:
根据实际数据自动指定图表的限制(即通过扩展某个因素的 X 或 Y 列中的最大值,X 轴和 Y 轴相同),而不是在以下几行中手动指定:
xmin = -0.35, xmax = 0.35, ymin = -0.35, ymax = 0.35,
类似地,以下线条创建的垂直线和水平线应自动适应图形大小。
\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)};
如果可能的话,请根据到中心的极点距离而不是 Y 值来指定点的颜色。
垂直对齐颜色条标签,即小数点分隔符,而不是当前位置。
作为奖励,为所有符合公差的点(在圆内或圆上)分配中性(即蓝色)颜色,并仅对不符合要求的点进行颜色编码......
\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
我假设您想将原点保持在图的中心,因此
enlargelimits, axis equal
这里无济于事。我们需要计算表中的最大绝对值并使用它来设置xmin
、xmax
等。我编写了一个宏\findmaxAbs{<table>}{<first column name>}{<second column name>}{<fraction>}
,它可以找到最大绝对值,将其增加<fraction>
并将其存储在中\maxAbs
。然后您可以使用它来设置限制。正如 percusse 所说,你可以使用以下方法之一如何在绘图中添加零线?。
颜色由值定义
meta
,您可以使用 将其设置为任何您喜欢的值meta expr=< expression >
。在这种情况下,您可以使用meta expr={sqrt((\thisrow{X})^2+(\thisrow{Y})^2)}
来获取欧几里得距离。通过设置point meta min=0.1
,颜色条将从 0.1 开始。这比较棘手,我认为这应该是一个单独的问题。
您可以使用
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}