我想使用 pgfplots 手册中没有的非标准绘图样式来创建绘图。如果我可以利用该函数\pgfplotstableread
,然后以某种方式循环遍历表格的行和列,以使用 tikz 图片创建自定义绘图,那就太好了。我一直在查看 pgfplots 和 pgfplotstable 手册,但不知道是否有办法做到这一点!任何帮助都将不胜感激!
答案1
感谢 Jake 的建议(以及对 pgfplotstable 手册的更深入阅读),我找到了命令\pgfplotstablegetelem
。这正是我制作图表所需要的。以下是我希望我的图表在以下假数据上呈现的示例
A B C D
0.2 0.3 0.6 0.3
0.3 0.8 0.9 0.4
0.4 0.6 0.7 0.2
0.5 0.7 0.95 0.8
0.1 0.2 0.3 0.4
0.3 0.5 0.4 0.6
我将此表设置为成对的行。偶数行为绘图中范围的下限,奇数行为范围的上限。
\documentclass{article}
\usepackage{tikz}
\usepackage{pgfplots}
\usepackage{pgfplotstable}
\usepackage{ifthen}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}[scale=10,x=1cm,y=1cm]
\pgfplotstableread[header=true]{table4.dat}{\datawhead}
\pgfplotstableread[header=false]{table4.dat}{\data}
\pgfplotstablegetrowsof{\datawhead} %Determine no. of rows
\pgfmathsetmacro{\rows}{\pgfplotsretval}
\pgfplotstablegetcolsof{\data} % Determine no. of cols
\pgfmathsetmacro{\cols}{\pgfplotsretval}
\draw[->,ultra thick] (0,0)--(1,0); % axes
\draw[->,ultra thick] (0,0)--(0,1);
\pgfmathsetmacro{\r}{\rows-2} % do some math to separate the range plots and categories
\pgfmathsetmacro{\cats}{\rows/2}
\pgfmathsetmacro{\lines}{\cats*\cols}
\pgfmathsetmacro{\seps}{1/ \lines*0.8}
\pgfmathsetmacro{\bufs}{1-\lines*\seps}
\pgfmathsetmacro{\bufs}{\bufs/\cats}
\pgfmathsetmacro{\catlen}{(\seps*\cols+\bufs)/2}
\foreach \j in {0,2,...,\r}{ % category loop
\foreach \i/\clr in {0/red,1/blue,2/green,3/blue!40!red}{ %subcategory loop
\pgfmathsetmacro{\jp}{\j+1}
\pgfmathsetmacro{\x}{\bufs + \j*\catlen+\i*\seps} % x coordinate
\pgfplotstablegetelem{\j}{[index]\i}\of\datawhead
\pgfmathsetmacro{\ya}{\pgfplotsretval} % y coord 1
\pgfplotstablegetelem{\jp}{[index]\i}\of\datawhead
\pgfmathsetmacro{\yb}{\pgfplotsretval} % y coord 2
\pgfplotstablegetelem{0}{[index]\i}\of\data
\draw[lightgray, thin](\x,0)--(\x,1);
\node[rectangle,fill=\clr,inner sep=1.2pt,minimum width=6pt](bottom) at (\x,\ya){};
\node[rectangle,fill=\clr,inner sep=1.2pt,minimum width=6pt](top) at (\x,\yb){};
\draw[\clr,thick](bottom)--(top);
\draw(\x,-0.01)--(\x,0.01)node[rotate=90,left=4pt]{\pgfplotsretval};
}
\pgfmathsetmacro{\jm}{\j/2}
\node[anchor=west] at (\bufs+\j*\catlen,-0.1){Category \jm};
}
\end{tikzpicture}
\end{document}
输出结果如下。这几乎就是我想要的,虽然代码有点乱,但它允许我更改数据并轻松生成更新的图。不过最后一件事...我似乎无法将类别索引设为整数。
谢谢杰克,也感谢 pgfplotstable 的作者!