ybar 图的自定义标签?

ybar 图的自定义标签?

我想制作一个图表,其中数据以条形排列,但如果条形大于一千,则每个条形都有一个自定义标签。例如,对于 18,000,标签将改为“18k”,而对于 5000 万,标签将改为“50M”,而不是“5*10^7”。对于十亿,标签将改为“2.2G”,而不是“2.2*10^9”。我尝试过但未成功找到某种方法来做到这一点,并检查了 Tikz 手册和所有数字格式选项,但无法弄清楚。

\begin{tikzpicture}
\begin{semilogyaxis}[
width=11.5cm,
height=7.5cm,
ybar,
ymin=0.1,ymax=1e10,
legend style={at={(0.5,-0.2)},
anchor=north,legend columns=-1},
symbolic x coords={
candybar,
CD,
car,
house,
mansion,
spaceshuttle
},
xtick=data,
nodes near coords,
point meta=rawy, 
nodes near coords align={vertical},
x tick label style={rotate=45,anchor=east},
ymajorgrids=true,
grid style = very thin
]
\addplot coordinates {
(candybar,0.50) 
(CD,15) 
(car,18e3) 
(house,250e3) 
(mansion,50e6)
(spaceshuttle,2.2e9)
};
\end{semilogyaxis}
\end{tikzpicture}

答案1

您可以nodes near coords根据自己的需要自定义密钥。例如,如果您使用

nodes near coords={%
  \pgfmathfloatparsenumber{\pgfplotspointmeta}%
  \pgfmathfloattomacro{\pgfmathresult}{\F}{\M}{\E}%
  \pgfmathsetmacro\mypostfix{\E<=2?0:(\E<=5?"k":(\E<=8?"M":"G"))}%
  \pgfkeys{/pgf/fpu}%
  \pgfmathparse{(\pgfplotspointmeta< 1Y1.0e3] ?1:%False
  (\pgfplotspointmeta < 1Y1.0e6]? 1Y1.0e3]:%False
    (\pgfplotspointmeta<1Y1.0e9] ? 1Y1.0e6]:1Y1.0e9])))}%
  \pgfmathparse{\pgfplotspointmeta/\pgfmathresult}%
  \pgfmathprintnumber[fixed,1000 sep=]\pgfmathresult\mypostfix%
},

你会得到

在此处输入图片描述

我还注意到舍入是有问题的(像往常一样),所以如果您使用像 999999 这样的值,则可能需要使用舍入。

相关内容