在 tikz 中创建带有弹出窗口的交互式图表

在 tikz 中创建带有弹出窗口的交互式图表

我正在尝试在 LaTeX 中创建二维图。我面临两个问题:

  1. 我正在使用该ocg包通过单击图例来显示/消失图表。它部分因为图中的标记不会消失,所以可以正常工作。知道为什么会发生这种情况吗?

  2. 我想让图表更具描述性,因此单击某个位置可以为其提供更多信息。例如,在当前代码中,如果我将鼠标移到“A”上,它会使用 pdftooltips 给出关于它的描述。我在给定的情况下使用“A”的坐标位置,但我能否获得图表本身的类似解释,假设如果我用方形标记指向图表上的任意位置,它应该可以解释它。

这是我所拥有的一个工作示例。

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{plotmarks}
\usetikzlibrary{pgfplots.groupplots}
\usetikzlibrary{backgrounds,fit,calc,shadows,chains,ocgx,shapes.geometric}
\usepackage{scalefnt}
\usepackage{pdfcomment}

\usepackage{ocgx}
\usepackage{pgfplots}
\usepgfplotslibrary{groupplots}
\pgfplotsset{compat=1.5,samples=10}
\pgfplotsset{every axis legend/.append style={scale=8}}
\usepackage{verbatim}
\usepackage[active,tightpage]{preview}
\PreviewEnvironment{tikzpicture}
\setlength\PreviewBorder{5pt}%

