我在 Latex 中使用 pgfplot 进行绘图。我想实现这种图表
这是目前我能做的最好的事情了。更新 #4],
这是我的乳胶代码[更新 #4]:
\begin{tikzpicture}
\begin{groupplot}[
group name=plot,
group size=2 by 1,
xlabels at=edge bottom,
ylabels at=edge left,
horizontal sep=-10pt,
vertical sep=0pt,
/pgf/bar width=12pt},
legend columns=-1,
legend style={at={(6.5 ,3.6)}},
legend entries={{\color{black}{\footnotesize Win}},{\color{black}{\footnotesize Lose}}},
legend to name=CombinedLegendBar,
ybar legend,
ylabel={Participant},
major x tick style=transparent,
ybar= 1*\pgflinewidth,
ymax=6,
width=6cm,
x axis line style={opacity=0},
x tick label style={rotate=0, anchor=center},
symbolic x coords={{Task 1}, {Task 2}, {Task 3}},
xticklabel style={yshift=-2mm,xshift={ifthenelse(\ticknum==2,0,0)}},
xtick=data,
ymajorgrids=true,
grid style=dashed,
nodes near coords,
scale only axis,
point meta=explicit symbolic
]
%modifier
\nextgroupplot[
xlabel=Multiplayer,
width=0.2\textwidth,
height=0.2\textwidth,
enlarge x limits = 0.5]
\addplot[draw=green,thick,fill=green,fill opacity=0.6] coordinates {
(Task 1,4)[\textcolor{blue!60}{4}]
(Task 2,4)[\textcolor{blue!60}{4}]
(Task 3,4)[\textcolor{blue!60}{4}]};
\addplot[draw=orange,thick,fill=orange,fill opacity=0.6] coordinates {
(Task 1,2)[\textcolor{orange!100}{2}]
(Task 2,1)[\textcolor{orange!100}{1}]
(Task 3,3)[\textcolor{orange!100}{3}]};
\nextgroupplot[
xlabel=Single Player,
yticklabels={,,},
width=0.13\textwidth,
height=0.2\textwidth,
enlarge x limits = 0.5]
\addplot[draw=green,thick,fill=green,fill opacity=0.6] coordinates {
(Task 1,4)[\textcolor{blue!60}{4}]
(Task 2,4)[\textcolor{blue!60}{4}]};
\addplot[draw=orange,thick,fill=orange,fill opacity=0.6] coordinates {
(Task 1,2)[\textcolor{orange!100}{2}]
(Task 2,1)[\textcolor{orange!100}{1}]};
\end{groupplot}
\end{tikzpicture}
\ref{CombinedLegendBar}
我现在的问题是:
我的图看起来很乱,每个组图之间的空间也不好看。我的解决方案:为每个组图 (\nextgroupplot) 设置宽度、高度和放大 x 限制,而不是在全局设置 (组图设置) 中设置。不要忘记“仅缩放轴”以帮助正确修改宽度和高度。虚线在两个组图之间重叠。所以我注意到网格的刻度在结尾和开头都是实线,这就是为什么当它与另一条虚线重叠时,看起来不太好看。
图表标题。我尝试用它
\node
来放置我的标题(所有子图的标题)。但效果不佳。我可以将图例放在图表内部上方的空白处吗?完成!使用图例设置并用 \ref 调用它有什么建议吗?
答案1
- 您或许可以进行一些计算来获得有用的宽度,见下面的示例。不确定它们是否“正确”,但结果看起来不错。
ytick pos=left
对于第一个组图,ytick pos=right
对于第二个组图。- 不知道您说的“无法正常工作”是什么意思,在有用的位置添加节点可以正常工作。但是,当然,如果您想要编号标题,请使用
\caption
。 - 您真的需要
legend to name
这些吗?似乎只需添加legend columns=-1
就足够了(假设图表的高度足够)。
还有一些其他的修改,比如制作自定义的cycle list
,并设置样式,nodes near coords
而不是到处使用\textcolor
。
也就是说,只用一个就可以做到这一点axis
,请参见tikzpicture
下面代码中的第二个。
\documentclass[tikz,border=5mm]{standalone}
\usepackage{pgfplots}
\usepgfplotslibrary{groupplots}
\pgfplotsset{compat=1.16}
\begin{document}
\begin{tikzpicture}
\pgfmathsetmacro{\NPlotsFirstAx}{3}
\pgfmathsetmacro{\NPlotsSecondAx}{2}
\pgfmathsetmacro{\SumPlots}{\NPlotsFirstAx+\NPlotsSecondAx+2}
\pgfmathsetmacro{\WdFirst}{\NPlotsFirstAx/\SumPlots}
\pgfmathsetmacro{\WdSecond}{\NPlotsSecondAx/\SumPlots}
\begin{groupplot}[
group style={
group name=plot,
group size=2 by 1,
xlabels at=edge bottom,
ylabels at=edge left,
horizontal sep=0pt,
vertical sep=0pt,
/pgf/bar width=10pt},
ylabel={Participant},
major x tick style=transparent,
ybar= \pgflinewidth,
ymax=6,
%width=6cm,
x axis line style={opacity=0},
x tick label style={rotate=0, anchor=center},
%symbolic x coords={{Task 1}, {Task 2}, {Task 3}},
xticklabel style={yshift=-2mm,xshift={ifthenelse(\ticknum==2,0,0)}},
xtick=data,
xticklabels={Task 1, Task 2, Task 3},
ymajorgrids=true,
grid style=dotted,
nodes near coords,
scale only axis,
point meta=explicit symbolic,
enlarge x limits = {abs=1},
cycle list={
draw=blue,thick,fill=blue,fill opacity=0.6,nodes near coords style={blue!60}\\
draw=orange,thick,fill=orange,fill opacity=0.6,nodes near coords style={orange}\\
},
legend columns=-1,
height=0.3\textwidth,
]
%modifier
\nextgroupplot[
xlabel=Color,
width=\WdFirst\textwidth,
ytick pos=left
]
\addplot coordinates {
(1,4)[4]
(2,4)[4]
(3,4)[4]};
\addplot coordinates {
(1,2)[2]
(2,1)[1]
(3,3)[3]};
\nextgroupplot[
xlabel=Brightness,
yticklabels={},
width=\WdSecond\textwidth,
ytick pos=right
]
\addplot coordinates {
(1,4)[4]
(2,4)[4]};
\addplot coordinates {
(1,2)[2]
(2,1)[1]};
\legend{Win, Lose}
\end{groupplot}
\node [above] at (current bounding box.north) {Title of entire thing};
\end{tikzpicture}
\begin{tikzpicture}
\begin{axis}[
xticklabels={Task 1, Task 2, Task 3, Task 1, Task 2},
xtick=data,
ylabel={Participant},
major x tick style=transparent,
ybar= \pgflinewidth,
ymax=6,
x axis line style={opacity=0},
x tick label style={rotate=0, anchor=center},
xticklabel style={yshift=-2mm},
xtick=data,
ymajorgrids=true,
grid style=dotted,
nodes near coords,
scale only axis,
point meta=explicit symbolic,
enlarge x limits = {abs=1},
cycle list={
draw=blue,thick,fill=blue,fill opacity=0.6,nodes near coords style={blue!60}\\
draw=orange,thick,fill=orange,fill opacity=0.6,nodes near coords style={orange}\\
},
legend columns=-1,
legend pos=north east,
height=0.3\textwidth,
width=0.7\textwidth,
extra x ticks={2, 5.5},
extra x tick labels={Color,Brightness},
extra x tick style={yshift=-15pt},
title={Title of entire thing}
]
\addplot coordinates {
(1,4)[4]
(2,4)[4]
(3,4)[4]
(5,4)[4]
(6,4)[4]};
\addplot coordinates {
(1,2)[2]
(2,1)[1]
(3,3)[3]
(5,2)[2]
(6,1)[1]};
\legend{Win,Lose}
\end{axis}
\end{tikzpicture}
\end{document}
答案2
最后结果 :
解决我的问题:
我的情节看起来很乱,每个情节之间的空间
groupplot
也不好看。我的解决方案:设置width
,height
和enlarge x limits
为每个组图(\nextgroupplot
)而不是全局设置(组图设置)。不要忘记scale only axis
帮助正确修改宽度和高度。\nextgroupplot[ xlabel=Single Player, yticklabels={,,}, width=0.13\textwidth, height=0.2\textwidth, enlarge x limits = 0.5]
虚线在两个组图之间重叠。所以我注意到网格的刻度在结尾和开头都是实线,这就是为什么当它与另一条虚线重叠时,看起来不太好看。我将每个组图的尺寸调整到尽可能小。实际上现在看起来并不那么糟糕。
图表标题。我尝试使用 \node 来放置我的标题(所有子图的标题)。但效果不佳。包装 tikzpicture
\begin{figure}
然后\end{figure}
我可以使用我的标题\caption
我可以将图例放在图表内部上方的空白处吗?完成!!使用图例设置并用 调用它
\ref{CombinedLegendBar}
。图例设置:
legend columns=-1, legend style={at={(6.5 ,3.5)}, draw=none, column sep=0.2cm}, legend entries={{\small \color{black}{Succeed}},{\small \color{black}{Fail}}}, legend to name=CombinedLegendBar, ybar legend, footnotesize