Remove white space on right side of pgfplot - latex

Currently I have the following figures (plots):
I have placed the pgfplots inside two subfigures such that I can add the captions. The problem however is that some white space is added on the right side of Figure 3b. I am using the \hfill option but still this white space is note removed. Does someone know how to get rid of this white space such that the righthandside of Figure 3b alligns with the borders of my paper (represented by text text text ...)
My code is as follows:
\documentclass[a4paper, 11pt]{article}
\usepackage[utf8x]{inputenc}
\usepackage[margin=2.5cm]{geometry}
\usepackage{subcaption}
\usepackage{float}
\usepackage{graphicx}
\usepackage{pgfplots}
\usepackage{tikz}
\usetikzlibrary{positioning}
\tikzset{font=\footnotesize}
\begin{document}
\begin{figure}[H]
\centering
\begin{subfigure}{0.49\textwidth}
\begin{tikzpicture}
\begin{axis}[
title={},
xlabel={Epochs},
ylabel={Rewards},
ylabel near ticks,
legend pos=south east,
ymajorgrids=true,
grid style=densely dotted,
width=7cm,
height=6cm,
legend cell align={left},
legend style={font=\footnotesize}
]
\addplot[color = black, line width = 0.25mm, mark = *, mark size = 1] coordinates {
(1, 1.5)(2, 1.3)
};
\addplot[color = black, line width = 0.25mm, mark = none, samples = 2, dashed] {1.4}; % Constant line
\legend{Plot1,}
\end{axis}
\begin{axis}[
ylabel={Percentage (\%)},
axis y line*=right,
ylabel near ticks,
ylabel style={rotate=-180},
hide x axis,
width=7cm,
height=6cm,
legend style={font=\footnotesize}
]
\addplot[color = black, mark = *, mark size = 1] coordinates {
(1, 0.5)(2, 0.6)
};
\addplot[color = black, line width = 0.25mm, mark = none, samples = 2, dashed] {0.53}; % Constant line
\legend{Plot2,}
\end{axis}
\end{tikzpicture}
\caption{Performance}
\label{Plot:}
\end{subfigure}\hfill
\begin{subfigure}{0.49\textwidth}
\begin{tikzpicture}
\begin{axis}[
title={},
xlabel={Epochs},
ylabel={Rewards},
ylabel near ticks,
legend pos=south east,
ymajorgrids=true,
grid style=densely dotted,
width=7cm,
height=6cm,
legend cell align={left},
legend style={font=\footnotesize}
]
\addplot[color = black, line width = 0.25mm, mark = *, mark size = 1] coordinates {
(1, 1.5)(2, 1.3)
};
\addplot[color = black, line width = 0.25mm, mark = none, samples = 2, dashed] {1.4}; % Constant line
\legend{Plot1,}
\end{axis}
\end{tikzpicture}
\caption{Action distribution}
\label{Plot:}
\end{subfigure}
\caption{Results}
\label{Plot:}
\end{figure}
\end{document}

The problem is that your plots are about 7 cm wide and you place them in a subfigure of .49\textwidth, so the \hfill you place between the subfigures only sees the objects of .49\textwidth and add fill space according to this. If you want to move the plot towards the right boarder, you could
a) place the \hfill into the subfigure (the caption won't be centred anymore)
b) adjust the .49\textwidth to match the actual width of the plot (something around 7 cm)
(the \fbox{...} in the code below is just to visualize the size of the plots)
\documentclass[a4paper, 11pt]{article}
\usepackage[utf8x]{inputenc}
\usepackage[margin=2.5cm,showframe]{geometry}
\usepackage{subcaption}
\usepackage{float}
\usepackage{graphicx}
\usepackage{pgfplots}
\usepackage{tikz}
\usetikzlibrary{positioning}
\tikzset{font=\footnotesize}
\begin{document}
\begin{figure}[H]
\centering
\begin{subfigure}{0.49\textwidth}
\fbox{\begin{tikzpicture}
\begin{axis}[
title={},
xlabel={Epochs},
ylabel={Rewards},
ylabel near ticks,
legend pos=south east,
ymajorgrids=true,
grid style=densely dotted,
width=7cm,
height=6cm,
legend cell align={left},
legend style={font=\footnotesize}
]
\addplot[color = black, line width = 0.25mm, mark = *, mark size = 1] coordinates {
(1, 1.5)(2, 1.3)
};
\addplot[color = black, line width = 0.25mm, mark = none, samples = 2, dashed] {1.4}; % Constant line
\legend{Plot1,}
\end{axis}
\begin{axis}[
ylabel={Percentage (\%)},
axis y line*=right,
ylabel near ticks,
ylabel style={rotate=-180},
hide x axis,
width=7cm,
height=6cm,
legend style={font=\footnotesize}
]
\addplot[color = black, mark = *, mark size = 1] coordinates {
(1, 0.5)(2, 0.6)
};
\addplot[color = black, line width = 0.25mm, mark = none, samples = 2, dashed] {0.53}; % Constant line
\legend{Plot2,}
\end{axis}
\end{tikzpicture}}
\caption{Performance}
\label{Plot:}
\end{subfigure}
\begin{subfigure}{0.49\textwidth}
\hfill%
\fbox{\begin{tikzpicture}
\begin{axis}[
title={},
xlabel={Epochs},
ylabel={Rewards},
ylabel near ticks,
legend pos=south east,
ymajorgrids=true,
grid style=densely dotted,
width=7cm,
height=6cm,
legend cell align={left},
legend style={font=\footnotesize}
]
\addplot[color = black, line width = 0.25mm, mark = *, mark size = 1] coordinates {
(1, 1.5)(2, 1.3)
};
\addplot[color = black, line width = 0.25mm, mark = none, samples = 2, dashed] {1.4}; % Constant line
\legend{Plot1,}
\end{axis}
\end{tikzpicture}}%
\caption{Action distribution}
\label{Plot:}
\end{subfigure}
\caption{Results}
\label{Plot:}
\end{figure}
\end{document}

