座標変換後に /pgfplots/xmin (および他の 3 つの値) を更新するにはどうすればよいですか?

座標変換後に /pgfplots/xmin (および他の 3 つの値) を更新するにはどうすればよいですか?

私は生のxとyの値から作られた「ハイブリッド」座標を使用しています\ymin。これはとても使いやすいです。ゴンサロ:

\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そこで、座標が変換/スケールされた後に定義/更新される新しい値または変数(および\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の画像は下記をご覧ください

ここに画像の説明を入力してください

追加の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 theそれぞれgroupplot (もっと賢い方法もあると思いますが、今はそれを探す時間がありません)。

  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}

ここに画像の説明を入力してください

関連情報