¿Cómo puedo renovar /pgfplots/xmin (y los otros 3 valores) después de una transformación de coordenadas?

¿Cómo puedo renovar /pgfplots/xmin (y los otros 3 valores) después de una transformación de coordenadas?

Utilizo coordenadas "híbridas" hechas de \yminvalores x e y sin procesar. Es bastante cómodo de usar, gracias agonzalo:

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

Ahora... supongamos que tiene grandes valores de datos y le gustaría escalar sus datos y ajustar el contenido de las etiquetas de marca en consecuencia. (Esto se basa directamente en mi experiencia personal: me dijeron que la posición predeterminada de y tick labelsno es tan bonita. Personalmente, estoy de acuerdo. Su estilo predeterminado los coloca en (0,1), above right, en términos generales).

Por supuesto, siempre se puede ajustar manualmente su posición y una mayor alineación, etc., pero eso lleva mucho tiempo. Entonces Jake entregó la solución utilizando un estilo de escala adicional.

Pero ese tipo de "rompe" varias cosas más, vean mis comentarios.aquí. Lo más notable es la falta de significado sonoro al utilizar los comandos antes mencionados \xmin, \xmax.... Después de las transformaciones, estos valores quedan fuera de los límites y, por tanto, ya no son visibles.

Entonces, me gustaría definir un nuevo valor o variable \xminSCALED(y \xmaxSCALED, \yminSCALEDy \ymaxSCALED) que se define/renueva después de que las coordenadas se hayan transformado/escalado. Estos nuevos valores deberían dar acceso a nuevos valores mínimos y máximos para la transformaciónXyy.

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}

Imagen para MWE adicional a continuación

ingrese la descripción de la imagen aquí

MWE adicionales

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

Respuesta1

En realidad, esto es demasiado para un comentario, pero no suficiente para una respuesta... pero tal vez pueda encontrar algo de interés o plantear preguntas más específicas para ayudarme a comprender el caso de uso.

Por lo que tengo entendido, le gustaría usarlo \yminSCALEDpara aceptar el valor dentro de axis cs, ¿verdad? En otras palabras, quieres " yminSCALED:= inversoy transformación ( \ymin)" ?

Probablemente esto lo haría:

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

ingrese la descripción de la imagen aquí

Claramente, "mínimo" y "máximo" no son realmente lo que querías aquí (debo haberme perdido algo). ¿Pero tal vez ésta sea la dirección correcta?

EDITAR

Respecto a tus preguntas:

  1. \edef\pgfmathresult{...}significa "definición ampliada": define \pgfmathresultcontener lo que esté entre llaves. En tu ejemplo, quisiste decir \pgfmathparse{...}. Por favor sustitúyalo \edef\pgfmathresultpor \pgfmathparse; es más fácil trabajar con él y tiene el mismo efecto.

  2. Experimenté problemas de compilación con el ejemplo. Parece que mi enfoque every axis/.stylees incompatible con groupplot(perdón por no probarlo correctamente) . A workaround appears to be to add thexscalingdown`, etc.cadadiagrama de grupo (supongo que hay formas más inteligentes, pero no tengo tiempo para encontrarlas ahora).

  3. Tus *SCALEDversiones deben parecerse a lasinversotransformación: si su transformación es "*10", la versión ESCALA debe usar "/10".

  4. Reparé la alineación de xlabel.

Código:

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

ingrese la descripción de la imagen aquí

información relacionada