如何使用 pgfplots 制作 xbar 图,并在左侧和右侧 y 轴上具有不同的 y 刻度标签?

如何使用 pgfplots 制作 xbar 图,并在左侧和右侧 y 轴上具有不同的 y 刻度标签?

我正在使用 pgfplots 制作 xbar 图。我希望​​此图显示测试结果,其中不同年龄段的人获得分数。对于每个年龄段,只有一个人是获胜者。请参阅包含数据集“data.dat”的附加 latex 文件,其中包含四列:年龄间隔、Y 位置、分数和姓名。

我希望我的 xbar 图在左侧和右侧 y 轴上分别有不同的 y 刻度标签。左侧 y 刻度标签表示测试人员的年龄区间(20-30、30-40,...),而右侧 y 刻度标签应表示每个年龄段的获胜者(Peter、Jeff,...)。

两个问题

(1) 我无法同时制作左侧和右侧的 y 刻度标签。我该怎么做?

添加两行额外的代码,用于显示右侧 y 刻度标签(以“%(2)”开头的代码块),不能解决我的问题,只能将其从仅显示左侧 y 刻度标签转变为仅显示右侧 y 刻度标签

(2)如何防止图标题与 x 刻度标签重叠?

这是我的代码:

{\documentclass{article}
\usepackage{pgfplots}
\usepackage{filecontents}
\pgfplotsset{compat=1.3}

% test scores and person names
\begin{filecontents}{data.dat}
Age-interval        Y-Position         Score        Name
20-30               1                  15           Peter
30-40               2                  20           Jeff
40-50               3                  12           Steve
50-60               4                  24           John 
\end{filecontents}

\begin{document}
\begin{tikzpicture}

\begin{axis}[
    title = {Test score},
    xbar,     
    bar width=2pt,
    ytick=data,
    width=8 cm,
    height=5 cm,
    xmin=-1,
    xmax = 100,
    xticklabel pos = upper,
    tick align = outside,
    %
    % (1) add left side y tick labels
    yticklabel pos=left, 
    yticklabels from table={data.dat}{Age-interval},
    %
    % (2) add righ side y tick labels
    %    yticklabel pos=right, 
    %    yticklabels from table={data.dat}{Name},
    %
    ylabel={Age intervals (yr)},
]
\addplot table [
    y=Y-Position,
    x=Score, 
] {data.dat};
\end{axis}

\end{tikzpicture}
\end{document}

答案1

title我不会使用键,而是使用xlabel,因为这是您想要获得的,并且它可以获得正确的位置(title尽管与标签重叠是一个错误,我会提交报告)。

若要在轴的右侧打印名称,可以使用extra y ticks、 与every extra y tick/.style={yticklabel pos=right, yticklabels from table={data.dat}{Name}}

另一种方法是使用nodes near coords将名称放置在条形图附近。为此,您必须point meta=explicit symbolic在轴中设置以告诉 pgfplots 不要使用x标签的值(explicit)并关闭元数据的数字解析器(symbolic),并meta=Names\addplot table选项中设置。要将标签放置在条形图的右侧,您可以使用every node near coord/.append style={anchor=west}


图右侧的标签

\documentclass{article}
\usepackage{pgfplots}
\usepackage{filecontents}
\pgfplotsset{compat=newest}

\begin{filecontents}{data.dat}
Age-interval        Y-Position         Score        Name
20-30               1                  15           Peter
30-40               2                  20           Jeff
40-50               3                  12           Steve
50-60               4                  24           John 
\end{filecontents}

\begin{document}
\begin{tikzpicture}

\makeatletter
\begin{axis}[
    xlabel={Test score},
    xbar,     
    bar width=2pt,
    ytick=data,
    width=8 cm,
    height=5 cm,
    xmin=-1,
    xmax = 100,
    xticklabel pos = upper,
    tick align = outside,
    yticklabel pos=left, 
    yticklabels from table={data.dat}{Age-interval},
    ylabel={Age intervals (yr)},
    extra y ticks={1,...,4},
    every extra y tick/.style={
        yticklabel pos=right,
        yticklabels from table={data.dat}{Name}}
]
\addplot table [
    y=Y-Position,
    x=Score
] {data.dat};
\end{axis}

\end{tikzpicture}
\end{document}

条形附近的标签

\documentclass{article}
\usepackage{pgfplots}
\usepackage{filecontents}
\pgfplotsset{compat=newest}

\begin{filecontents}{data.dat}
Age-interval        Y-Position         Score        Name
20-30               1                  15           Peter
30-40               2                  20           Jeff
40-50               3                  12           Steve
50-60               4                  24           John 
\end{filecontents}

\begin{document}
\begin{tikzpicture}

\makeatletter
\begin{axis}[
    xlabel={Test score},
    xbar,     
    bar width=2pt,
    ytick=data,
    width=8 cm,
    height=5 cm,
    xmin=-1,
    xmax = 100,
    xticklabel pos = upper,
    tick align = outside,
    yticklabel pos=left, 
    yticklabels from table={data.dat}{Age-interval},
    ylabel={Age intervals (yr)},
    nodes near coords,
    every node near coord/.append style={anchor=west},
    point meta=explicit symbolic
]
\addplot table [
    y=Y-Position,
    x=Score,
    meta=Name
] {data.dat};
\end{axis}

\end{tikzpicture}
\end{document}

答案2

您可以通过使用第二个轴并选择yticklabel pos = right在右侧获取其他 y 标签来解决第一个问题。

您的第二个问题 - 标题和 x 刻度标签重叠 - 可以通过使用选项向上移动标题来解决title style = {yshift=<length>}

\documentclass{article}
\usepackage{pgfplots}
\usepackage{filecontents}
\pgfplotsset{compat=1.3}

% test scores and person names
\begin{filecontents}{data.dat}
Age-interval        Y-Position         Score        Name
20-30               1                  15           Peter
30-40               2                  20           Jeff
40-50               3                  12           Steve
50-60               4                  24           John 
\end{filecontents}

\begin{document}
\begin{tikzpicture}

\begin{axis}[
    title = {Test score},
    title style = {yshift = 10pt},
    xbar,     
    bar width=2pt,
    ytick=data,
    width=8 cm,
    height=5 cm,
    xmin=-1,
    xmax = 100,
    xticklabel pos = upper,
    tick align = outside,
    yticklabel pos=left, 
    yticklabels from table={data.dat}{Age-interval},
    ylabel={Age intervals (yr)},
]
\addplot table [
    y=Y-Position,
    x=Score, 
] {data.dat};
\end{axis}
\begin{axis}[
    xbar,     
    bar width=2pt,
    ytick=data,
    width=8 cm,
    height=5 cm,
    xmin=-1,
    xmax = 100,
    xticklabels = none,
    tick align = outside,
    yticklabel pos=right, 
    yticklabels from table={data.dat}{Name},
    ylabel={Winner},
]
\addplot table [
    y=Y-Position,
    x=Score, 
] {data.dat};
\end{axis}


\end{tikzpicture}
\end{document}

相关内容