Я использую «гибридные» координаты, сделанные из \ymin
сырых значений x и y. Это довольно удобно, благодаряГонсало:
\newcommand{\getpgfkey}[1]{\pgfkeysvalueof{/pgfplots/#1}}
\newcommand{\xmin}[0]{\getpgfkey{xmin}}
\newcommand{\xmax}[0]{\getpgfkey{xmax}}
\newcommand{\ymin}[0]{\getpgfkey{ymin}}
\newcommand{\ymax}[0]{\getpgfkey{ymax}}
Итак, предположим, у вас есть большие значения данных, и вы хотели бы, чтобы ваши данные масштабировались, а содержимое меток отслеживалось соответствующим образом. (Это основано на моем личном опыте: мне сказали, что положение по умолчанию y tick labels
не такое уж красивое. Лично я согласен. Их стиль по умолчанию помещает их в (0,1), above right
, грубо говоря.)
Конечно, всегда можно вручную настроить их положение и дальнейшее выравнивание и т. д., но это очень трудоемко. Поэтому Джейк предоставил решение, используя дополнительный стиль масштабирования.
Но это своего рода «ломает» несколько других вещей, см. мои комментарии.здесь. Наиболее заметным является отсутствие смысла при использовании вышеупомянутых команд \xmin
, \xmax
... . После преобразований эти значения выходят за пределы и, следовательно, больше не видны.
Поэтому я хотел бы определить новое значение или переменную \xminSCALED
(и \xmaxSCALED
, \yminSCALED
и \ymaxSCALED
), которая определяется/обновляется после того, как координаты были преобразованы/масштабированы. Эти новые значения должны затем предоставить доступ к новым минимальным и максимальным значениям для преобразованногоИксиу.
МВЭ
\documentclass{standalone}
\usepackage{pgfplots}
\newcommand{\getpgfkey}[1]{\pgfkeysvalueof{/pgfplots/#1}}
\newcommand{\xmin}[0]{\getpgfkey{xmin}}
\newcommand{\xmax}[0]{\getpgfkey{xmax}}
\newcommand{\ymin}[0]{\getpgfkey{ymin}}
\newcommand{\ymax}[0]{\getpgfkey{ymax}}
\usepgfplotslibrary{groupplots}
\pgfplotsset{
YScaling/.style={
y coord trafo/.code=\pgfmathparse{##1/(1e#1)},
%the following 4 lines break the MWE, also not working are variants with \newcommand or \renewcommand
%\let{\pgfkeysvalueof{/pgfplots/xmin}}={\xminSCALED},
%\let{\pgfkeysvalueof{/pgfplots/xmax}}={\xmaxSCALED},
%\let{\pgfkeysvalueof{/pgfplots/ymin}}={\yminSCALED},
%\let{\pgfkeysvalueof{/pgfplots/ymax}}={\ymaxSCALED},
ylabel style={
append after command={
node [rotate=90, anchor=base west] at (\tikzlastnode.base east) {$\cdot{10^{#1}}$}
}
}
},
}
\begin{document}
\begin{tikzpicture}
\begin{groupplot}[
group style={
horizontal sep=0.2cm,
group size=2 by 1,
ylabels at=edge left,
yticklabels at=edge left,
},
ymin=300, ymax=1300,
xlabel={The label for the x-axis},
ylabel={Some y-values},
scale ticks above exponent={2},
]
\nextgroupplot[YScaling=3]
\addplot[only marks] coordinates{(2000,1200) (3000,500)};
\draw[ultra thick, dashed, blue] (axis cs:2000,\pgfkeysvalueof{/pgfplots/ymin}) rectangle (axis cs:3060,\pgfkeysvalueof{/pgfplots/ymax}); %<--- not working
\draw[ultra thick, dashed, red] (axis cs:2000,600) rectangle (axis cs:3050,1150); %<--- works but does not look equally good
%
\nextgroupplot[scaled y ticks=false]
\addplot[only marks] coordinates{(2000,1200) (4000,400)};
\addlegendentry{Text}
\end{groupplot}
\end{tikzpicture}
\end{document}
Изображение для дополнительной MWE ниже
дополнительная МВЭ
\documentclass{standalone}
\usepackage{pgfplots}
\newcommand{\getpgfkey}[1]{\pgfkeysvalueof{/pgfplots/#1}}
\newcommand{\xmin}[0]{\getpgfkey{xmin}}
\newcommand{\xmax}[0]{\getpgfkey{xmax}}
\newcommand{\ymin}[0]{\getpgfkey{ymin}}
\newcommand{\ymax}[0]{\getpgfkey{ymax}}
\usepgfplotslibrary{groupplots}
\pgfplotsset{
xscalingdown/.style={ %XXX SCALE DOWN
x coord trafo/.code=\pgfmathparse{##1/(1e#1)},
xlabel style={
append after command={
node [anchor=base west] at (\tikzlastnode.base east) {$\cdot{10^{#1}}$}
}
},
every axis/.append code={%
\pgfmathresult{\xmax/(1e#1)}\global\let\xmaxSCALED=\pgfmathresult
\pgfmathresult{\xmin/(1e#1)}\global\let\xminSCALED=\pgfmathresult
% \pgfmathresult{\ymax}\global\let\ymaxSCALED=\pgfmathresult
% \pgfmathresult{\ymin}\global\let\yminSCALED=\pgfmathresult
},
},
xscalingup/.style={ %XXX SCALE UP
x coord trafo/.code=\pgfmathparse{##1*(1e#1)},
xlabel style={
append after command={
node [anchor=base west] at (\tikzlastnode.base east) {$\cdot{10^{{-1}#1}}$}
}
},
every axis/.append code={%
\pgfmathresult{\xmax*(1e#1)}\global\let\xmaxSCALED=\pgfmathresult
\pgfmathresult{\xmin*(1e#1)}\global\let\xminSCALED=\pgfmathresult
%\pgfmathresult{\ymax}\global\let\ymaxSCALED=\pgfmathresult
%\pgfmathresult{\ymin}\global\let\yminSCALED=\pgfmathresult
},
},
yscalingdown/.style={ %YYY SCALE DOWN
y coord trafo/.code=\pgfmathparse{##1/(1e#1)},
ylabel style={
append after command={
node [rotate=90, anchor=base west] at (\tikzlastnode.base east) {$\cdot{10^{#1}}$}
}
},
every axis/.append code={%
\pgfmathparse{\ymax/(1e#1)}\global\let\ymaxSCALED=\pgfmathresult
\pgfmathparse{\ymin/(1e#1)}\global\let\yminSCALED=\pgfmathresult
%\pgfmathresult{\xmax}\global\let\xmaxSCALED=\pgfmathresult
%\pgfmathresult{\xmin}\global\let\xminSCALED=\pgfmathresult
},
},
yscalingup/.style={ %YYY SCALE UP
y coord trafo/.code=\pgfmathparse{##1*(1e#1)},
ylabel style={
append after command={
node [rotate=90, anchor=base west] at (\tikzlastnode.base east) {$\cdot{10^{{-1}#1}}$}
}
},
every axis/.append code={%
\pgfmathparse{\ymax*(1e#1)}\global\let\ymaxSCALED=\pgfmathresult
\pgfmathparse{\ymin*(1e#1)}\global\let\yminSCALED=\pgfmathresult
%\pgfmathresult{\xmax}\global\let\xmaxSCALED=\pgfmathresult
%\pgfmathresult{\xmin}\global\let\xminSCALED=\pgfmathresult
},
},
}
\begin{document}
\begin{tikzpicture}
\begin{groupplot}[
group style={
horizontal sep=0.2cm,
group size=2 by 1,
ylabels at=edge left,
yticklabels at=edge left,
},
ymin=-100, ymax=1300,
xlabel={The label for the x-axis},
ylabel={Some y-values},
xscalingdown=3,
yscalingdown=3,
]
\nextgroupplot
\addplot coordinates{(2000,1200) (3000,\yminSCALED)};
\filldraw[ultra thick, dashed, blue] (\xminSCALED,\yminSCALED) rectangle (\xmaxSCALED,\ymaxSCALED);
\nextgroupplot
\addplot+ coordinates{(2100,1000) (2800,1200)};
\filldraw[ultra thick, dashed, red] (axis cs:2100,1000) rectangle (axis cs:\xmaxSCALED,1000) node[below, fill=orange] {bla};
%%NOTABLE DIFFERENT OUTPUT when omitting 'axis cs'
\filldraw[ultra thick, dashed, red] (2100,1000) rectangle (axis cs:\xmaxSCALED,1000) node[below, fill=orange] {bla};
\end{groupplot}
\end{tikzpicture}
\end{document}
решение1
На самом деле это слишком много для комментария, но недостаточно для ответа... но, возможно, вы сможете найти что-то интересное или задать более конкретные вопросы, которые помогут мне понять вариант использования.
Насколько я понимаю, вы хотели бы использовать \yminSCALED
для того, чтобы принять значение внутри axis cs
, верно? Другими словами, вы хотите " yminSCALED
:= обратныйy преобразование ( \ymin
)" ?
Вероятно, это сработает:
\documentclass{standalone}
\usepackage{pgfplots}
\newcommand{\getpgfkey}[1]{\pgfkeysvalueof{/pgfplots/#1}}
\newcommand{\xmin}[0]{\getpgfkey{xmin}}
\newcommand{\xmax}[0]{\getpgfkey{xmax}}
\newcommand{\ymin}[0]{\getpgfkey{ymin}}
\newcommand{\ymax}[0]{\getpgfkey{ymax}}
\usepgfplotslibrary{groupplots}
\pgfplotsset{
YScaling/.style={
y coord trafo/.code=\pgfmathparse{##1/(1e#1)},
%the following 4 lines break the MWE, also not working are variants with \newcommand or \renewcommand
%\let{\pgfkeysvalueof{/pgfplots/xmin}}={\xminSCALED},
%\let{\pgfkeysvalueof{/pgfplots/xmax}}={\xmaxSCALED},
%\let{\pgfkeysvalueof{/pgfplots/ymin}}={\yminSCALED},
%\let{\pgfkeysvalueof{/pgfplots/ymax}}={\ymaxSCALED},
ylabel style={
append after command={
node [rotate=90, anchor=base west] at (\tikzlastnode.base east) {$\cdot{10^{#1}}$}
}
},
%
every axis/.append code={%
\pgfmathparse{\ymax*(1e#1)}\global\let\ymaxSCALED=\pgfmathresult
\pgfmathparse{\ymin*(1e#1)}\global\let\yminSCALED=\pgfmathresult
\edef\pgfmathresult{\xmax}\global\let\xmaxSCALED=\pgfmathresult
\edef\pgfmathresult{\xmin}\global\let\xminSCALED=\pgfmathresult
},
},
}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
group style={
horizontal sep=0.2cm,
group size=2 by 1,
ylabels at=edge left,
yticklabels at=edge left,
},
ymin=300, ymax=1300,
xlabel={The label for the x-axis},
ylabel={Some y-values},
scale ticks above exponent={2},
YScaling=3,
]
\addplot[only marks] coordinates{(2000,1200) (3000,500)};
\draw[ultra thick, dashed, blue] (axis cs:\xminSCALED,\yminSCALED) rectangle (axis cs:\xmaxSCALED,\ymaxSCALED); %<--- not working
%
\end{axis}
\end{tikzpicture}
\end{document}
Очевидно, что "min" и "max" — это не совсем то, что вы хотели здесь (я, должно быть, что-то упустил). Но, возможно, это правильное направление?
РЕДАКТИРОВАТЬ
По поводу Ваших вопросов:
\edef\pgfmathresult{...}
означает "расширенное определение": оно определяет,\pgfmathresult
что содержит все, что находится в фигурных скобках. В вашем примере вы имели в виду\pgfmathparse{...}
. Пожалуйста, замените\edef\pgfmathresult
на\pgfmathparse
; с ним проще работать, и он имеет тот же эффект.У меня возникли проблемы с компиляцией примера. Кажется, мой подход с
every axis/.style
несовместим сgroupplot
(извините за то, что не протестировал его должным образом). A workaround appears to be to add the
xscalingdown` и т. д.каждыйgroupplot (полагаю, есть более разумные способы, но у меня сейчас нет времени их искать).Ваши
*SCALED
версии должны напоминатьобратныйпреобразование: если ваше преобразование равно «*10», то в версии SCALED должно использоваться «/10».Я исправил выравнивание xlabel.
Код:
\documentclass{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.11}
\newcommand{\getpgfkey}[1]{\pgfkeysvalueof{/pgfplots/#1}}
\newcommand{\xmin}[0]{\getpgfkey{xmin}}
\newcommand{\xmax}[0]{\getpgfkey{xmax}}
\newcommand{\ymin}[0]{\getpgfkey{ymin}}
\newcommand{\ymax}[0]{\getpgfkey{ymax}}
\usepgfplotslibrary{groupplots}
\pgfplotsset{
xscalingdown/.style={
x coord trafo/.code=\pgfmathparse{##1/(1e#1)},
every axis/.append code={%
\pgfmathparse{\xmax*(1e#1)}\global\let\xmaxSCALED=\pgfmathresult
\pgfmathparse{\xmin*(1e#1)}\global\let\xminSCALED=\pgfmathresult
},
xlabel style={
append after command={
node [ anchor=base west] at (\tikzlastnode.base east) {$\cdot{10^{#1}}$}
}
}
},
xscalingup/.style={
x coord trafo/.code=\pgfmathparse{##1*(1e#1)},
every axis/.append code={%
\pgfmathparse{\xmax/(1e#1)}\global\let\xmaxSCALED=\pgfmathresult
\pgfmathparse{\xmin/(1e#1)}\global\let\xminSCALED=\pgfmathresult
},
xlabel style={
append after command={
node [anchor=base west] at (\tikzlastnode.base west) {$\cdot{10^{{-1}#1}}$}
}
}
},
yscalingdown/.style={
y coord trafo/.code=\pgfmathparse{##1/(1e#1)},
every axis/.append code={%
\pgfmathparse{\ymax*(1e#1)}\global\let\ymaxSCALED=\pgfmathresult
\pgfmathparse{\ymin*(1e#1)}\global\let\yminSCALED=\pgfmathresult
},
ylabel style={
append after command={
node [rotate=90, anchor=base west] at (\tikzlastnode.base east) {$\cdot{10^{#1}}$}
}
}
},
yscalingup/.style={
y coord trafo/.code=\pgfmathparse{##1*(1e#1)},
every axis/.append code={%
\pgfmathparse{\ymax/(1e#1)}\global\let\ymaxSCALED=\pgfmathresult
\pgfmathparse{\ymin/(1e#1)}\global\let\yminSCALED=\pgfmathresult
},
ylabel style={
append after command={
node [rotate=90, anchor=base west] at (\tikzlastnode.base east) {$\cdot{10^{{-1}#1}}$}
}
}
},
}
\begin{document}
\begin{tikzpicture}
\begin{groupplot}[
group style={
horizontal sep=0.2cm,
group size=2 by 1,
ylabels at=edge left,
yticklabels at=edge left,
},
ymin=-100, ymax=1300,
xlabel={The label for the x-axis},
ylabel={Some y-values},
]
\nextgroupplot[
xscalingdown=3,
yscalingdown=3,
]
\addplot[only marks] coordinates{(2000,1200) (3000,500)};
\draw[ultra thick, dashed, blue] (axis cs:\xminSCALED,\yminSCALED) rectangle (axis cs:\xmaxSCALED,\ymaxSCALED);
\nextgroupplot[
xscalingdown=3,
yscalingdown=3,
]
\addplot[only marks] coordinates{(2100,1000) (2800,1200)};
\draw[ultra thick, dashed, blue] (axis cs:\xminSCALED,\yminSCALED) rectangle (axis cs:\xmaxSCALED,\ymaxSCALED);
\end{groupplot}
\end{tikzpicture}
\end{document}