Выравнивание таблицы и графика pgfplots

Выравнивание таблицы и графика pgfplots

Я пытаюсь выровнять таблицу и график pgfplots с помощью minipage. Я попытался измерить высоту таблицы и установить ее на графике, но они все равно не выровнены. В идеале подписи должны быть на одной высоте, а таблица и pgfplots должны иметь одинаковые размеры. Вдобавок ко всему, есть плохой ящик, который мне нужно устранить.

Код:

\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}

Любая помощь будет оценена по достоинству.

решение1

Предлагаю решение на основе xcoffinпакета. Код добавлен в конец кода OP для удобства сравнения.

Я поместил четыре элемента: сюжет, таблицу и соответствующие подписи, без дальнейшей обработки, в xcoffins, коробки с ручками, которые позволяют легко выравнивать друг с другом. Я также добавил\fbox вокруг участка, чтобы было легче сравнивать ширину и высоту. Цветовые линейки показывают положение подписей, центрированных и выровненных по запросу.

Чуть более подробные объяснения по подаче заявления xcoffinможно найти в предыдущих вопросах и ответах на, в некотором роде, похожие проблемы.

Создать коробку с помощью пакета tcolorbox или любого другого? (изображение)

Оставьте место для трех логотипов на титульном листе.

Мне нужен довольно сложный макет для научного издания, и я не знаю, с чего начать.

\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}

выход

Единственное улучшение на данный момент — это выравнивание подписей. (С моей стороны, при компиляции кода выше, не было обнаружено ни одного плохого блока). Но мы можем сделать лучше.

Естественная ширина таблицы меньше 0.49\textwidth. Поэтому, изменяя эту длину, вы также увеличиваете размер шрифта, и, следовательно, он не соответствует размеру графика. С небольшими изменениями вы можете получить более гармоничный вид вывода ( \fboxдобавлено):

\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}

g3Новый

Обратите внимание, что теперь xcoffinкод стал намного чище, так как внутри xcoffins нужно сохранить только окружения tabularи tikzpicture. Высота графика установлена ​​равной таблице, как вы делали раньше.

ОБНОВЛЯТЬПо просьбе я добавил текст после картинки. Вот как это сделать:

\noindent\TypesetCoffin\Framexпоместит сборку в следующую точку вставки после заголовка «Решение xcoffin v2», как можно увидеть.

Гроб xcoffin \Framexимеет нулевое измерение и служит в качестве коллектора других гробов xcoffin.

В этом примере я решил использовать \JoinCoffin*вместо \JoinCoffin, поэтому размер \Framexостанется нулевым во время сборки. Это означает, что если вы хотите разместить какой-либо текст или другой материал после рисунка, вам необходимо добавить некоторое вертикальное пространство.

Например, сложить как минимум высоту таблицы и высоту подписи.

Затем будет добавлен код (пакеты kantlipsumи calcтакже добавлены)

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

\kant[1]    

Связанный контент