我正在尝试使用 pgfplotsscatter
图来创建矩阵表示。到目前为止,一切正常,我使用表格作为输入,并通过元数据为散点着色。我的x
和y
列之间的标签距离应该相等,所以我使用了符号坐标。现在我认为我需要跳过一些数据,因为它无效,但这会产生错误的图。
为了跳过数据,我尝试用nan
数据表中的相应行替换无效值,或者直接删除它们。结果如下。我最接近的结果显示在点下3.,这对应于主要问题,但是为了完整性,因为我会采取任何解决方案,我也展示了我的替代方法2.。
这原来的,包含无效数据的完整表格可以在下面的 MWE 中找到,我的声誉不足以发布三张图片。
无效数据替换为
nan
为了指出差异,y=0.5
行中除 之外的所有数据x=3.2
都是无效的。它在此表示中已被替换为最小值,看起来它的值为 2(黄色)(另请参见下文,3。)无效行删除来自数据集 这里我从输入中删除了线条,图形输出是正确的。然而,现在我的符号坐标标签混淆了。如果我删除
yticklabels={0.5, 1.0,2.0,3.0}
,坐标标签正确。如果我yticklabels={1.0,2.0,3.0,0.5}
以错误的顺序写入 ,我也会得到正确的结果。所以,我猜映射出了问题。
有人知道为什么会发生这种情况吗?这是一个错误,还是有(明显的)解决方案?
对于这三种情况,我的 MWE 如下:
\documentclass{article}
\usepackage{mwe}
\usepackage{filecontents}
\usepackage{pgfplots}
\usetikzlibrary{external}
\tikzexternalize[
optimize=true,
mode=convert with system call
]
\begin{document}
\begin{filecontents*}{data-complete.csv}
x y val
1.6 0.5 2.6672
1.6 1 2.8316
1.6 2 3.1649
1.6 3 3.6555
2 0.5 2.093
2 1 1.9881
2 2 2.2279
2 3 3.1646
2.4 0.5 2.1954
2.4 1 1.9281
2.4 2 2.6658
2.4 3 3.8962
2.8 0.5 2.4146
2.8 1 2.5022
2.8 2 3.1728
2.8 3 4.1442
3.2 0.5 2.8957
3.2 1 3.1781
3.2 2 4.2107
3.2 3 6.6232
3.6 0.5 4.7931
3.6 1 4.2339
3.6 2 6.0685
3.6 3 7.5076
\end{filecontents*}
\begin{filecontents*}{data-cut.csv}
x y val
1.6 1 2.8316
1.6 2 3.1649
1.6 3 3.6555
2 1 1.9881
2 2 2.2279
2 3 3.1646
2.4 1 1.9281
2.4 2 2.6658
2.4 3 3.8962
2.8 1 2.5022
2.8 2 3.1728
2.8 3 4.1442
3.2 0.5 2.8957
3.2 1 3.1781
3.2 2 4.2107
3.2 3 6.6232
3.6 1 4.2339
3.6 2 6.0685
3.6 3 7.5076
\end{filecontents*}
\begin{filecontents*}{data-nan.csv}
x y val
1.6 0.5 nan
1.6 1 2.8316
1.6 2 3.1649
1.6 3 3.6555
2 0.5 nan
2 1 1.9881
2 2 2.2279
2 3 3.1646
2.4 0.5 nan
2.4 1 1.9281
2.4 2 2.6658
2.4 3 3.8962
2.8 0.5 nan
2.8 1 2.5022
2.8 2 3.1728
2.8 3 4.1442
3.2 0.5 2.8957
3.2 1 3.1781
3.2 2 4.2107
3.2 3 6.6232
3.6 0.5 nan
3.6 1 4.2339
3.6 2 6.0685
3.6 3 7.5076
\end{filecontents*}
\tikzsetnextfilename{complete}
\begin{tikzpicture}
\pgfplotsset{
colormap={yellowred}{rgb255(0cm)=(255,255,0); rgb255(1cm)=(255,0,0)}
}
\begin{axis}[
%width=10cm, height=10cm,
ytick=data, xtick=data,
xlabel={x},
ylabel={y},
enlargelimits={abs=0.6cm},
symbolic y coords={0.5,1,2,3}, yticklabels={0.5,1.0,2.0,3.0},
symbolic x coords={1.6,2,2.4,2.8,3.2,3.6}, xticklabels={1.6, 2.0, 2.4, 2.8, 3.2, 3.6},
x=1cm, y=1cm,
point meta min=2, point meta max=8,
unbounded coords=jump,
colorbar, colormap name=yellowred,
colorbar style={
ylabel={Value, -},
ylabel near ticks,
yticklabel style={
/pgf/number format/precision=0,
/pgf/number format/fixed,
/pgf/number format/fixed zerofill,
},
},
]
\addplot[
only marks,
mark size=0.42cm, mark=square*,
scatter, scatter src=explicit,
scatter/use mapped color={
draw=mapped color,
fill=mapped color
},
]
table[x=x, y=y, meta=val] {data-complete.csv};
\end{axis}
\end{tikzpicture}
\tikzsetnextfilename{cut}
\begin{tikzpicture}
\pgfplotsset{
colormap={yellowred}{rgb255(0cm)=(255,255,0); rgb255(1cm)=(255,0,0)}
}
\begin{axis}[
%width=10cm, height=10cm,
ytick=data, xtick=data,
xlabel={x},
ylabel={y},
enlargelimits={abs=0.6cm},
symbolic y coords={0.5,1,2,3}, yticklabels={0.5,1.0,2.0,3.0},
symbolic x coords={1.6,2,2.4,2.8,3.2,3.6}, xticklabels={1.6, 2.0, 2.4, 2.8, 3.2, 3.6},
x=1cm, y=1cm,
point meta min=2, point meta max=8,
unbounded coords=jump,
colorbar, colormap name=yellowred,
colorbar style={
ylabel={Value, -},
ylabel near ticks,
yticklabel style={
/pgf/number format/precision=0,
/pgf/number format/fixed,
/pgf/number format/fixed zerofill,
},
},
]
\addplot[
only marks,
mark size=0.42cm, mark=square*,
scatter, scatter src=explicit,
scatter/use mapped color={
draw=mapped color,
fill=mapped color
},
]
table[x=x, y=y, meta=val] {data-cut.csv};
\end{axis}
\end{tikzpicture}
\tikzsetnextfilename{nan}
\begin{tikzpicture}
\pgfplotsset{
colormap={yellowred}{rgb255(0cm)=(255,255,0); rgb255(1cm)=(255,0,0)}
}
\begin{axis}[
%width=10cm, height=10cm,
ytick=data, xtick=data,
xlabel={x},
ylabel={y},
enlargelimits={abs=0.6cm},
symbolic y coords={0.5,1,2,3}, yticklabels={0.5,1.0,2.0,3.0},
symbolic x coords={1.6,2,2.4,2.8,3.2,3.6}, xticklabels={1.6, 2.0, 2.4, 2.8, 3.2, 3.6},
x=1cm, y=1cm,
point meta min=2, point meta max=8,
unbounded coords=jump,
colorbar, colormap name=yellowred,
colorbar style={
ylabel={Value, -},
ylabel near ticks,
yticklabel style={
/pgf/number format/precision=0,
/pgf/number format/fixed,
/pgf/number format/fixed zerofill,
},
},
]
\addplot[
only marks,
mark size=0.42cm, mark=square*,
scatter, scatter src=explicit,
scatter/use mapped color={
draw=mapped color,
fill=mapped color
},
]
table[x=x, y=y, meta=val] {data-nan.csv};
\end{axis}
\end{tikzpicture}
\end{document}
答案1
答案2
对于这种data-nan.csv
情况:
nan
您可以使用一种解决方法,通过使用具有三种颜色的颜色图将最低值(在本例中)映射到白色:
colormap={yellowred}{rgb255(0cm)=(255,255,255); rgb255(0.1cm)=(255,255,0); rgb255(100cm)=(255,0,0)}
地图上的距离经过精心挑选,以便尽快过渡到黄色,从而使最低的实际值显示正确的颜色。输出与@tonioelgringo 的答案相同。
请注意,问题中有两个值低于 2,它们将被映射到颜色图的开头(在本例中为白色)。可以通过将这些值更改为例如 2.01 或更改point meta min
为例如 1.9 来解决此问题。