特殊轴线分布

特殊轴线分布

下面的条形图是我目前所拥有的。如您所见,y 值之间存在巨大差异。我可以使用对数 x 轴,但这对非科学家来说是不可读的。

我想将 0 到 500 之间的 x 区域放大一倍,其余区域相应缩小。如何更改轴上的分布?

我希望你明白我的意思,因为我很难解释。

阴谋

编辑:我试图应用这个问题的答案pgfplots 中的轴断裂但不幸的是我无法使用条形图来做到这一点。

\documentclass[]{article}

\usepackage{pgfplots}
\usepackage{pgfplotstable}

\begin{document}

\title{Title}
\author{Author}
\date{Today}
\maketitle

\pgfplotsset{width=15cm, compat=4}

\begin{tikzpicture}
    \begin{axis}[xbar stacked, nodes near coords,
                xbar=30pt,
                bar width=5,
                xmajorgrids = true,
                yticklabel style={/pgf/number format/1000 sep=,font=\tiny},  
                ytick=data,
                bar width= .2cm,
                    nodes near coords align = {horizontal},
                        nodes near coords,
                        nodes near coords align=right,
                        every node near coord/.style={color=black,font=\tiny}
              ]

        \addplot[draw=green,fill=green!50,enlargelimits=0.25]
            coordinates{
                  (3133,1)  (731,2)  (1196,3)  (273,4)  (83,5)  (312,6)  (40,7)  (36,8)  (76,9)  (15,10)  (8,11)  (38,12)  (9,13)  (7,14)  (20,15)  (3,16)  (2,17)  (13,18)
                  (2,19)  (4,20)  (3,21)  (2,22)  (2,23)  (2,24)  (1,26)  (1,27)  (1,28)  (1,30)  (2,31)  (2,33)  (1,35)  (1,36) 
            };
    \end{axis}
\end{tikzpicture}

\end{document}

答案1

警告:不要这样做,这会让读者感到困惑。这样显示数据会完全扭曲数据点之间的关系。为什么要压缩 500 以上的范围?在极端情况下,您可以要求压缩所有范围,最终得到 36 个大小相同的条形图,只是末尾的数字不同。这样做有什么用呢?

也就是说,如果您真的想继续这样做,您可以使用x coord trafox coord inv trafo功能来转换数据。请注意,您需要使用point meta=rawx在条形末端显示原始值,并且您应该使用手动指定刻度位置xtick={0,500, ... }

\documentclass[]{article}

\usepackage{pgfplots}

\begin{document}



\begin{tikzpicture}
    \begin{axis}[xbar,
                xbar=30pt,
                bar width=5,
                xmajorgrids = true,
                yticklabel style={/pgf/number format/1000 sep=,font=\tiny},  
                ytick=data,
                bar width= .2cm,
                y=0.2cm,
                nodes near coords align = {horizontal},
                nodes near coords,
                nodes near coords align=right,
                point meta=rawx,
                every node near coord/.style={color=black,font=\tiny},
                x coord trafo/.code={\pgfmathparse{#1>500 ? 500+(#1-500)/2 : #1}},
                x coord inv trafo/.code={\pgfmathparse{#1>500 ? 500+(#1-500)*2 : #1}},
                xtick={0,500,1000,2000,3000}
              ]

        \addplot[draw=green,fill=green!50,enlargelimits=0.25]
            coordinates{
                  (3133,1)  (731,2)  (1196,3)  (210,4)  (83,5)  (312,6)  (40,7)  (36,8)  (76,9)  (15,10)  (8,11)  (38,12)  (9,13)  (7,14)  (20,15)  (3,16)  (2,17)  (13,18)
                  (2,19)  (4,20)  (3,21)  (2,22)  (2,23)  (2,24)  (1,26)  (1,27)  (1,28)  (1,30)  (2,31)  (2,33)  (1,35)  (1,36) 
            };
    \end{axis}
\end{tikzpicture}

\end{document}

答案2

我不知道tikz,所以我不认为这个实现接近最佳。我提供这个答案只是为了告诉你,在处理跨越数量级的数据时,使用对数轴是一种非常常见(也是首选)的方法,可以将数据折叠成可理解的内容。

我知道您说过您不想要对数尺度,因为非科学家无法理解。但我认为您应该重新考虑这个概念(人们理解里氏尺度的概念,它是对数的)。

我在这里尝试做的是将 x 数据设为原值的 log10。这样一来,修订后的图的范围从 0 到 3.5(即 10^0 到 10^3.5),不像您开始时的线性表示那样分散。

我只是建议这样的答案作为思考的素材。(我不知道该怎么做,否则我会用以下标签标记横轴:1、3.13、10、31.3、100、313、1000、3130,以帮助非科学家)

\documentclass[]{article}

\usepackage{pgfplots}
\usepackage{pgfplotstable}

\begin{document}

\title{Title}
\author{Author}
\date{Today}
\maketitle

\pgfplotsset{width=15cm}

\begin{tikzpicture}
    \begin{axis}[xbar stacked, nodes near coords,
                xbar=30pt,
                bar width=5,
                xmajorgrids = true,
                yticklabel style={/pgf/number format/1000 sep=,font=\tiny},  
                ytick=data,
                bar width= .2cm,
                    nodes near coords align = {horizontal},
                        nodes near coords,
                        nodes near coords align=right,
                        every node near coord/.style={color=black,font=\tiny}
              ]

        \addplot[draw=green,fill=green!50,enlargelimits=0.25]
            coordinates{
                  (log10(3133),1)  (log10(731),2)  (log10(1196),3)  (log10(273),4)  (log10(83),5)  (log10(312),6)  (log10(40),7)  (log10(36),8)  (log10(76),9)  (log10(15),10)  (log10(8),11)  (log10{38},12)  (log10(9),13)  (log10(7),14)  (log10(20),15)  (log10(3),16)  (log10(2),17)  (log10(13),18)
                  (log10(2),19)  (log10(4),20)  (log10(3),21)  (log10(2),22)  (log10(2),23)  (log10(2),24)  (log10(1),26)  (log10(1),27)  (log10(1),28)  (log10(1),30)  (log10(2),31)  (log10(2),33)  (log10(1),35)  (log10(1),36) 
            };
    \end{axis}
\end{tikzpicture}

\end{document}

在此处输入图片描述

相关内容