我有一个由两个 y 轴组成的图。当我在每个轴环境中添加图例项时,第一个图例项将绘制在第二个轴的图“后面”。因此,我认为解决方案可能是使用 \ref \label 在文档末尾绘制两个图例项,这样它们将出现在所有图的最前面,而不是隐藏起来。不幸的是,使用 tikz 外部化会出现错误“未定义的引用....”,并且图例项仅给出“??”。我查看了使用 \legend \ref 和外部化的手册,但它没有帮助。我尝试编译了几次。
\documentclass[fontsize=12pt,openright,oneside,DIV11,a4paper,numbers=noenddot,headsepline,parskip=half]{scrbook}
\usepackage[latin1]{inputenc}
\usepackage[cmex10]{amsmath}
\usepackage{siunitx}
\usepackage{tikz}
\usetikzlibrary[shapes.arrows]
\usepackage{pgfplots}
\pgfplotsset{compat=1.3}
% set up externalization
\usetikzlibrary{pgfplots.external}
\tikzset{external/system call={lualatex \tikzexternalcheckshellescape -halt-on-error -interaction=batchmode -jobname "\image" "\texsource"}}
\tikzexternalize
\begin{document}
\thispagestyle{empty}
\begin{tikzpicture}
\begin{axis}[
legend cell align=left,
bar width=7pt,
xmin=-3, xmax=30,
axis y line*=left,
xlabel=Laser current / \si{\milli\ampere},
ylabel=Tuning range / \si{\nano\metre},
nodes near coords align=left,
nodes near coords,]
\addplot[ybar, ybar legend, draw=gray, fill=gray, color=gray] table[x=current,y=tuning] {Tun_SMSR.txt};
% \addlegendentry{Abstimmbereich};
\label{Abstimmbereich};
\end{axis}
\begin{axis}[
every axis legend/.append style={fill=white, anchor=north west, at={(0.35,0.18)}},
legend cell align=left,
ybar=5pt,
ybar interval=0.6,
bar width=7pt,
xmin=-3, xmax=30,
ymin=30, ymax=60,
axis y line*=right,
axis x line=none,
ylabel=SMSR / \si{\deci\bel},
nodes near coords align=left,
nodes near coords,]
\addplot[ybar, ybar legend, draw=black, color=black] table[x=current,y=SMSR] {Tun_SMSR.txt};
\label{SMSR};
% \addlegendentry{SMSR};
\end{axis}
\node [draw,fill=white] at (rel axis cs: 0.7,0.15) {\shortstack[l]{
\ref{Abstimmbereich} Abstimmbereich\\
\ref{SMSR} SMSR
}};
\end{tikzpicture}
\end{document}
我正在用命令进行编译
lualatex -shell-escape "document name".tex
最终的图形显示了图例,但没有符号,而是“??”。
答案1
您指的是已外部化为单独的 pdf 的标签 - 这是一项复杂的任务。
此处的“复杂”是指“对于标准 -shell-escape 图像外部化来说太复杂”。为了引用某个外部图像内部的某些内容,您必须采取特殊步骤。
引用 pgfplots 手册中的一段话:“对于点 a),\ref
只有当您手动或通过 make 发出所需的系统调用时,外部化图形的内部才会起作用。初始配置mode=convert with system call
不支持
\ref
。但您可以复制粘贴生成的系统调用mode=convert with system call
并手动发出。原因是\ref
信息存储在主.aux
文件中,但调用时此辅助文件尚未完全写入mode=convert with system call
(存在竞争条件)。请注意,\pageref
不支持(抱歉)。因此:如果您有\ref
外部图形的内部,请考虑使用mode=list and make
或复制粘贴图像的系统调用并手动发出。”
或者,您可以等待(比如说)一周,直到下一个版本的 pgfplots 发布。它支持分层图形,这样第一个图例就不会出现在第二个轴的后面。
另一种替代解决方案可能是使用以下命令将第一个图的图例条目插入到第二个图像的图例中\addlegendimage{<style>}
:
\documentclass{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.3}
\begin{document}
\begin{tikzpicture}
\pgfplotsset{
plot 0/.style={
ybar, ybar legend, draw=gray, fill=gray, color=gray
}
}
\begin{axis}[
legend cell align=left,
bar width=7pt,
xmin=0, xmax=1,
axis y line*=left,
xlabel=Laser current,
ylabel=Tuning range,
nodes near coords align=left,
nodes near coords,]
\addplot[plot 0] {rand};
% \addlegendentry{Abstimmbereich};
% \label{Abstimmbereich};
\end{axis}
\begin{axis}[
every axis legend/.append style={fill=white, anchor=north west, at={(0.35,0.18)}},
legend cell align=left,
ybar=5pt,
ybar interval=0.6,
bar width=7pt,
xmin=0, xmax=1,
ymin=30, ymax=60,
axis y line*=right,
axis x line=none,
ylabel=SMSR,
nodes near coords align=left,
nodes near coords,]
\addlegendentry{Abstimmbereich}
\addlegendimage{plot 0}
\addplot[ybar, ybar legend, draw=black, color=black] {30 + rand*30};
\label{SMSR};
\addlegendentry{SMSR};
\end{axis}
\end{tikzpicture}
\end{document}
请注意,我故意从您的数据文件和其他一些内容中删除了示例 - 这里唯一的重点是特殊的图例构造。这也适用于图像外化。
为了共享通用选项,我提取了您的第一个图的样式并在两个地方使用它(这与和具有相同的效果\label{Abstimmbereich}
,refstyle={Abstimmbereich}
但它无缝集成到图像外部化工作流程中)。