Tikz pgf 图:x 轴上字母标签的循环移位

Tikz pgf 图:x 轴上字母标签的循环移位

我有以下代码来生成图表

\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}

在此处输入图片描述

相关内容