Alinhando uma tabela e um gráfico pgfplots

Alinhando uma tabela e um gráfico pgfplots

Estou tentando alinhar uma tabela e um gráfico pgfplots usando minipage. Tentei medir a altura da mesa e defini-la no gráfico, mas elas ainda estão desalinhadas. O ideal é que as legendas tenham a mesma altura e a tabela e os pgfplots tenham as mesmas dimensões. Além disso, há uma caixa ruim que preciso eliminar.

Código:

\documentclass[a4paper,12pt,twoside]{article}
\usepackage{geometry}
 \geometry{
 inner=30mm,
 top=30mm,
 outer=20mm,
 bottom=20mm
 }
\usepackage{booktabs}
\usepackage{multirow}
\usepackage{caption}
\usepackage{pgfplots}
\usepackage[no-math]{fontspec}
\setmainfont{TeX Gyre Termes}
\usepackage{unicode-math}
\setmathfont{TeX Gyre Termes Math}
\usepackage[cal=pxtx]{mathalpha}
\setmathfont[range={\mdblkcircle,\mdblksquare,\mdblkdiamond,\blacktriangle,\blacktriangledown,\smallblacktriangleleft,\smallblacktriangleright,\bigstar,\maltese}]{STIX Two Math}
\pgfplotsset{compat=newest}

