我遇到了类似以下问题这个问题关于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}