下面的条形图是我目前所拥有的。如您所见,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 trafo
和x 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}