绘制相差巨大的数值的有效方法

绘制相差巨大的数值的有效方法

这是一张漂亮的简单条形图。当绘制的值大致相同时,这种图很有效,但当存在异常值时,它可能会造成混乱。

例如,我想绘制一些值:
最低值为 90,000,000(9000 万);
第二高值为 500,000,000(5 亿);
最高值为 3,000,000,000(30 亿); †30 亿(短刻度)

首先,即使我移动了小数点,这些条形图也会从页面上滑落下来。

第二点是,它影响图表上显示的实际数字。

第三点是,大多数值都接近于该范围的低端(大约 1 亿),因此大多数条形图都非常小,只有这一个条形图非常大。解决方案是什么?

在此处输入图片描述

\documentclass[margin=10, varwidth]{standalone}
\usepackage{tikz}
\tikzset{barlabels/.style={font=\footnotesize\sffamily}, declare function={barheight=5pt;}}

\begin{document}
\begin{center}
\begin{tikzpicture}[y=0.3cm, x=0.06cm]
\foreach [count=\i from 0] \p/\t in{
    10.1/Argentina,
    50.0/Armenia,
    300.0/Belgium,
    10.2/Brazil,
    10.3/Bulgaria,
    9.0/Canada,
    9.5/China,
    11.0/Taiwan,
    10.7/Czechia,
    9.9/Finland}
{\node [anchor=base east, barlabels, name=i-\i] at (0,-\i) {\t};
\fill [blue!40] (i-\i.base east) rectangle ++(\p,barheight) ++(0,-barheight) node[barlabels, black, anchor=base west] {\p};}
\end{tikzpicture}
\end{center}
\end{document}

答案1

有两个选项:当条形图高于用户指定的截止值时插入不连续性,然后记录。这完全取决于您想要实现的目标。如果您真的只想按原样显示值,那么 David Carlisle 建议的表格可能是最好的选择。

\documentclass[margin=10,tikz]{standalone}
\usepackage{tikz}
\tikzset{barlabels/.style={font=\footnotesize\sffamily}, 
declare function={barheight=5pt;}}

\begin{document}
\begin{tikzpicture}[y=0.3cm, x=0.06cm]
\begin{scope}
\pgfmathsetmacro{\cutoff}{70}
\foreach [count=\i from 0] \p/\t in{
    10.1/Argentina,
    50.0/Armenia,
    300.0/Belgium,
    10.2/Brazil,
    10.3/Bulgaria,
    9.0/Canada,
    9.5/China,
    11.0/Taiwan,
    10.7/Czechia,
    9.9/Finland}
{\node [anchor=base east, barlabels, name=i-\i] at (0,-\i) {\t};
\ifdim\p pt<\cutoff pt
\fill [blue!40] (i-\i.base east) rectangle ++(\p,barheight) ++(0,-barheight) node[barlabels, black, anchor=base west] {\p};
\else
\fill [blue!40] (i-\i.base east) rectangle ++({\cutoff+ln(\p)},barheight) ++(0,-barheight) node[barlabels, black, anchor=base west] {\p};
\fill [white] ([xshift={((\cutoff+ln(\p))/2-1)*0.06cm}]i-\i.base east)  
to[out=45,in=-135,looseness=2] 
++(0,barheight) -- ++ (2,0) to[out=-135,in=45,looseness=2] ++(0,-barheight);
\fi}
\end{scope}
\begin{scope}[yshift=-4cm]
\foreach [count=\i from 0] \p/\t in{
    10.1/Argentina,
    50.0/Armenia,
    300.0/Belgium,
    10.2/Brazil,
    10.3/Bulgaria,
    9.0/Canada,
    9.5/China,
    11.0/Taiwan,
    10.7/Czechia,
    9.9/Finland}
{\node [anchor=base east, barlabels, name=i-\i] at (0,-\i) {\t};
\fill [blue!40] (i-\i.base east) rectangle ++({10*log10(\p)},barheight) ++(0,-barheight) node[barlabels, black, anchor=base west] {\p};
}
\end{scope}
\end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容