我想从 csv 文件中绘制颜色值矩阵。灵感来自本网站,我开始在下面写下我的 MWE,并添加了这边走从我的数据文件中动态加载符号刻度/标签。
然而,结果发现,我得到的刻度/标签并不明显,而是重复的,就像我的渲染显示的那样。
另一种思考方式(根据@杰克的评论)没有flexible (x|y)ticklabels from table
告诉 PGFplots 这些标签应该是符号的,因为使用symbolic (x|y) coords
会手动执行此操作。
我如何告诉 PGFplots我的数据文件中xitem
和yitem
列中的所有不同值都将用作符号标签?
也许问题出在(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}