Related

Fill between function does not account for areas of other curves

In the below graph, the fill below function works great for filling in between, path B and path C. But it is not so good when I do not want to fill anything below path A (that is I do not want the area under blue line shaded, I do not how to get rid of that shaded area). Is there a way to do this?
\usepackage{tikz}
\usepackage{pgfplots}
\begin{tikzpicture}
\begin{axis}[
axis lines = left,
xlabel = $x$,
ylabel = $ $,
ymin = 0,
ymax = 6,
xmin = 0,
xmax = 4,
samples = 100,
xticklabels={},
yticklabels={},
]
\addplot[color=blue, domain=0:4,name path =A] {4-x};
\addplot[color=red, domain=0:4, name path =C] {x};
\addplot[color=purple, domain=0:4, name path =B] {1.5*x};
\addlegendentry{$f(x)= a-bx$}
\addlegendentry{$g(x)= \tilde{d}x$}
\addlegendentry{$g(x)= dx$}
\addplot fill between[
of = C and B,
soft clip={domain=1.6:2},
];
\addplot fill between[
of = C and A,
soft clip={domain=1.6:2},
];
\end{axis}
\end{tikzpicture}

adjust labels on tikz bar chart

How can I adjust the labels on the y-axis?
In the current version, the labels are not aligned to the bars.
The example is from:
https://texample.net/tikz/examples/bar-chart/
I add a few more data fields and removed the second category.
\documentclass[border=10pt]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.18}
\begin{document}
\begin{tikzpicture}
\begin{axis}[title = Contributions per category
at LaTeX-Community.org,
xbar,
y axis line style = { opacity = 0 },
axis x line = none,
tickwidth = 0pt,
enlarge y limits = 0.2,
enlarge x limits = 0.02,
symbolic y coords = {test1,test2,test3,test4,LaTeX, Tools, Distributions, Editors},
nodes near coords,
]
\addplot coordinates { (57727,LaTeX) (5672,Tools)
(2193,Distributions) (11106,Editors)
(11106,test1)
(11106,test2)
(11106,test3)
(11106,test4)
};
\legend{Topics}
\end{axis}
\end{tikzpicture}
\end{document}
With the ytick=data option:
\documentclass[border=10pt]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.18}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
title = Contributions per category at LaTeX-Community.org,
xbar,
y axis line style = { opacity = 0 },
axis x line = none,
tickwidth = 0pt,
enlarge y limits = 0.2,
enlarge x limits = 0.02,
symbolic y coords = {test1,test2,test3,test4,LaTeX,Tools,Distributions,Editors},
ytick=data,
nodes near coords,
nodes near coords align={horizontal},
]
\addplot coordinates {
(57727,LaTeX)
(5672,Tools)
(2193,Distributions)
(11106,Editors)
(11106,test1)
(11106,test2)
(11106,test3)
(11106,test4)
};
\legend{Topics}
\end{axis}
\end{tikzpicture}
\end{document}

Avoid vertical line at the end of data (LaTeX pgfplots)