\newsavebox{\tablebox}
\newlength{\tableheight}
\newenvironment{resizedtabular}[1]
 {\begin{lrbox}{\tablebox}\begin{tabular}{#1}}
 {\end{tabular}\end{lrbox}%
  \sbox{\tablebox}{\resizebox{\textwidth}{!}{\usebox{\tablebox}}}%
  \global\tableheight=\ht\tablebox
  \global\advance\tableheight\dp\tablebox
  \usebox{\tablebox}}

\newsavebox{\measuredSize}
\newcommand{\resizeToWidth}[2]{%
    \pgfmathsetmacro{\pgfplotswidth}{#2}%
    \begin{lrbox}{\measuredSize}#1\end{lrbox}%
    \pgfmathsetmacro{\pgfplotswidth}{2*\pgfplotswidth-\wd\measuredSize}%
    #1%
}

\newcommand{\inputPlot}{
    \begin{tikzpicture}
        \begin{axis}[xmin=90,xmax=610,ymin=0,ymax=1.2,tick pos=left,height=\tableheight,width=\pgfplotswidth,xlabel=XX,ylabel=XX]
        \node[above] at (129.746, 0.10363) {$\mdblkcircle$};
        \node[above] at (161.767, 0.13399) {$\mdblksquare$};
        \node[above] at (194.096, 0.05136) {$\mdblkdiamond$};
        \node[above] at (316.332, 0.06316) {$\blacktriangle$};
        \node[above] at (329.88, 0.07794) {$\blacktriangledown$};
        \node[above] at (376.988, 1) {$\smallblacktriangleleft$};
        \node[above] at (429.946, 0.03925) {$\smallblacktriangleright$};
        \node[above] at (468.742, 0.07811) {$\bigstar$};
        \node[above] at (592.825, 0.04339) {$\maltese$};
        \end{axis}
    \end{tikzpicture}}
    
\begin{document}
\begin{table}
    \begin{minipage}[c]{0.49\textwidth}
        \centering
        \begin{resizedtabular}{@{}ccccc@{}}
            \toprule
            \multirow{2}{*}{XX} & \multicolumn{4}{c}{XX} \\ \cmidrule(l){2-5} 
            & XX & XX & XX & XX \\ \cmidrule(r){1-1}
            $\mdblkcircle$ & 130 & 130 & 130 & 130 \\
            $\mdblksquare$ & 162 & 162 & 162 & 163 \\
            $\mdblkdiamond$ & 194 & 194 & 192 & 195 \\
            $\blacktriangle$ & 316 & 318 & 317 & 318 \\
            $\blacktriangledown$ & 330 & 330 & 328 & 331 \\
            $\smallblacktriangleleft$ & 377 & 377 & 377 & 379 \\
            $\smallblacktriangleright$ & 430 & 430 & 429 & 432 \\
            $\bigstar$ & 469 & $\dagger$ & 469 & 471 \\
            $\maltese$ & 593 & 591 & 591 & 595 \\ \bottomrule
        \end{resizedtabular}
        \caption{Some Caption.}
    \end{minipage}%
\hfill
    \begin{minipage}[c]{0.49\textwidth}
        \resizeToWidth{\inputPlot}{\textwidth}
        \captionof{figure}{Some Caption.}
    \end{minipage}
\end{table}
\end{document}

Qualquer ajuda seria apreciada.

Responder1

Proponho uma solução baseada no xcoffinpacote. O código foi adicionado no final do código do OP para facilitar a comparação.

Coloquei os quatro elementos: enredo, tabela e respectivas legendas, sem maiores manuseamentos, em xcoffins, caixas com alças que permitem fácil alinhamento entre si. Também adicionei um contorno \fboxao redor do gráfico para facilitar a comparação de larguras e alturas. As réguas coloridas mostram a posição das legendas, centralizadas e alinhadas conforme solicitado.

Explicações um pouco mais extensas sobre a aplicação xcoffinpodem ser encontradas em perguntas anteriores e respostas para, de alguma forma, problemas semelhantes.

Criar uma caixa usando o pacote tcolorbox ou qualquer outro? (imagem)

Deixe espaço para três logotipos na página de título

Preciso de um layout bastante complexo para uma edição acadêmica e não sei por onde começar

\documentclass[a4paper,12pt,twoside]{article}
\usepackage{geometry}
 \geometry{
 inner=30mm,
 top=30mm,
 outer=20mm,
 bottom=20mm
 }
\usepackage{booktabs}
\usepackage{multirow}
\usepackage{caption}
\usepackage{pgfplots}
\usepackage[no-math]{fontspec}
\setmainfont{TeX Gyre Termes}
\usepackage{unicode-math}
\setmathfont{TeX Gyre Termes Math}
\usepackage[cal=pxtx]{mathalpha}
\setmathfont[range={\mdblkcircle,\mdblksquare,\mdblkdiamond,\blacktriangle,\blacktriangledown,\smallblacktriangleleft,\smallblacktriangleright,\bigstar,\maltese}]{STIX Two Math}
\pgfplotsset{compat=newest}

\newsavebox{\tablebox}
\newlength{\tableheight}
\newenvironment{resizedtabular}[1]
 {\begin{lrbox}{\tablebox}\begin{tabular}{#1}}
 {\end{tabular}\end{lrbox}%
  \sbox{\tablebox}{\resizebox{\textwidth}{!}{\usebox{\tablebox}}}%
  \global\tableheight=\ht\tablebox
  \global\advance\tableheight\dp\tablebox
  \usebox{\tablebox}}

\newsavebox{\measuredSize}
\newcommand{\resizeToWidth}[2]{%
    \pgfmathsetmacro{\pgfplotswidth}{#2}%
    \begin{lrbox}{\measuredSize}#1\end{lrbox}%
    \pgfmathsetmacro{\pgfplotswidth}{2*\pgfplotswidth-\wd\measuredSize}%
    #1%
}

\newcommand{\inputPlot}{%
    \begin{tikzpicture}
        \begin{axis}[xmin=90,xmax=610,ymin=0,ymax=1.2,tick pos=left,height=\tableheight,width=\pgfplotswidth,xlabel=XX,ylabel=XX]
        \node[above] at (129.746, 0.10363) {$\mdblkcircle$};
        \node[above] at (161.767, 0.13399) {$\mdblksquare$};
        \node[above] at (194.096, 0.05136) {$\mdblkdiamond$};
        \node[above] at (316.332, 0.06316) {$\blacktriangle$};
        \node[above] at (329.88, 0.07794) {$\blacktriangledown$};
        \node[above] at (376.988, 1) {$\smallblacktriangleleft$};
        \node[above] at (429.946, 0.03925) {$\smallblacktriangleright$};
        \node[above] at (468.742, 0.07811) {$\bigstar$};
        \node[above] at (592.825, 0.04339) {$\maltese$};
        \end{axis}
    \end{tikzpicture}}

\usepackage{xcoffins}
        
\begin{document}
\begin{table}
    \begin{minipage}[c]{0.49\textwidth}
        \centering
        \begin{resizedtabular}{@{}ccccc@{}}
            \toprule
            \multirow{2}{*}{XX} & \multicolumn{4}{c}{XX} \\ \cmidrule(l){2-5} 
            & XX & XX & XX & XX \\ \cmidrule(r){1-1}
            $\mdblkcircle$ & 130 & 130 & 130 & 130 \\
            $\mdblksquare$ & 162 & 162 & 162 & 163 \\
            $\mdblkdiamond$ & 194 & 194 & 192 & 195 \\
            $\blacktriangle$ & 316 & 318 & 317 & 318 \\
            $\blacktriangledown$ & 330 & 330 & 328 & 331 \\
            $\smallblacktriangleleft$ & 377 & 377 & 377 & 379 \\
            $\smallblacktriangleright$ & 430 & 430 & 429 & 432 \\
            $\bigstar$ & 469 & $\dagger$ & 469 & 471 \\
            $\maltese$ & 593 & 591 & 591 & 595 \\ \bottomrule
        \end{resizedtabular}
        \caption{Some Caption.}
    \end{minipage}%
\hfill
    \begin{minipage}[c]{0.49\textwidth}
        \resizeToWidth{\inputPlot}{\textwidth}
        \captionof{figure}{Some Caption.}
    \end{minipage}
\end{table}

%%%%%%%%**************** xcoffin solution

\textbf{The xcoffin solution}

\NewCoffin\Framex
\NewCoffin\Tablex
\NewCoffin\CaptionTablex
\NewCoffin\Plotx
\NewCoffin\CaptionPlotx

\NewCoffin\Hrule %for degugging
\SetHorizontalCoffin\Hrule{\color{red}\rule{\textwidth}{0.2pt}}
\NewCoffin\Vrule %for degugging
\SetHorizontalCoffin\Vrule{\color{green}\rule{0.2pt}{0.5\textheight}}   

\SetHorizontalCoffin\Tablex{%   
 \begin{minipage}[c]{0.49\textwidth}
        \begin{resizedtabular}{@{}ccccc@{}}
            \toprule
            \multirow{2}{*}{XX} & \multicolumn{4}{c}{XX} \\ \cmidrule(l){2-5} 
            & XX & XX & XX & XX \\ \cmidrule(r){1-1}
            $\mdblkcircle$ & 130 & 130 & 130 & 130 \\
            $\mdblksquare$ & 162 & 162 & 162 & 163 \\
            $\mdblkdiamond$ & 194 & 194 & 192 & 195 \\
            $\blacktriangle$ & 316 & 318 & 317 & 318 \\
            $\blacktriangledown$ & 330 & 330 & 328 & 331 \\
            $\smallblacktriangleleft$ & 377 & 377 & 377 & 379 \\
            $\smallblacktriangleright$ & 430 & 430 & 429 & 432 \\
            $\bigstar$ & 469 & $\dagger$ & 469 & 471 \\
            $\maltese$ & 593 & 591 & 591 & 595 \\ \bottomrule
        \end{resizedtabular}
\end{minipage}  
}

\SetVerticalCoffin\CaptionTablex{0.49\textwidth}{\captionof{table}{Some Caption.}}  

\SetHorizontalCoffin\Plotx{%
\fbox{\begin{minipage}[c]{0.49\textwidth}
    \resizeToWidth{\inputPlot}{\textwidth}
\end{minipage}}
}   

\SetVerticalCoffin\CaptionPlotx{0.49\textwidth}{\captionof{figure}{Some Caption.}}

\ResizeCoffin\Plotx{0.49\textwidth}{\CoffinTotalHeight\Tablex} % adjust plot height to table height

\JoinCoffins*\Framex[hc,vc]\Tablex[l,t]
\JoinCoffins*\Framex[\Tablex-hc, \Tablex-b]\CaptionTablex[hc,t](0pt,-2ex) %down shift of 2ex

\JoinCoffins*\Framex[ \Tablex-r, \Tablex-t]\Plotx[l,t](10pt,0pt)  %right shift of 10pt
\JoinCoffins*\Framex[\Plotx-hc, \Plotx-b]\CaptionPlotx[hc,t](0pt,-2ex) %down shift of 2ex

%%------------------------------- checks
\JoinCoffins*\Framex[hc,vc]\Hrule[l,t]   % comment after cheking alignment
 \JoinCoffins*\Framex[\Tablex-l,\Tablex-b]\Hrule[l,t] % comment after cheking alignment
\JoinCoffins*\Framex[\CaptionTablex-l,\CaptionTablex-vc]\Hrule[l,t] % comment after cheking alignment

\JoinCoffins*\Framex[\Plotx-hc,\Plotx-t]\Vrule[r,t] % comment after cheking alignment
\JoinCoffins*\Framex[\Tablex-hc,\Tablex-t]\Vrule[r,t] % comment after cheking alignment
%%-------------------------------------

\noindent\TypesetCoffin\Framex
\end{document}

saída

A única melhoria até agora é o alinhamento das legendas. (Nenhuma caixa danificada foi detectada da minha parte, compilando o código acima). Mas nós podemos fazer melhor.

A largura natural da tabela é menor que 0.49\textwidth. Então, ao redimensionar esse comprimento você também está aumentando o tamanho da fonte, e conseqüentemente ela não corresponde ao tamanho do gráfico. Com algumas pequenas alterações você pode obter uma saída com aparência mais harmônica ( \fboxadicionada):

\documentclass[a4paper,12pt,twoside]{article}  %only coffin
\usepackage{geometry}
 \geometry{
 inner=30mm,
 top=30mm,
 outer=20mm,
 bottom=20mm
 }
\usepackage{booktabs}
\usepackage{multirow}
\usepackage{caption}
\usepackage{pgfplots}
\usepackage[no-math]{fontspec}
\setmainfont{TeX Gyre Termes}
\usepackage{unicode-math}
\setmathfont{TeX Gyre Termes Math}
\usepackage[cal=pxtx]{mathalpha}
\setmathfont[range={\mdblkcircle,\mdblksquare,\mdblkdiamond,\blacktriangle,\blacktriangledown,\smallblacktriangleleft,\smallblacktriangleright,\bigstar,\maltese}]{STIX Two Math}
\pgfplotsset{compat=newest}

\usepackage{xcoffins} %<<<< added
    
\usepackage{calc}       %<<<< added
\usepackage{kantlipsum}%<<<< added
    
\begin{document}

\textbf{The xcoffin solution v2}

\NewCoffin\Framex
\NewCoffin\Tablex
\NewCoffin\CaptionTablex
\NewCoffin\Plotx
\NewCoffin\CaptionPlotx

\NewCoffin\Hrule %for degugging
\SetHorizontalCoffin\Hrule{\color{red}\rule{\textwidth}{0.2pt}}
\NewCoffin\Vrule %for degugging
\SetHorizontalCoffin\Vrule{\color{green}\rule{0.2pt}{0.5\textheight}}
    
\SetHorizontalCoffin\Tablex{%           
\begin{tabular}{@{}ccccc@{}}
            \toprule
            \multirow{2}{*}{XX} & \multicolumn{4}{c}{XX} \\ \cmidrule(l){2-5} 
            & XX & XX & XX & XX \\ \cmidrule(r){1-1}
            $\mdblkcircle$ & 130 & 130 & 130 & 130 \\
            $\mdblksquare$ & 162 & 162 & 162 & 163 \\
            $\mdblkdiamond$ & 194 & 194 & 192 & 195 \\
            $\blacktriangle$ & 316 & 318 & 317 & 318 \\
            $\blacktriangledown$ & 330 & 330 & 328 & 331 \\
            $\smallblacktriangleleft$ & 377 & 377 & 377 & 379 \\
            $\smallblacktriangleright$ & 430 & 430 & 429 & 432 \\
            $\bigstar$ & 469 & $\dagger$ & 469 & 471 \\
            $\maltese$ & 593 & 591 & 591 & 595 \\ 
            \bottomrule
        \end{tabular}
}

\newlength{\TableH}
\setlength{\TableH}{\CoffinTotalHeight\Tablex}

\SetVerticalCoffin\CaptionTablex{\CoffinWidth\Tablex}{\captionof{table}{Some Caption.\label{tab1}}} 

\SetHorizontalCoffin\Plotx{%
    \fbox{%     
        \begin{tikzpicture}
    \begin{axis}[xmin=90,xmax=610,ymin=0,ymax=1.2,tick pos=left,height=\TableH,width=0.6\textwidth,xlabel=XX,ylabel=XX]
    \node[above] at (129.746, 0.10363) {$\mdblkcircle$};
    \node[above] at (161.767, 0.13399) {$\mdblksquare$};
    \node[above] at (194.096, 0.05136) {$\mdblkdiamond$};
    \node[above] at (316.332, 0.06316) {$\blacktriangle$};
    \node[above] at (329.88, 0.07794) {$\blacktriangledown$};
    \node[above] at (376.988, 1) {$\smallblacktriangleleft$};
    \node[above] at (429.946, 0.03925) {$\smallblacktriangleright$};
    \node[above] at (468.742, 0.07811) {$\bigstar$};
    \node[above] at (592.825, 0.04339) {$\maltese$};
    \end{axis}
    \end{tikzpicture}
}
}

\ResizeCoffin\Plotx{0.6\textwidth}{\TableH}
    
\SetVerticalCoffin\CaptionPlotx{\CoffinWidth\Plotx}{\captionof{figure}{Some Caption.\label{fig1}}}  

\JoinCoffins*\Framex[hc,vc]\Tablex[l,t]
\JoinCoffins*\Framex[\Tablex-hc, \Tablex-b]\CaptionTablex[hc,t](0pt,-2ex) %down shift of 2ex    

\JoinCoffins*\Framex[ \Tablex-r, \Tablex-t]\Plotx[l,t](20pt,0pt)  %right shift of 20pt
\JoinCoffins*\Framex[\Plotx-hc, \Plotx-b]\CaptionPlotx[hc,t](0pt,-2ex) %down shift of 2ex

%%------------------------------- checks
\JoinCoffins*\Framex[hc,vc]\Hrule[l,t]   % comment after cheking alignment
\JoinCoffins*\Framex[\Tablex-l,\Tablex-b]\Hrule[l,t] % comment after cheking alignment

\JoinCoffins*\Framex[\CaptionTablex-l,\CaptionTablex-vc]\Hrule[l,t]% comment after cheking alignment


\JoinCoffins*\Framex[\Plotx-hc,\Plotx-t]\Vrule[r,t] % comment after cheking alignment
\JoinCoffins*\Framex[\Tablex-hc,\Tablex-t]\Vrule[r,t] % comment after cheking alignment
%%-------------------------------------

\noindent\TypesetCoffin\Framex  

\newlength{\makeVspace}
\setlength{\makeVspace}{\CoffinTotalHeight\Tablex+\CoffinTotalHeight\CaptionTablex }    
\vspace{\makeVspace}    
\kant[1]    

As shown in Table \ref{tab1} and Figure \ref{fig1}.

\end{document}

g3Novo

Observe que agora o xcoffincódigo está muito mais limpo, já que apenas os ambientes tabulare tikzpictureprecisam ser retidos dentro dos xcoffins. A altura do gráfico é definida para ser igual à da mesa, como você fez antes.

ATUALIZARConforme solicitado, adicionei algum texto após a imagem. É assim que se faz:

\noindent\TypesetCoffin\Framexcolocará a montagem no próximo ponto de inserção após o título "A solução xcoffin v2", como pode ser visto.

O xcoffin \Framextem dimensão zero e serve como coletor dos demais xcoffins

Neste exemplo optei por usar \JoinCoffin*em vez de \JoinCoffin, assim o tamanho de \Framexpermanecerá zero durante a montagem. Isso significa que se você quiser colocar algum texto ou outro material após a figura você deve adicionar algum espaço vertical.

Por exemplo adicionando, no mínimo, a altura da tabela mais a altura da legenda.

O código adicionado será então (pacotes kantlipsume calctambém adicionado)

\newlength{\makeVspace}
\setlength{\makeVspace}{\CoffinTotalHeight\Tablex+\CoffinTotalHeight\CaptionTablex} 
\vspace{\makeVspace}

\kant[1]    

informação relacionada