绘制原点超出 xmin-xmax、ymin-ymax 范围的 pgfplot 标记?

绘制原点超出 xmin-xmax、ymin-ymax 范围的 pgfplot 标记?

作为问题,我正在处理绘制某些标记的问题。John Kormylo 的解决方案对于该问题中呈现的 MWE 非常有效。在这里,我想通过另外两个数据项扩展该图,即

\documentclass{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\begin{filecontents}{pgfplots-plot-limits.dat}
X    Y    color
0    0    0
0.45    0   1
0.5    0    2
0.55    0    3
\end{filecontents}%
\def\axisdim{6cm}% adjustable size
\begin{document}
    \begin{tikzpicture}
      \clip (0,0) rectangle (\axisdim,\axisdim);
      \pgfdeclareplotmark{thiscube}{\draw[ultra thin, fill] (rel axis cs: 0.23438,-0.5) -- (rel axis cs: 0.26562,-0.5) --
        (rel axis cs:-0.23438,0.5) -- (rel axis cs: -0.26562,0.5);}
      \begin{axis}[colormap/hot,width=\axisdim,height=\axisdim,scale only axis=true,
            xmin=-0.5, xmax=0.5, ymin=-0.5, ymax=0.5,
            axis equal,xtick=\empty, ytick=\empty,hide axis
        ]
        \addplot+[scatter,scatter src=explicit,mark=thiscube,only marks]
            table [x=X,y=Y,meta=color] {pgfplots-plot-limits.dat};
        \pgfplotsextra{\draw[thick,blue] (axis cs:-0.5,-0.5) rectangle (axis cs:0.5,0.5);}
        \end{axis}
    \end{tikzpicture}
\end{document}

得到下图 第四次尝试

这看起来是个不错的解决方案,标记大小合适,第一个标记位于中间(x=0),右边两个标记是X=0.45X=0.5。但是,在最后一个标记上方,应该存在另一个标记(与倒数第二个标记的距离相同),即X=0.55。它没有被绘制,因为其原点位于 指定的范围之外,尽管xmin,xmax,ymin,ymax标记到达了该范围。

扩大范围会(遗憾地)增加相对明确的标记,这是我不想要的(是否clip仍然有效,我还没有检查)。

有没有办法禁用此限制,以便 pgfplots 绘制指定范围之外的标记?或者是否有其他解决方案来绘制最后一个数据点?那就太好了。

答案1

一个可行的解决方案是扩展轴限制(根据先前的知识,我知道我的标记不会超出原始边界的单位立方体,因此完整[-1,1]^2应该足够了。裁剪需要进行调整。并且由于通过扩展限制(其相对于上述解决方案中的单位立方体定义)标记的(不必要的)缩放,我们通过基本的 pgf 命令来定义它(无论如何,这是 John Kormylo 的第一个想法)。然后 MWE 读取并

\documentclass{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\begin{filecontents}{pgfplots-plot-limits.dat}
X    Y    color
0    0    0
0.45    0   1
0.5    0    2
0.55    0    3
\end{filecontents}%
\def\axisdim{6cm}% adjustable size
\begin{document}
    \begin{tikzpicture}
        \pgfdeclareplotmark{thiscube}{
          \pgfpathmoveto{\pgfpointdiff{\pgfpointxy{0.23438}{-0.5}}{\pgfpointxy{0}{0}}}
          \pgfpathlineto{\pgfpointdiff{\pgfpointxy{0.26562}{-0.5}}{\pgfpointxy{0}{0}}}
          \pgfpathlineto{\pgfpointdiff{\pgfpointxy{-0.23438}{0.5}}{\pgfpointxy{0}{0}}}
          \pgfpathlineto{\pgfpointdiff{\pgfpointxy{-0.26562}{0.5}}{\pgfpointxy{0}{0}}}
          \pgfpathclose
          \pgfusepath{fill}
        }
      \clip (.5*\axisdim,.5*\axisdim) rectangle (1.5*\axisdim,1.5*\axisdim);
      \begin{axis}[colormap/hot,width=2*\axisdim,height=2*\axisdim,scale only axis=true,
            xmin=-1, xmax=1, ymin=-1, ymax=1,
            axis equal,xtick=\empty, ytick=\empty,hide axis
        ]
        \addplot+[scatter,scatter src=explicit,mark=thiscube,only marks]
            table [x=X,y=Y,meta=color] {pgfplots-plot-limits.dat};
        \pgfplotsextra{\draw[thick,blue] (axis cs:-0.5,-0.5) rectangle (axis cs:0.5,0.5);}
        \end{axis}
    \end{tikzpicture}
\end{document}

虽然这确实有效,但还有更简单的解决方案,即禁用剪辑,但也许这种方法可能对某些人有帮助。

相关内容