pgfplots:如何从文件中加载不同的符号刻度/标签?

pgfplots:如何从文件中加载不同的符号刻度/标签?

我想从 csv 文件中绘制颜色值矩阵。灵感来自本网站,我开始在下面写下我的 MWE,并添加了这边走从我的数据文件中动态加载符号刻度/标签。

然而,结果发现,我得到的刻度/标签并不明显,而是重复的,就像我的渲染显示的那样。
另一种思考方式(根据@杰克的评论)没有flexible (x|y)ticklabels from table告诉 PGFplots 这些标签应该是符号的,因为使用symbolic (x|y) coords会手动执行此操作。

我如何告诉 PGFplots我的数据文件中xitemyitem列中的所有不同值都将用作符号标签?
也许问题出在(x|y) expr=\coordindex。我在这里想要填写来自相应列(xitem| yitem)的(符号,而不是数字)值。但是使用x=xitem,y=yitem,却给出错误“Package PGF Math Error: Could not parse input 'X' as a floating point number”。

渲染:
没有区别

梅威瑟:

\documentclass{standalone}

\usepackage{filecontents}
\usepackage{pgfplots, pgfplotstable}

\begin{filecontents}{data.csv}
yitem,xitem,val
r,X,0.1
r,Y,0.2
r,Z,0.3
d,X,0.4
d,Y,0.5
d,Z,0.6
j,X,0.5
j,Y,0.8
j,Z,0.9
\end{filecontents}

\pgfplotstableread[col sep=comma]{data.csv}\datatable
\makeatletter
\pgfplotsset{
    /pgfplots/flexible xticklabels from table/.code n args={3}{
        \pgfplotstableread[#3]{#1}\coordinate@table
        \pgfplotstablegetcolumn{#2}\of{\coordinate@table}\to\pgfplots@xticklabels
        \let\pgfplots@xticklabel=\pgfplots@user@ticklabel@list@x
    },
    /pgfplots/flexible yticklabels from table/.code n args={3}{
        \pgfplotstableread[#3]{#1}\coordinate@table
        \pgfplotstablegetcolumn{#2}\of{\coordinate@table}\to\pgfplots@yticklabels
        \let\pgfplots@yticklabel=\pgfplots@user@ticklabel@list@y
    }
}
\makeatother

\begin{document}
\begin{tikzpicture}
\begin{axis}[
    flexible xticklabels from table={data.csv}{xitem}{col sep=comma},
    xtick=data,
    flexible yticklabels from table={data.csv}{yitem}{col sep=comma},
    ytick=data,
    unbounded coords=jump,
]
\addplot[
    mark=square*,
    only marks,
    scatter,
    point meta=explicit,
] table [
    col sep=comma,
    x expr=\coordindex,
    y expr=\coordindex,
    meta expr=\thisrow{val},
] {\datatable};

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

答案1

您需要生成从符号坐标到笛卡尔坐标的映射。如果笛卡尔坐标对应于符号在列中首次出现的排名,则可以使用该etoolbox包生成表示映射的列表,然后使用symbolic x coords该列表将该映射传递给 PGFPlots:

\documentclass[border=5mm]{article}

\usepackage{filecontents}
\usepackage{pgfplots, pgfplotstable}
\usepackage{etoolbox}

\begin{filecontents}{data.csv}
yitem,xitem,val
a,X,0.1
a,Y,0.2
a,Z,0.3
b,X,0.4
b,Y,0.5
b,Z,0.6
c,X,0.5
c,Y,0.8
c,Z,0.9
\end{filecontents}

\pgfplotstableread[col sep=comma]{data.csv}\datatable


\begin{document}
\def\xlistmacro{}
\def\xliststring{}
\pgfplotstableforeachcolumnelement{xitem}\of\datatable\as\entry{%
\xifinlist{\entry}{\xlistmacro}{}{
        \listxadd{\xlistmacro}{\entry}
        \edef\xliststring{\xliststring\entry,}
    }
}

\def\ylistmacro{}
\def\yliststring{}
\pgfplotstableforeachcolumnelement{yitem}\of\datatable\as\entry{%
\xifinlist{\entry}{\ylistmacro}{}{
        \listxadd{\ylistmacro}{\entry}
        \edef\yliststring{\yliststring\entry,}
    }
}

\begin{tikzpicture}
\begin{axis}[
    xtick=data,
    ytick=data,
    symbolic x coords/.expand once={\xliststring},
    symbolic y coords/.expand once={\yliststring},
]
\addplot[
    mark=square*,
    only marks,
    scatter,
    point meta=explicit,
] table [
    col sep=comma,
    meta expr=\thisrow{val},
    x=xitem, y=yitem
] {\datatable};

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

相关内容