我想制作一个图表,其中数据以条形排列,但如果条形大于一千,则每个条形都有一个自定义标签。例如,对于 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 这样的值,则可能需要使用舍入。