좌표 변환 후 /pgfplots/xmin(및 다른 3개 값)을 어떻게 갱신할 수 있나요?

좌표 변환 후 /pgfplots/xmin(및 다른 3개 값)을 어떻게 갱신할 수 있나요?

\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, \yminSCALEDand ) 를 정의하고 싶습니다 . \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}

여기에 이미지 설명을 입력하세요

분명히 "최소"와 "최대"는 여기서 원하는 것이 아닙니다(뭔가 놓친 게 틀림없습니다). 하지만 아마도 이것이 올바른 방향일까요?

편집하다

귀하의 질문에 관하여:

  1. \edef\pgfmathresult{...}\pgfmathresult"확장된 정의"를 의미합니다. 중괄호 안에 있는 내용을 모두 포함하도록 정의합니다 . 귀하의 예에서는 \pgfmathparse{...}. \edef\pgfmathresult로 대체해주세요 \pgfmathparse; 작업하기가 더 쉽고 동일한 효과가 있습니다.

  2. 예제에서 컴파일 문제가 발생했습니다. 내 접근 방식이 xscalingdown` 등과 every axis/.style호환되지 않는 것 같습니다 groupplot(제대로 테스트하지 않아서 죄송합니다).. A workaround appears to be to add thegroupplot(더 똑똑한 방법이 있다고 생각하지만 지금은 찾을 시간이 없습니다).

  3. 귀하의 *SCALED버전은 다음과 유사해야 합니다.변환: 변환이 "*10"인 경우 SCALED 버전은 "/10"을 사용해야 합니다.

  4. 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}

여기에 이미지 설명을 입력하세요

관련 정보