
Estoy intentando generar un grupo de gráficos de barras con 3 figuras y lo completé con éxito y el resultado se puede ver a continuación.
Problema: Quiero los dos primeros gráficos de barras (a y b) en el mismo estado, pero para el tercer gráfico de barras ((c) pérdida Q y pérdida P), ¿cómo puedo incluir dos barras para cada etiqueta en el eje X? ¿Con una leyenda sola para ese gráfico? Para reiterar, quiero dos barras para 3-6, dos barras para 6-12 y dos barras para 12-24 con una leyenda exclusivamente para el tercer gráfico. Además, ¿alguien puede ayudarme a reducir el espacio entre los gráficos de barras (a,b,c)?
Producción:
Código de látex:
\documentclass[10pt,journal,compsoc,xcolor={dvipsnames}]{IEEEtran}
%[tikz]{standalone}
% If IEEEtran.cls has not been installed into the LaTeX system files,
% manually specify the path to it like:
% \documentclass[10pt,journal,compsoc]{../sty/IEEEtran}
%\usepackage{showframe}
%\renewcommand\ShowFrameLinethickness{0.15pt}
%\renewcommand*\ShowFrameColor{\color{red}}
%---------------------------------------------------------------%
\usepackage{pgfplots}
\usepgfplotslibrary{groupplots}
%\usepackage[dvipsnames]{xcolor}
\pgfplotsset{compat=1.18}
\usepackage{pgfplotstable}
\usepackage{graphicx}
\usepackage{subfig}
\usepackage{multirow}
\usepackage{lipsum}
\usepackage{xspace}
\usetikzlibrary{patterns}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\newcommand{\R}{\mathbb{R}}
\newcommand*\circled[1]{\tikz[baseline=(char.base)]{
\node[shape=circle,draw,inner sep=0.7pt] (char) {#1};}}
\begin{document}
\begin{figure}[!htpb]
\centering
\begin{tikzpicture}
\begin{groupplot}[
legend columns=-1,
%bar width=0.22, % Width of the bar
%, % Distance between the centers of the bars
symbolic x coords={3-6, 6-12, 12-24},
enlarge x limits={abs=0.4cm},
%width=0.25\textwidth,
xtick={3-6, 6-12, 12-24},
%height=0.6\textheight,
ymin=0,
ymax=7,
xticklabel style={font=\tiny},
nodes near coords,
every node near coord/.append style={font=\tiny},
nodes near coords align={vertical},
xlabel={\tiny Agents~$(N \to \ 2N)$},
ylabel={\tiny Growth rate~($N\times$)},
% The distance between the center of the first bar and the left edge
%enlarge y limits=false
legend entries={{\color{olive}{\tiny Random}},{\color{orange}{\tiny ++Cost}},{\color{teal}{\tiny ++FTE}}},
legend to name=CombinedLegendBar,
footnotesize,
ybar legend,
width=0.4\columnwidth,
legend image code/.code={%
\draw[#1] (0cm,-0.1cm) rectangle (0.6cm,0.1cm);
},
% area legend, % This is the alternate option
group style={
group size=3 by 1,
xlabels at=edge bottom,
ylabels at=edge left}]
\nextgroupplot[title={\tiny (a) Mini-batch sampling}]
\addplot[ybar, pattern color=black, pattern=crosshatch dots] coordinates { (3-6, 3.5)};
\addplot[ybar, pattern color=gray, pattern=checkerboard] coordinates { (6-12, 4.1)};
\addplot[ybar, pattern color=gray, pattern=north east lines] coordinates { (12-24, 4.5)};
\nextgroupplot[title={\tiny (b) Target Q Calculation}]
\addplot[ybar, pattern color=black, pattern=crosshatch dots] coordinates { (3-6, 4.1)};
\addplot[ybar, pattern color=gray, pattern=checkerboard] coordinates { (6-12, 4.6)};
\addplot[ybar,pattern color=gray, pattern=north east lines] coordinates { (12-24, 4.6)};
\nextgroupplot[title={\tiny (c) Q loss \& P loss}]
` \addplot[ybar, pattern color=black, pattern=crosshatch dots] coordinates { (3-6, 3.05)};
\addplot[ybar, pattern color=gray, pattern=checkerboard] coordinates { (6-12,3.23)};
\addplot[ybar, pattern color=gray, pattern=north east lines] coordinates { (12-24, 3.42)};
\end{groupplot}
\end{tikzpicture}
\vspace{-\baselineskip}
\caption{Update all trainers sub-functions super-linear growth rate for all the three workloads when the number of agents are scaled from $N-2N$.}% The environment is Cooperative Navigation (simple spread).}
\vspace{-\baselineskip}
\label{Figure4}
\end{figure}
\end{document}
¿Hay alguien que me puede ayudar con este problema?
¡Gracias!
Respuesta1
- Aparentemente en el primer intento de responder la pregunta la entendí mal...
- Aprendí de la agradable respuesta de @Torbjørn T., ahora lo sé, que el problema principal es agregar al último diagrama P un conjunto de barras en color azul.
- Esto puede ser relativamente fácil de hacer:
- Conjunto Q (en color negro) de barras que se desplazan con una pequeña cantidad hacia la izquierda
- agregue un nuevo conjunto de barras P (en azul) y muévala la misma cantidad hacia la derecha
- En el nuevo MWE se conservan los estilos de diagrama de la primera versión de la definición de respuesta.
- Para los patrones ahora se utiliza
patterns.meta
la biblioteca.
\documentclass[journal,compsoc,xcolor={dvipsnames}]{IEEEtran}
\usepackage{pgfplots}
\usepgfplotslibrary{groupplots}
\pgfplotsset{compat=1.18}
\usetikzlibrary{patterns, patterns.meta}
\begin{document}
\begin{figure}[ht]
\raggedright
\begin{tikzpicture}[
pattern-A/.style = {pattern={Dots[angle=45, distance=2pt,xshift=1pt]}},
pattern-B/.style = {pattern={Hatch[angle=45,distance=2pt,xshift=1pt]}},
pattern-C/.style = {pattern={Lines[angle=45,distance=2pt]}},
%
pattern-AA/.style = {pattern-A, pattern color=blue},
pattern-BB/.style = {pattern-B, pattern color=blue},
pattern-CC/.style = {pattern-C, pattern color=blue},
]
\begin{groupplot}[
group style={
group size=3 by 1,
ylabels at=edge left,
horizontal sep=4mm,
},
width=0.44\linewidth,
enlarge x limits=0.4,
%
title style = {yshift=-1ex, font=\scriptsize, align=center},
xlabel={Agents~$(N \to \ 2N)$},
ylabel={Growth rate~($N\times$)},
label style = {font=\scriptsize},
%
ybar, % <---
/pgf/bar width=2.4mm, % <--- common set, overwritten in third \nextgroupplot
/pgf/bar shift=0pt, % <--- common set, overwritten in third \nextgroupplot
%
symbolic x coords={3-6, 6-12, 12-24},
ticklabel style={font=\scriptsize},
ymin=0, ymax=7,
%
nodes near coords,
every node near coord/.append style={font=\tiny},
nodes near coords align={vertical},
%
legend image code/.code={\draw[#1] (0cm,-1mm) rectangle (4mm,1mm);},
legend style={legend columns=-1,
font=\footnotesize,
/tikz/every even column/.append style={column sep=1em}
}
]
\nextgroupplot[title={(a) Mini-batch\\ sampling}]
\addplot[pattern-A] coordinates { (3-6, 3.5)};
\addplot[pattern-B] coordinates { (6-12, 4.1)};
\addplot[pattern-C] coordinates { (12-24, 4.5)};
\nextgroupplot[title={(b) Target Q\\ Calculation}]
\addplot[pattern-A] coordinates { (3-6, 4.1)};
\addplot[pattern-B] coordinates { (6-12, 4.6)};
\addplot[pattern-C] coordinates { (12-24, 4.6)};
\nextgroupplot[title={(c) Q loss\\ \& \textcolor{blue}{P loss}},
nodes near coords style={rotate=90, anchor=west},
legend to name=CombinedLegendBar,
]
\addplot[pattern-A,bar shift=-1.4mm] coordinates { (3-6, 3.05)};
\addplot[pattern-B,bar shift=-1.4mm] coordinates { (6-12, 3.23)};
\addplot[pattern-C,bar shift=-1.4mm] coordinates { (12-24,3.42)};
%
\addplot[pattern-AA,bar shift=+1.4mm] coordinates { (3-6,4.05)};
\addplot[pattern-BB,bar shift=+1.4mm] coordinates { (6-12,4.23)};
\addplot[pattern-CC,bar shift=+1.4mm] coordinates { (12-24,4.42)};
\legend{Qa, Qb, Qc, Pa, Pb, Pc}
\end{groupplot}
\node [above=2\baselineskip] at (group c2r1.north) {\ref{CombinedLegendBar}};
\end{tikzpicture}
\caption{Update all trainers sub-functions super-linear growth rate for all the three workloads when the number of agents are scaled from $N-2N$.}% The environment is Cooperative Navigation (simple spread).}
\label{Figure4}
\end{figure}
\end{document}
Respuesta2
Podría requerir algunos ajustes adicionales, y puse la leyenda sobre la trama con entradas de marcador de posición. Realmente no hay espacio dentro de un eje para la leyenda.
El cambio principal es usar ybar
como opción en groupplot
lugar de cada uno \addplot
y usar cambios de barra manuales para colocar las barras correctamente.
horizontal sep
en los group style
conjuntos el espacio entre los ejes.
\documentclass[10pt,journal,compsoc,xcolor={dvipsnames}]{IEEEtran}
\usepackage{pgfplotstable}
\usepgfplotslibrary{groupplots}
\pgfplotsset{compat=1.18}
\usetikzlibrary{patterns}
\begin{document}
\begin{figure}[!htpb]
\centering
\begin{tikzpicture}
\begin{groupplot}[
legend columns=-1,
%bar width=0.22, % Width of the bar
%, % Distance between the centers of the bars
symbolic x coords={3-6, 6-12, 12-24},
enlarge x limits=0.3,
%width=0.25\textwidth,
xtick={3-6, 6-12, 12-24},
%height=0.6\textheight,
ymin=0,
ymax=7,
xticklabel style={font=\tiny},
nodes near coords,
every node near coord/.append style={font=\tiny},
nodes near coords align={vertical},
xlabel={\tiny Agents~$(N \to \ 2N)$},
ylabel={\tiny Growth rate~($N\times$)},
% The distance between the center of the first bar and the left edge
%enlarge y limits=false
footnotesize,
ybar=-\pgfplotbarwidth,
width=0.45\columnwidth,
legend image code/.code={%
\draw[#1] (0cm,-0.1cm) rectangle (0.2cm,0.2cm);
},
legend style={cells={font=\scriptsize}},
% area legend, % This is the alternate option
group style={
group name=foo,
group size=3 by 1,
xlabels at=edge bottom,
ylabels at=edge left,
horizontal sep=4.5mm
},
title style={font=\tiny}]
\nextgroupplot[title={(a) Mini-batch sampling}]
\addplot[pattern color=black, pattern=crosshatch dots] coordinates { (3-6, 3.5)};
\addplot[pattern color=gray, pattern=checkerboard] coordinates { (6-12, 4.1)};
\addplot[pattern color=gray, pattern=north east lines] coordinates { (12-24, 4.5)};
\nextgroupplot[title={(b) Target Q Calculation}]
\addplot[pattern color=black, pattern=crosshatch dots] coordinates { (3-6, 4.1)};
\addplot[pattern color=gray, pattern=checkerboard] coordinates { (6-12, 4.6)};
\addplot[ybar,pattern color=gray, pattern=north east lines] coordinates { (12-24, 4.6)};
\nextgroupplot[
title={(c) Q loss \& P loss},
bar width=8pt,
legend to name=CombinedLegendBar,
]
\pgfmathsetlengthmacro{\MyBarshift}{0.5*\pgfplotbarwidth+1pt}
\addplot[bar shift=-\MyBarshift,pattern color=black, pattern=crosshatch dots] coordinates { (3-6, 3.05)};
\addplot[bar shift=-\MyBarshift,pattern color=gray, pattern=checkerboard] coordinates { (6-12,3.23)};
\addplot[bar shift=-\MyBarshift,pattern color=gray, pattern=north east lines] coordinates { (12-24, 3.42)};
% second set of bars
\addplot[bar shift=\MyBarshift,pattern color=blue, pattern=crosshatch dots] coordinates { (3-6, 4.05)};
\addplot[bar shift=\MyBarshift,pattern color=blue, pattern=checkerboard] coordinates { (6-12,4.23)};
\addplot[bar shift=\MyBarshift,pattern color=blue, pattern=north east lines] coordinates { (12-24, 4.42)};
\legend{Qa,Qb,Qc,Pa,Pb,Pc}
\end{groupplot}
\node [above=12pt] at (foo c2r1.north) {\ref{CombinedLegendBar}};
\end{tikzpicture}
\vspace{-\baselineskip}
\caption{Update all trainers sub-functions super-linear growth rate for all the three workloads when the number of agents are scaled from $N-2N$.}% The environment is Cooperative Navigation (simple spread).}
\vspace{-\baselineskip}
\label{Figure4}
\end{figure}
\end{document}
Respuesta3
Las barras se crean a través de un
pic
elemento que depende de tres argumentos (alto, etiqueta y patrón de relleno).Las dimensiones se controlan como variables globales al principio; puedes modificarlos como desees.
El código
\documentclass[11pt, margin=1cm]{standalone}
\usepackage{tikz}
\usetikzlibrary{math, patterns}
\begin{document}
\tikzmath{
real \w, \dw, \globalW, \globalH, \g1, \g2, \g3;
\w = 1.5; % width of a bar
\dw = .4; % half inbetween two bars
\globalW = 3*\w +6*\dw;
\globalH = 6;
\g1 = 0; % position of the first graph
\g2 = \globalW +1.3*\w;
\g3 = 2*\globalW +4*\w;
}
\tikzset{
pics/bar/.style n args={3}{% height, label, pattern
code={%
\draw[pattern=#3] (0, 0) rectangle (\w, #1/7*\globalH)
++ (-\w/2, 1ex) node[above, scale=.8] {#1};
\path (\w/2, -1ex) node[below, scale=.8] {#2};
}
}
}
\begin{tikzpicture}[every node/.style={scale=.9}]
\begin{scope}[xshift={\g1 cm}]
\path (\globalW/2, \globalH) node[above] {(a) Mini-batch sampling};
\draw (0, 0) -- ++(\globalW, 0) ++(-\globalW/2, -4ex)
node[below] {Agents $(N \to 2N)$};
\draw (0, 0) -- ++(0, \globalH) ++(-3em, -\globalH/2)
node[rotate=90] {Growth rate $(N\times)$};
\foreach \j in {0, 2, 4, 6}{%
\draw (0, \j/7*\globalH) -- ++(-1ex, 0) node[left] {$\j$};
}
\path
(0, 0) ++(\dw, 0) pic {bar={3.5}{3-6}{dots}}
++(\w +2*\dw, 0) pic {bar={4.1}{6-12}{crosshatch}}
++(\w +2*\dw, 0) pic {bar={4.5}{12-24}{north east lines}};
\end{scope}
\begin{scope}[xshift={\g2 cm}]
\path (\globalW/2, \globalH) node[above] {(b) Target Q Calculation};
\draw (0, 0) -- ++(\globalW, 0) ++(-\globalW/2, -4ex)
node[below] {Agents $(N \to 2N)$};
\draw (0, 0) -- ++(0, \globalH) ++(-3em, -\globalH/2);
\foreach \j in {0, 2, 4, 6}{%
\draw (0, \j/7*\globalH) -- ++(-1ex, 0) node[left] {$\j$};
}
\path
(0, 0) ++(\dw, 0) pic {bar={4.1}{3-6}{dots}}
++(\w +2*\dw, 0) pic {bar={4.6}{6-12}{crosshatch}}
++(\w +2*\dw, 0) pic {bar={4.6}{12-24}{north east lines}};
\end{scope}
\begin{scope}[xshift={\g3 cm}]
\path (\globalW/2, \globalH) node[above] {(c) Q loss \& P loss};
\draw (0, 0) -- ++(\globalW, 0) ++(-\globalW/2, -4ex)
node[below] {Agents $(N \to 2N)$};
\draw (0, 0) -- ++(0, \globalH) ++(-3em, -\globalH/2)
node[rotate=90] {Growth rate $(N\times)$};
\foreach \j in {0, 2, 4, 6}{%
\draw (0, \j/7*\globalH) -- ++(-1ex, 0) node[left] {$\j$};
}
\path
(0, 0) ++(\dw, 0) pic {bar={3.05}{3-6}{dots}}
++(\w +2*\dw, 0) pic {bar={3.25}{6-12}{crosshatch}}
++(\w +2*\dw, 0) pic {bar={3.42}{12-24}{north east lines}};
\end{scope}
\end{tikzpicture}
\end{document}