具有明确标签的符号坐标顺序错误

具有明确标签的符号坐标顺序错误

我正在尝试使用 pgfplotsscatter图来创建矩阵表示。到目前为止,一切正常,我使用表格作为输入,并通过元数据为散点着色。我的xy列之间的标签距离应该相等,所以我使用了符号坐标。现在我认为我需要跳过一些数据,因为它无效,但这会产生错误的图。

为了跳过数据,我尝试用nan数据表中的相应行替换无效值,或者直接删除它们。结果如下。我最接近的结果显示在点下3.,这对应于主要问题,但是为了完整性,因为我会采取任何解决方案,我也展示了我的替代方法2.

  1. 原来的,包含无效数据的完整表格可以在下面的 MWE 中找到,我的声誉不足以发布三张图片。

  2. 无效数据替换为nan 数据,其中 .csv 文件中的所有无效值均已替换为 <code>nan</code> 为了指出差异,y=0.5行中除 之外的所有数据x=3.2都是无效的。它在此表示中已被替换为最小值,看起来它的值为 2(黄色)(另请参见下文,3。)

  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

我将data-cut.csv在这个回答中仅讨论这个案例。

您使用的相关选项是:

ytick=data,
symbolic y coords={0.5,1,2,3},
yticklabels={0.5,1.0,2.0,3.0}

请注意,yticklabels值并不对应于symbolic y coords值,而是对应于ytick由于使用了而自动定义的值data。这意味着第一个元素的坐标将被标记为0.5,而不是元素的坐标符号坐标 0.5

一个简单的解决方法是正确定义ytick

ytick={0.5,1,2,3}

使成为

答案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 来解决此问题。

相关内容