一个图上有几组条形图,每组大小不同。无法正确对齐

一个图上有几组条形图,每组大小不同。无法正确对齐

我找不到正确对齐条形图的方法,条形图有 3 组条形,每组有 1、2 和 3 个条形。以下是我目前所得到的:

\documentclass[border=5pt]{standalone}

\usepackage{pgfplots}
\begin{document}

\scriptsize
\centering
\begin{tikzpicture}
\begin{axis}[
    xtick={1,2,3,4,5,6},
    xticklabels={Lodging,,, Ridesharing, , Freelancing},
    xticklabel style = {xshift=-0.25cm},
    enlarge y limits=0,
    enlarge x limits=0.25,
    ymin=0,
    ymax=32,
    ytick={0,10,20,30},
    nodes near coords,
    visualization depends on={meta < 4 \as \valueissmall},
    every node near coord/.append style={
            anchor={\ifdim\valueissmall pt=1 pt south\else north\fi},
            {\ifdim\valueissmall pt=1 pt black\else white\fi}
        },
    ybar=-6pt,
    bar width=13pt,
    xtick style={draw=none},
    ]
    \addplot[ybar,fill=gray] coordinates {(1, 27)};
    \addplot[ybar,fill=gray,bar shift=30pt] coordinates {(2, 10)};
    \addplot[ybar,fill=gray,bar shift=20pt] coordinates {(3, 5)};
    \addplot[ybar,fill=gray,bar shift=37pt] coordinates {(4, 3)};
    \addplot[ybar,fill=gray,bar shift=27pt] coordinates {(5, 2)};
    \addplot[ybar,fill=gray] coordinates {(6, 1)};
\end{axis}
\end{tikzpicture}


\end{document}

在此处输入图片描述

以下是我想要实现的目标: 在此处输入图片描述

答案1

我觉得你可能把事情想得有点复杂了。

用 x 坐标代替bar shifts 可能更方便。也就是说,将第一个条形图设置为 x=1,将第二个和第三个条形图设置为 x=3 和 4,将最后三个条形图设置为 x=6、7、8。

这样一来,放置刻度标签就变得容易了。使用xtick={1,3.5,7},即在每个条形组的中心放置刻度,然后xticklabels={Lodging,Ridesharing,Freelancing},即没有空标签。这样,xshift刻度标签样式中的 就没有必要了。

不要使用多个\addplots,而只使用一个\addplot,并且没有必要ybar\addplot选项中使用 。

对于条形上方的标签,您可以直接在坐标流中添加平台名称作为元信息,例如(1, 27) [AirBnb]。然后添加visualization depends on={y \as \yvalue},并将更改为nodes near coordsnodes near coords={\pgfplotspointmeta\\\pgfmathprintnumber{\yvalue}}为了使换行符(\\)正常工作,您需要align=center采用的样式nodes near coords

在此处输入图片描述

\documentclass[border=5pt]{standalone}
\usepackage{pgfplots}
\begin{document}

\scriptsize
\centering
\begin{tikzpicture}
\begin{axis}[
    xtick={1,3.5,7},
    xticklabels={Lodging,Ridesharing,Freelancing},
    enlarge x limits=0.1,
    ymin=0,
    ymax=32,
    ytick={0,10,20,30},
    nodes near coords={\pgfplotspointmeta\\\pgfmathprintnumber{\yvalue}},
    visualization depends on={y \as \yvalue},
    every node near coord/.append style={
      align=center,
      },
    ybar,
    bar width=13pt,
    xtick style={draw=none},
    ]
    \addplot[fill=gray, point meta=explicit symbolic] coordinates {
       (1, 27) [AirBnb]
       (3, 10) [Uber]
       (4, 5) [Lyft]
       (6, 3) [Taskrabbit]
       (7, 2) [Upwork]
       (8, 1) [Frkrldjnrj]
       };
\end{axis}
\end{tikzpicture}
\end{document}

相关内容