这个问题是这是关于手动放置轮廓标签的一个在pgfplots
使用该选项生成的轮廓图中contour prepared
。简而言之,我现在面临的问题是手动放置的轮廓标签全部为黑色(或我想要的任何其他颜色),并且与轮廓线的颜色不匹配。例如,请参阅:
所以我的问题是:我如何修改下面的文件,以便标签颜色与轮廓线的颜色相匹配,就像标签是由生成的一样pgfplots
?
我在解决方案中寻找的内容:
- 出于显而易见的原因,我希望颜色匹配是自动的,而不必手动完成。根据手册
pgfplots
,这似乎需要使用一些东西mapped color!50!black
,但我无法让它工作。 - 如果我决定跳过标记每条轮廓线(例如,如果它们间距相等且彼此靠近),解决方案也能奏效,那就太好了。(具体来说,如果我只标记上图中的 0.5 和 1.5 级,颜色应该保持蓝色和红色 - 1.5 级不应该是橙色,因为跳过了 1.0 级。)
以下是 MWE:
\documentclass[border=5mm]{standalone}
\usepackage{tikz,pgfplots}
\pgfplotsset{compat=1.12}
\begin{document}
\begin{tikzpicture}[scale=1.0,
label/.style={align=center,fill=white,inner sep=1pt,font=\tiny}]
\begin{axis}[width=5.0cm,height=5.0cm,xmin=0.0,xmax=1.0,ymin=0.0,ymax=1.0]
\input{contour-data.tex}
\input{contour-labels.tex}
\end{axis}
\end{tikzpicture}
\end{document}
这是data.tex
:
\addplot[contour prepared={labels=false}]
table {
0.500000E+00 0.000000E+00 0.500000E+00
0.000000E+00 0.500000E+00 0.500000E+00
0.100000E+01 0.000000E+00 0.100000E+01
0.500000E+00 0.500000E+00 0.100000E+01
0.000000E+00 0.100000E+01 0.100000E+01
0.500000E+00 0.100000E+01 0.150000E+01
0.100000E+01 0.500000E+00 0.150000E+01
};
下面是labels.tex
:
\node[label,rotate=-45.0] at (axis cs: 0.250000E+00, 0.250000E+00) {0.5};
\node[label,rotate=-45.0] at (axis cs: 0.500000E+00, 0.500000E+00) {1.0};
\node[label,rotate=-45.0] at (axis cs: 0.750000E+00, 0.750000E+00) {1.5};
答案1
您似乎想知道颜色是从哪里选择的。它们来自实际的颜色图,默认情况下为colormap name=hot
。激活时可以轻松将其可视化colorbar
。您会在手册中找到很多,colormaps
如果您愿意,甚至可以自己创建一个。
随着 PGFPlots v1.13 的新版本发布,使用手册第 193 页第 4.7.6 节中的colormap
键可以轻松从中选择颜色color of colormap
。缺点是,数字预计在区间 [0,1000] 内,因此您必须“手动”从 z 或元值计算它。以下是使用此新功能的代码。
\documentclass[border=2mm]{standalone}
\usepackage{tikz,pgfplots}
\pgfplotsset{compat=1.11}
\begin{document}
\begin{tikzpicture}[
label/.style={
align=center,fill=white,inner sep=1pt,font=\tiny,
%% adds additional space in front of the text which has exactly the
%% size of "!50!white" and is considered being a bug.
%% (To verify that this length is added, uncomment the last node
%% at the end of the axis and you will notice, that the "1.5"s
%% are overlapping each other.)
%text=.!40!white, % <-- `.' equals the actual color
%
% to avoid this bug, just turn the color definition around
text=white!60!., % <-- `.' equals the actual color
},
]
\begin{axis}[
width=5.0cm,height=5.0cm,xmin=0.0,xmax=1.0,ymin=0.0,ymax=1.0,
colorbar, % just to show where the colors come from
colormap/viridis, % <-- change colormap
% change min and max values of the colorbar
point meta min=0,point meta max=2,
]
\addplot[contour prepared={labels=false,}] table {
0.500000E+00 0.000000E+00 0.500000E+00
0.000000E+00 0.500000E+00 0.500000E+00
0.100000E+01 0.000000E+00 0.100000E+01
0.500000E+00 0.500000E+00 0.100000E+01
0.000000E+00 0.100000E+01 0.100000E+01
0.500000E+00 0.100000E+01 0.150000E+01
0.100000E+01 0.500000E+00 0.150000E+01
};
\node[color of colormap=250,label,rotate=-45.0]
at (0.250000E+00, 0.250000E+00) {0.5};
\node[color of colormap=500,label,rotate=-45.0]
at (0.500000E+00, 0.500000E+00) {1.0};
\node[color of colormap=750,label,rotate=-45.0]
at (0.750000E+00, 0.750000E+00) {1.5};
%% to show the bug, uncomment the folowing lines and switch
%% to the other `text' key in the definition of the `label' style
%\node[align=center,inner sep=1pt,font=\tiny,rotate=-45.0]
% at (0.750000E+00, 0.750000E+00) {!40!white1.5};
\end{axis}
\end{tikzpicture}
\end{document}
为了避免进行此手动计算,符号 1 的“新答案”可能是您能得到的最佳答案。
答案2
新答案
这是纯粹的 PGFPLOTS 答案。
\documentclass[border=5mm]{standalone}
\usepackage{tikz,pgfplots}
\pgfplotsset{compat=1.12}
\begin{document}
\pgfplotsset{
label/.style={
nodes={font=\tiny,fill=white,inner sep=1pt,text=mapped color,#1},
point meta=explicit,nodes near coords*,nodes near coords align=
}
}
\begin{tikzpicture}
\begin{axis}[width=5.0cm,height=5.0cm,xmin=0.0,xmax=1.0,ymin=0.0,ymax=1.0]
\addplot[contour prepared={labels=false}]table {
0.500000E+00 0.000000E+00 0.500000E+00
0.000000E+00 0.500000E+00 0.500000E+00
0.100000E+01 0.000000E+00 0.100000E+01
0.500000E+00 0.500000E+00 0.100000E+01
0.000000E+00 0.100000E+01 0.100000E+01
0.500000E+00 0.100000E+01 0.150000E+01
0.100000E+01 0.500000E+00 0.150000E+01
};
\addplot[label={rotate=-45}]coordinates{(0.250000E+00, 0.250000E+00)[0.5]};
\addplot[label={rotate=-45}]coordinates{(0.500000E+00, 0.500000E+00)[1.0]};
\addplot[label={rotate=-45}]coordinates{(0.750000E+00, 0.750000E+00)[1.5]};
\end{axis}
\end{tikzpicture}
\end{document}
关键点是,颜色可用,就像mapped color
打开了颜色计算一样。因此,point meta=explicit
我触发了颜色计算。然后,nodes near coords*
我有一个显示元值的节点,即您0.5
的问题中的 , 。最后正确对齐节点。1.0
1.5
nodes near coords align
请注意,1.0
显示为,1
因为的默认值为nodes near coords*
(中的第 2859 行pgfplots.code.tex
)。
nodes near coords*/.default={\pgfmathprintnumber\pgfplotspointmeta}
其中\pgfplotspointmeta
FPU 编号\pgfmathprintnumber
有自己的格式。你可以使用类似下面的方法更改它。
nodes near coords*={\pgfmathprintnumber[fixed zerofill]\pgfplotspointmeta}
更新
为了获得明确输出的控制,您需要表。
\documentclass[border=5mm]{standalone}
\usepackage{tikz,pgfplots}
\pgfplotsset{compat=1.12}
\begin{document}
\pgfplotsset{
label/.style={
nodes={font=\tiny,fill=white,inner sep=1pt,text=mapped color!50!black,#1},
point meta=\thisrow{color},nodes near coords*={\mylabel},nodes near coords align=,
visualization depends on=value \thisrow{label}\as\mylabel,
}
}
\begin{tikzpicture}
\begin{axis}[width=5.0cm,height=5.0cm,xmin=0.0,xmax=1.0,ymin=0.0,ymax=1.0]
\addplot[contour prepared={labels=false}]table {
0.500000E+00 0.000000E+00 0.500000E+00
0.000000E+00 0.500000E+00 0.500000E+00
0.100000E+01 0.000000E+00 0.100000E+01
0.500000E+00 0.500000E+00 0.100000E+01
0.000000E+00 0.100000E+01 0.100000E+01
0.500000E+00 0.100000E+01 0.150000E+01
0.100000E+01 0.500000E+00 0.150000E+01
};
\addplot[label={rotate=-45}]table{
x y color label
0.250000E+00 0.250000E+00 0.5 {0.50}
};
\addplot[label={rotate=-45}]table{
x y color label
0.500000E+00 0.500000E+00 1.0 {the one!}
};
\addplot[label={rotate=-45}]table{
x y color label
0.750000E+00 0.750000E+00 1.5 {$\frac32$}
};
\end{axis}
\end{tikzpicture}
\end{document}
关于旧答案
PGFPLOTS 很难理解。所以我首先想到了这个纯 Ti钾Z 方法。我说“这是一个有效示例”因为这种方法相当繁琐:A\spy
复制整个axis
环境一次。现在问自己会有多少个标签。
以下是旧答案
这是一个可行的示例。也许你可以自动化代码。
\documentclass{article}
\usepackage{pgfplots}
\usetikzlibrary{fadings,spy}
\pgfplotsset{compat=1.12}
\begin{document}
\tikzset{label/.style={circle,minimum size=10,circle,text=transparent,fill=transparent!0,font=\tiny}}
\begin{tikzfadingfrompicture}[name=label no 1]
\path(0,0)node[rotate=-45,label]{0.5};
\end{tikzfadingfrompicture}
\begin{tikzfadingfrompicture}[name=label no 2]
\path(0,0)node[rotate=-45,label]{1.0};
\end{tikzfadingfrompicture}
\begin{tikzfadingfrompicture}[name=label no 3]
\path(0,0)node[rotate=-45,label]{1.5};
\end{tikzfadingfrompicture}
\begin{tikzpicture}
\begin{scope}[spy scope={circle,magnification=20,size=15}]
\begin{axis}[width=5.0cm,height=5.0cm,xmin=0.0,xmax=1.0,ymin=0.0,ymax=1.0]
\input{data.tex}
\coordinate(coord no 1)at(axis cs: 0.750000E+00, 0.750000E+00);
\coordinate(coord no 2)at(axis cs: 0.500000E+00, 0.500000E+00);
\coordinate(coord no 3)at(axis cs: 0.250000E+00, 0.250000E+00);
\spy on(coord no 1)in node at(coord no 1);
\spy on(coord no 2)in node at(coord no 2);
\spy on(coord no 3)in node at(coord no 3);
\end{axis}
\end{scope}
\fill[white,path fading=label no 1](coord no 1)circle(25pt);
\fill[white,path fading=label no 2](coord no 2)circle(25pt);
\fill[white,path fading=label no 3](coord no 3)circle(25pt);
\end{tikzpicture}
\end{document}
分解
使用spy
库来放大线条。此步骤可确保颜色匹配。
\begin{tikzpicture}
\begin{scope}[spy scope={circle,magnification=20,size=15}]
\begin{axis}[width=5.0cm,height=5.0cm,xmin=0.0,xmax=1.0,ymin=0.0,ymax=1.0]
\input{data.tex}
\coordinate(coord no 1)at(axis cs: 0.750000E+00, 0.750000E+00);
\coordinate(coord no 2)at(axis cs: 0.500000E+00, 0.500000E+00);
\coordinate(coord no 3)at(axis cs: 0.250000E+00, 0.250000E+00);
\spy on(coord no 1)in node at(coord no 1);
\spy on(coord no 2)in node at(coord no 2);
\spy on(coord no 3)in node at(coord no 3);
\end{axis}
\end{scope}
\end{tikzpicture}
然后准备“面具”
\tikz\path(0,0)node[rotate=-45,label,fill=black,text=white]{0.5};
\tikz\path(0,0)node[rotate=-45,label,fill=black,text=white]{1.0};
\tikz\path(0,0)node[rotate=-45,label,fill=black,text=white]{1.5};
“蒙版”应该是白色的(黑色部分应该是白色的)。并且文本被打孔(白色部分应该是透明的)。这是由fadings
库实现的。
\usetikzlibrary{shadings}
\begin{tikzfadingfrompicture}[name=label no 1]
\path(0,0)node[rotate=-45,label]{0.5};
\end{tikzfadingfrompicture}
\tikz{
\shade[shading=color wheel](0,0)rectangle(2,2);
\fill[white,path fading=label no 1](1,1)circle(75pt);
}
现在将它们结合在一起。
附录
通过调整不透明度,可以使标签颜色比线条颜色稍暗。
\begin{tikzpicture}
\begin{scope}[spy scope={circle,magnification=20,size=15}]
\begin{axis}[width=5.0cm,height=5.0cm,xmin=0.0,xmax=1.0,ymin=0.0,ymax=1.0]
\input{data.tex}
\coordinate(coord no 1)at(axis cs: 0.750000E+00, 0.750000E+00);
\coordinate(coord no 2)at(axis cs: 0.500000E+00, 0.500000E+00);
\coordinate(coord no 3)at(axis cs: 0.250000E+00, 0.250000E+00);
\spy on(coord no 1)in node at(coord no 1);
\spy on(coord no 2)in node at(coord no 2);
\spy on(coord no 3)in node at(coord no 3);
\end{axis}
\end{scope}
\fill[black,opacity=.5](coord no 1)circle(5pt);
\fill[black,opacity=.5](coord no 2)circle(5pt);
\fill[black,opacity=.5](coord no 3)circle(5pt);
\fill[white,path fading=label no 1](coord no 1)circle(25pt);
\fill[white,path fading=label no 2](coord no 2)circle(25pt);
\fill[white,path fading=label no 3](coord no 3)circle(25pt);
\end{tikzpicture}