I'd like to draw a line plot the years on the x-axis with xmax = 2020 in LateX pgfplots. As my data ends in 2019 I get a vertical line at 2019. It's probably quite easy but I didn't find anything about how to avoid that.
Thanks in advance!
Example code:
\documentclass[tikz, border=1mm]{standalone}
\begin{document}
\begin{figure}
\begin{tikzpicture}
\begin{axis}[
width = 0.6\textwidth,
xticklabel style=
{/pgf/number format/1000 sep=,rotate=90,anchor=east},
xmin = 1995, xmax = 2020,
ymin = 0, ymax = 1.2,
xlabel = Year,
ylabel style ={align=center}, ylabel = Specific energy consumption\\in kWh/pkm,
yticklabels={, 0, 0.2, 0.4, 0.6, 0.8, 1.0, 1.2}]
\addplot [] coordinates {
(1995,1.102) (1996,1.067) (1997,1.048) (1998,0.939) (1999,0.905) (2000,0.901) (2001,0.924) (2002,0.944) (2003,0.906) (2004,0.9) (2005,0.901) (2006,0.89) (2007,0.854) (2008,0.829) (2009,0.813) (2010,0.839) (2011,0.846) (2012,0.831) (2013,0.772) (2014,0.768) (2015,0.785) (2016,0.794) (2017,0.765) (2018,0.755) (2019,0.768) } \closedcycle;
\end{axis}
\end{tikzpicture}
\end{figure}
With \closedcycle you explicitly add the line
\documentclass[tikz, border=1mm]{standalone}
\usepackage{pgfplots}
\begin{document}
\begin{figure}
\begin{tikzpicture}
\begin{axis}[
width = 0.6\textwidth,
xticklabel style=
{/pgf/number format/1000 sep=,rotate=90,anchor=east},
xmin = 1995, xmax = 2020,
ymin = 0, ymax = 1.2,
xlabel = Year,
ylabel style ={align=center}, ylabel = Specific energy consumption\\in kWh/pkm,
yticklabels={, 0, 0.2, 0.4, 0.6, 0.8, 1.0, 1.2}]
\addplot [] coordinates {
(1995,1.102) (1996,1.067) (1997,1.048) (1998,0.939) (1999,0.905) (2000,0.901) (2001,0.924) (2002,0.944) (2003,0.906) (2004,0.9) (2005,0.901) (2006,0.89) (2007,0.854) (2008,0.829) (2009,0.813) (2010,0.839) (2011,0.846) (2012,0.831) (2013,0.772) (2014,0.768) (2015,0.785) (2016,0.794) (2017,0.765) (2018,0.755) (2019,0.768) }
% \closedcycle
;
\end{axis}
\end{tikzpicture}
\end{figure}
\end{document}

How to draw double y-axis barplot graph like this in pgfplot?

I used this table to draw the plot using matplotlib.
Use two \begin{axis} ... \end{axis} environments, one for the left and the other for the right. You can find the relevant part axis y line in the code below.
To prevent the bars from being on top of each other, bar shift is used (and set to the half of the bar width so that the bars are glued together).
\documentclass{article}
\usepackage{pgfplots}
\pgfplotsset{width=10cm,height=8cm,compat=1.16}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
ybar,
symbolic x coords={A,B,C,D},
bar width=0.6cm, bar shift=-0.3cm,
xtick=data,
axis y line*=left,
ylabel=axis1,
xlabel=name,
]
\addplot[draw=red,fill=red] coordinates {
(A,16) (B,18) (C,3) (D,10)
};
\end{axis}
\begin{axis}[
ybar,
symbolic x coords={A,B,C,D},
bar width=0.6cm, bar shift=0.3cm,
xtick=data,
axis y line*=right,
ylabel=axis2
]
\addplot[draw=blue,fill=blue] coordinates {
(A, 299239.74) (B, 292816.67) (C, 72799.22) (D, 116248.54)
};
\end{axis}
\end{tikzpicture}
\end{document}

Latex Column chart

Trying to create a latex column chart with single values in 3 different columns having 3 colors.
\begin{tikzpicture}
\begin{axis}[
x tick label style={
/pgf/number format/1000 sep=},
ylabel=Accuracy,
enlargelimits=0.05,
legend style={at={(0.5,-0.15)},
anchor=north,legend columns=-1},
ybar interval=0.7,]
\addplot
coordinates {(1930,80)};
\addplot
coordinates {(1930,80)};
\addplot
coordinates {(1930,80)};
\legend{Far,Near,Here}
\end{axis}
\end{tikzpicture}
You need to add a ybar size (e.g., ybar=5pt) and remove the ybar interval parameter, which looks bogus:
\begin{tikzpicture}
\begin{axis}[
ybar=5pt,
ylabel=Accuracy,
xtick=data,
legend style={at={(0.5,-0.15)}, anchor=north,legend columns=-1},
x tick label style={/pgf/number format/1000 sep=},
enlargelimits=0.05,
]
\addplot coordinates {(1930,80)};
\addplot coordinates {(1930,80)};
\addplot coordinates {(1930,80)};
\legend{Far,Near,Here}
\end{axis}
\end{tikzpicture}

Resources