\newcommand*\rfrac[2]{{}^{#1}\!/_{#2}}
\newcommand*{\Peak}{18}
% The data files, written on the first run.
\begin{filecontents}{in1.data}
Granularity      Speedup
16      0.71
32      0.72
64      0.75
128     0.80
256     0.89
512     1.08
1024    1.44
2048    2.10
4096    3.23
\end{filecontents}

\begin{filecontents}{in2.data}
Granularity      Speedup
16      0.71
32      0.73
64      0.75
128     0.80
256     0.90
512     1.10
1024    1.50
2048    2.28
4096 3.80
\end{filecontents}

\begin{document}
\begin{center}
\tikzset{every mark/.append style={scale=2}}
\begin{tikzpicture}

\begin{loglogaxis}[
height=10cm, width=20cm,
axis lines=left,
xlabel={Granularity (Bytes)},
ylabel= {Speedup},
xmin=8,
xmax=8192,
xtick={16,32,64,128,256,512,1024,2048,4096,8192},
xticklabels={16,,,128,,,1K,,,8K,},
ymin=0.1,
ymax=100,
ytick={0.1,1,10,100},
yticklabels={0.1,1,10,100},
ymajorgrids,
legend entries={\switchocg{actual}{LogCA},\switchocg{A}{$A_{10x}$}},
legend columns=-1,
legend style={at={(0.8,-0.4)},font=\Huge},
xticklabel style={
rotate=37,},
]
\begin{scope}[ocg={ref=actual,status=visible}]
\addplot  [black,solid,very thick] table {in1.data};
\end{scope}
\begin{scope}[ocg={ref=A,status=visible}]
\addplot  [mark=square] table {in2.data};
\end{scope}

\node(source1) at (axis cs:0,\Peak){};
\node(destination1) at (axis cs:67108864,\Peak){};
\draw[-,very thick,red](source1)--(destination1);

\node[black,above] (c) at (axis cs:16,\Peak){A};
\draw (c) node {\pdftooltip{\rule{0pt}{5pt}\rule{5pt}{0pt}}{Hint: Peak Acceleration}};

\end{loglogaxis}
\end{tikzpicture}
\end{center}
\end{document}

答案1

  1. 这适用于较新版本的pgfplots。您有两种解决方案:(1)升级到合适的版本pgfplots或(2)添加clip marker pathsaxis(此功能会导致标记的特殊绘图层混淆 OCG)。

  2. 您可能想看一下clickable随附的库pgfplots,它允许使用内置方法添加交互式图表。其主要功能包括

    • 单击某处会弹出一个窗口,其中显示鼠标光标下方的坐标
    • 单击坐标即可显示有关相关数据点的可自定义元数据(这是最接近“绘图元数据”的内置功能)
    • 拖放显示起点和终点两者之间的直线的斜率

结果如下clickable

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{plotmarks}
\usetikzlibrary{pgfplots.groupplots}
\usetikzlibrary{backgrounds,fit,calc,shadows,chains,ocgx,shapes.geometric}
\usepackage{scalefnt}
\usepackage{pdfcomment}

\usepackage{ocgx}
\usepackage{pgfplots}
\usepgfplotslibrary{groupplots}

\usepgfplotslibrary{clickable}
\pgfplotsset{compat=1.5,samples=10}
\pgfplotsset{every axis legend/.append style={scale=8}}
\usepackage{verbatim}
\usepackage[active,tightpage]{preview}
\PreviewEnvironment{tikzpicture}
\setlength\PreviewBorder{5pt}%

\newcommand*\rfrac[2]{{}^{#1}\!/_{#2}}
\newcommand*{\Peak}{18}
% The data files, written on the first run.
\begin{filecontents}{in1.data}
Granularity      Speedup
16      0.71
32      0.72
64      0.75
128     0.80
256     0.89
512     1.08
1024    1.44
2048    2.10
4096    3.23
\end{filecontents}

\begin{filecontents}{in2.data}
Granularity      Speedup
16      0.71
32      0.73
64      0.75
128     0.80
256     0.90
512     1.10
1024    1.50
2048    2.28
4096 3.80
\end{filecontents}

\begin{document}
\begin{center}
\tikzset{every mark/.append style={scale=2}}
\begin{tikzpicture}

\begin{loglogaxis}[
height=10cm, width=20cm,
axis lines=left,
xlabel={Granularity (Bytes)},
ylabel= {Speedup},
xmin=8,
xmax=8192,
xtick={16,32,64,128,256,512,1024,2048,4096,8192},
xticklabels={16,,,128,,,1K,,,8K,},
ymin=0.1,
ymax=100,
ytick={0.1,1,10,100},
yticklabels={0.1,1,10,100},
ymajorgrids,
legend entries={\switchocg{actual}{LogCA},\switchocg{A}{$A_{10x}$}},
legend columns=-1,
legend style={at={(0.8,-0.4)},font=\Huge},
xticklabel style={
rotate=37,},
]
\begin{scope}[ocg={ref=actual,status=visible}]
\addplot  [black,solid,very thick,
    clickable coords={in1 (xy)}] table {in1.data};
\end{scope}
\begin{scope}[ocg={ref=A,status=visible}]
\addplot  [mark=square,
    clickable coords={in2 (xy)}] table {in2.data};
\end{scope}

\node(source1) at (axis cs:0,\Peak){};
\node(destination1) at (axis cs:67108864,\Peak){};
\draw[-,very thick,red](source1)--(destination1);

\node[black,above] (c) at (axis cs:16,\Peak){A};
\draw (c) node {\pdftooltip{\rule{0pt}{5pt}\rule{5pt}{0pt}}{Hint: Peak Acceleration}};

\end{loglogaxis}
\end{tikzpicture}
\end{center}
\end{document}

单击数据点in2.dat扩展参数clickable coords={in2 (xy)}

enter image description here

同样适用于in1.dat-- 但由于没有标记,因此更加棘手:

enter image description here

单击轴上的某处:

enter image description here

拖放即可显示斜率:

enter image description here

clickable库具有特殊的运行时要求,因为它需要 LaTeX 包insdljseforms,并且我相信这些库在过去的某个时候已经变为非自由的。我的系统上仍然有一些旧的免费版本的这些库,我承认我不确定它们是否仍然是 TeX 发行版的一部分。

相关内容