我有以下代码来生成图表
\documentclass{standalone}
\usepackage{tikz}
\usepackage{pgfplots}
\pgfplotstableread[row sep=\\,col sep=&]{
letter & freq \\
a & 11 \\
b & 0 \\
c & 4 \\
d & 3 \\
e & 11 \\
f & 7 \\
g & 1 \\
h & 1 \\
i & 11 \\
j & 5 \\
k & 3 \\
l & 0 \\
m & 2 \\
n & 6 \\
o & 9 \\
p & 3 \\
q & 0 \\
r & 6 \\
s & 4 \\
t & 5 \\
u & 3 \\
v & 2 \\
w & 10 \\
x & 7 \\
y & 11 \\
z & 9 \\ }\alph
\begin{document}
\begin{tikzpicture}[scale=0.44,every node/.style={scale=0.44}]
\begin{axis}[
ybar=0pt,
bar width=.25cm,
enlargelimits=0.05,
symbolic x coords={a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z},
xtick=data,
xticklabel style={text height=2ex}
]
\addplot[green,fill=green] table[x=letter,y=freq]{\alph};
\end{axis}
\end{tikzpicture}
\end{document}
我想循环旋转列(无需手动操作)。
我的最终目标是生成一个新命令\shift
,使得\shift{e}
(或\shift{4}
) 生成与给定代码等同的图形
symbolic x coords={e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a,b,c,d},
答案1
您已经可以使用pgffor
工具以紧凑的方式循环显示(英语)字母表。虽然我刚刚做了一些有用的宏,但宏并不是完全可扩展的。
您可能要避免使用诸如\alph
等的宏名,因为它们通常被知名的软件包甚至 LaTeX 本身使用。
\documentclass{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.13}
\def\cyclicalph#1{\if#1a\def\zzz{a,...,z}\else\def\zzz{#1,...,z,a,b,...,#1}\fi%
\gdef\mylist{}%
\foreach\x[count=\xi]in\zzz{%
\ifnum\xi>26\else%
\expandafter\xdef\expandafter\mylist\expandafter{%
\mylist\x\ifnum\xi=26 \else,\fi%
}%
\fi%
}%
}
\pgfplotstableread[row sep=\\,col sep=&]{
letter & freq \\
a & 11 \\ b & 0 \\ c & 4 \\
d & 3 \\ e & 11 \\ f & 7 \\
g & 1 \\ h & 1 \\ i & 11 \\
j & 5 \\ k & 3 \\ l & 0 \\
m & 2 \\ n & 6 \\ o & 9 \\
p & 3 \\ q & 0 \\ r & 6 \\
s & 4 \\ t & 5 \\ u & 3 \\
v & 2 \\ w & 10 \\ x & 7 \\
y & 11 \\ z & 9 \\ }\myalph
\begin{document}
\begin{tikzpicture}[scale=0.44,every node/.style={scale=0.44}]
\cyclicalph{e} %<---- Set the cycle somewhere before the axis.
% It will set the `\mylist` macro
\begin{axis}[
ybar=0pt,
bar width=.25cm,
enlargelimits=0.05,
symbolic x coords/.expand once=\mylist,% Use it here
xtick=data,
xticklabel style={text height=2ex}
]
\addplot[green,fill=green] table[x=letter,y=freq]{\myalph};
\end{axis}
\end{tikzpicture}
\end{document}