pgfplots:两条线末端相交“不平滑”的问题

pgfplots:两条线末端相交“不平滑”的问题

我遇到了类似以下问题这个问题关于tikz绘图,但对于pgfplots情节来说。我想创建一个绘图,其中一个区域填充不透明,而相邻区域填充不透明。透明区域应由实线覆盖。我设法用以下代码获得了我想要的东西:

\documentclass{standalone}

\usepackage{pgfplots}
\pgfplotsset{compat=1.3}

\usepackage{pgfplotstable} % For \pgfplotstableread
\usepgfplotslibrary{external}
\tikzexternalize

\usepackage{filecontents}

\begin{filecontents}{total.dos}
0  0  0  0  0   
1  2 -2  2 -2  
2  4 -4  4 -4  
3  2 -2  2 -2  
4  0  0  0  0 
5  1 -1  0  0 
6  2 -2  0  0 
7  1 -1  0  0 
8  0  0  0  0 
THIS WAS: TOTAL
\end{filecontents}

\pgfplotstableread[comment chars={T}]{total.dos}\total

\begin{document}

% Set a filename for the next tikzpicture.
\tikzsetnextfilename{total_dos} 

\begin{tikzpicture}
\begin{axis}[ymax=7, ymin=-7, xlabel={Energy [eV]}, ylabel={Intensity}, legend pos=north east]

\addplot [restrict x to domain=4:8, no markers, draw=red, fill=red, fill opacity=0.3] table [x=0, y expr=\thisrowno{2} - \thisrowno{4}] {\total}; \addlegendentry{$2-4$}

\addplot [restrict x to domain=4:8, no markers, draw=blue, fill=blue, fill opacity=0.3] table [x=0, y expr=\thisrowno{1} - \thisrowno{3}] {\total}; \addlegendentry{$1-3$}

\addplot [restrict x to domain=0:4, no markers, draw=blue , fill=blue] table [x=0, y=3] {\total}; \addlegendentry{$3$}

\addplot [restrict x to domain=0:4, no markers, draw=red, fill=red] table [x=0, y=4] {\total}; \addlegendentry{$4$}

\end{axis}
\end{tikzpicture}
\end{document}

由此得到以下图片:

在此处输入图片描述

问题在于涂层线末端的交叉点(来自选项的交叉点draw=<color>)。它们不平滑,但看起来像这样:

在此处输入图片描述

我的问题是:我怎样才能使这些事情顺利进行?

旁注:我知道使用该选项draw=none可以实现我想要的行为,但是我没有围绕透明区域的线。

编辑:

我偶然发现了一些有趣的事情:Adobe Acrobat X 和 SumatraPDF 处理绘图的方式似乎略有不同。Acrobat 会截掉最右侧行尾超出绘图范围的部分(我不知道该用什么词来形容它),而 SumatraPDF 则不会。有趣的是,左侧或中间的行尾不会发生这种情况(见上图,这是用 Acrobat 制作的)。

在此处输入图片描述

我不确定为什么会这样,也不确定这是否会影响我的问题的可能解决方案。也许这是一个值得在另一个问题中解决的问题?或者这只是一个不应该在这里问的 PDF 查看器问题?

答案1

由于draw = none给出了正确的行为,我们可以简化问题。draw = none在 中的红色和蓝色区域周围使用domain = 0:4。现在如果我们使用line join = round, line width = .08pt,我们仍然可以看到暗淡区域周围的边框,但我们只需要担心一条线的连接。但是,由于我们使用了line width = .08pt,因此在 放大时很难注意到任何东西1600%

正如你所见,我们仍然有一个边框:

在此处输入图片描述

放大后1600%我们发现连接没有问题:

在此处输入图片描述

对于您来说这是一个可以接受的解决方案吗?


选项 2:

\documentclass[tikz]{standalone}
\usetikzlibrary{arrows}
\begin{document}

\begin{tikzpicture}[]
  \begin{scope}
    \clip (0, 0) rectangle (8, 5);
    \filldraw[blue] (0, 0) -- (2, 4) -- (4, 0) -- cycle;
    \filldraw[blue, opacity = .3, draw = blue]
    (4, 0) -- (6, 2) -- (8, 0) -- cycle;
  \end{scope}

    \begin{scope}
    \clip (0, 0) rectangle (8, -5);
    \filldraw[red] (0, 0) -- (2, -4) -- (4, 0) -- cycle;
    \filldraw[red, opacity = .3, draw = red]
    (4, 0) -- (6, -2) -- (8, 0) -- cycle;
  \end{scope}
\end{tikzpicture}
\end{document}

现在您需要做的就是绘制轴。

在此处输入图片描述

那么这里就是交叉点:

在此处输入图片描述


轮廓颜色较深:

在此处输入图片描述

在此处输入图片描述

\documentclass[tikz]{standalone}
\usetikzlibrary{arrows}
\begin{document}

\begin{tikzpicture}[]
  \begin{scope}
    \clip (0, 0) rectangle (8, 5);
    \filldraw[blue] (0, 0) -- (2, 4) -- (4, 0) -- cycle;
    \filldraw[blue, opacity = .3, draw = blue]
    (4, 0) -- (6, 2) -- (8, 0) -- cycle;
    \draw[blue] (4, 0) -- (6, 2) -- (8, 0);
  \end{scope}

    \begin{scope}
    \clip (0, 0) rectangle (8, -5);
    \filldraw[red] (0, 0) -- (2, -4) -- (4, 0) -- cycle;
    \filldraw[red, opacity = .3, draw = red]
    (4, 0) -- (6, -2) -- (8, 0) -- cycle;
    \draw[red] (4, 0) -- (6, -2) -- (8, 0);
  \end{scope}
\end{tikzpicture}
\end{document}

相关内容