\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
대략적으로 에 위치합니다.)
물론 언제든지 수동으로 위치를 조정하고 추가 정렬 등을 수행할 수 있지만 이는 매우 시간이 많이 걸립니다. 그래서 Jake는 추가적인 확장 스타일을 사용하여 솔루션을 제공했습니다.
하지만 그런 종류의 다른 여러 가지가 "중단"됩니다. 내 의견을 참조하세요.여기. 가장 주목할만한 점은 앞서 언급한 \xmin
, ... 명령을 사용할 때 소리 의미가 부족하다는 것입니다 \xmax
. 변환 후에는 이러한 값이 범위를 벗어나므로 더 이상 표시되지 않습니다.
그래서 좌표가 변환/크기 조정된 후에 정의/갱신되는 새 값이나 변수 \xminSCALED
(and \xmaxSCALED
, \yminSCALED
and ) 를 정의하고 싶습니다 . \ymaxSCALED
그러면 이러한 새로운 값은 변환된 데이터의 새로운 최소값과 최대값에 대한 액세스를 제공해야 합니다.엑스그리고와이.
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{
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에 대한 그림
추가 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}
분명히 "최소"와 "최대"는 여기서 원하는 것이 아닙니다(뭔가 놓친 게 틀림없습니다). 하지만 아마도 이것이 올바른 방향일까요?
편집하다
귀하의 질문에 관하여:
\edef\pgfmathresult{...}
\pgfmathresult
"확장된 정의"를 의미합니다. 중괄호 안에 있는 내용을 모두 포함하도록 정의합니다 . 귀하의 예에서는\pgfmathparse{...}
.\edef\pgfmathresult
로 대체해주세요\pgfmathparse
; 작업하기가 더 쉽고 동일한 효과가 있습니다.예제에서 컴파일 문제가 발생했습니다. 내 접근 방식이 xscalingdown` 등과
every axis/.style
호환되지 않는 것 같습니다groupplot
(제대로 테스트하지 않아서 죄송합니다).. A workaround appears to be to add the
각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}