
Ich versuche, eine Gruppe von Balkendiagrammen mit 3 Abbildungen zu erstellen, habe dies erfolgreich abgeschlossen und die Ausgabe ist unten zu sehen.
Problem: Ich möchte die ersten beiden Balkendiagramme (a und b) im gleichen Zustand, aber wie kann ich für das dritte Balkendiagramm ((c) Q-Verlust und P-Verlust) zwei Balken für jede Beschriftung in der X-Achse mit einer Legende nur für dieses Diagramm einfügen? Noch einmal: Ich möchte zwei Balken für 3-6, zwei Balken für 6-12 und zwei Balken für 12-24 mit einer Legende nur für das dritte Diagramm. Kann mir außerdem jemand helfen, den Abstand zwischen den Balkendiagrammen (a, b, c) zu verringern?
Ausgabe:
Latexcode:
\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}
Kann mir jemand bei diesem Problem helfen?
Danke!
Antwort1
- Offenbar habe ich die Frage beim ersten Versuch, sie zu beantworten, missverstanden ...
- Aus der netten Antwort von @Torbjørn T. habe ich gelernt und weiß jetzt, dass das Hauptproblem darin besteht, dem letzten Diagramm einen Balkensatz P in blauer Farbe hinzuzufügen.
- Dies lässt sich relativ einfach durchführen:
- Q Satz (in schwarzer Farbe) von Balken verschiebt sich um einen kleinen Betrag nach links
- füge einen neuen Satz Balken P (in blau) hinzu und verschiebe ihn um den gleichen Betrag nach rechts
- Im neuen MWE bleiben die Diagrammstile aus der ersten Version der Antwortdefinition erhalten.
- Für Muster wird jetzt
patterns.meta
eine Bibliothek verwendet.
\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}
Antwort2
Möglicherweise ist noch etwas Feinabstimmung erforderlich. Ich habe die Legende mit Platzhaltereinträgen über das Diagramm gesetzt. Innerhalb einer Achse ist nicht wirklich Platz für die Legende.
Die wichtigste Änderung ist die Verwendung von ybar
als Option zu groupplot
anstelle von zu jedem \addplot
und die Verwendung manueller Balkenverschiebungen zum korrekten Platzieren der Balken.
horizontal sep
in den group style
Sätzen der Abstand zwischen den Achsen.
\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}
Antwort3
Die Balken werden durch ein Element erzeugt
pic
, das von drei Argumenten abhängt (Höhe, Beschriftung und Füllmuster).Die Abmessungen werden zunächst als globale Variablen festgelegt und können von Ihnen beliebig verändert werden.
Der Code
\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}