Configurando ytick em posições definidas na barra de cores usando TikZ/PGFPlots, sem eixo

Configurando ytick em posições definidas na barra de cores usando TikZ/PGFPlots, sem eixo

Ontem postei minha primeira pergunta (Problemas para definir ytick na barra de cores usando TikZ/PGFPlots, sem eixo) e obtive respostas realmente fantásticas. Agora funciona como eu queria. Mas ainda tenho um pequeno problema e aparentemente sou estúpido demais para resolvê-lo. Devido a alguns problemas com o registro (agora funciona!) e com o status do fórum, não consigo comentar meu último post.

Agora, meu problema: quero fazer uma barra de cores no TikZ sem nenhum eixo ao lado. Foi isso que consegui até agora usando a ajuda deste super fórum.

status real da barra de cores

Mas quero definir os yticks em posições definidas, como mostrado na figura 2 no valor mínimo da barra 7,50e6, depois 8,75e6, 1e7, ..., até o valor máximo da barra (1,75e7). A Figura 2 mostra minha solução desejada em relação aos yticks.

insira a descrição da imagem aqui

Como posso autodefinir os yticks?

Aqui está meu código até agora:

\documentclass[12pt,a4paper,oneside]{report}
\usepackage{tikz}
\usepackage{pgfplots, siunitx}

\begin{document}

\begin{tikzpicture}
\begin{axis}[
    hide axis,
    scale only axis,                % 
    height=0pt,                     % Grafik auf größe null
    width=0pt,                      % Grafik auf größe null
    colorbar sampled,               % Diskrete Stufung
    colormap={mymap}{[1pt] rgb(0pt)=(0.68235,0,1);
            rgb(9pt)=(0,0.1216, 1);
            rgb(17pt)=(0, 0.69412, 1); 
            rgb(26pt)=(0, 1, 0.6863); 
            rgb(34pt)=(0, 1, 0.098); 
            rgb(43pt)=(0.557,1,0); 
            rgb(51pt)=(1, 0.8353, 0); 
            rgb(60pt)=(1, 0.2275, 0);  
            rgb(63pt)=(1,0.02745,0)},
    colorbar style={
        title={$J$ in $\frac{A}{\si{\square\m}}$},     % Titel über Colorbar gedreht si unit m^2
        %title={$J$ in $\frac{A}{m^{2}}$},              % Titel über Colorbar gedreht
        samples=75,                  % Anzahl diskreter Schritte, so viele wie yticks
        width=15,                   % Breite der Colorbar (des farbigen Bereichs)
        height=220,                 % Höhe der Colorbar
        point meta min=7500000, %neu     % Beginn Colorbar, beachte yticks min
        point meta max=17500000, %neu      % Ende Colorbar, beachte yticks max
        scaled y ticks = false,
        yticklabel={
            \num[
                %scientific-notation = fixed,
                scientific-notation = true,
                %fixed-exponent = 5,
                exponent-product=\cdot,
                %output-exponent-marker = \text{e},
                round-integer-to-decimal = true,
                round-mode = figures,
                round-precision = 3,
            ]{\tick}
        },
        yticklabel style={
            text width=4em,       % Abstand yticks zu colorbar
            align=right,            %          
        }
    }
]
\end{axis}
\end{tikzpicture}

\end{document}

Espero que você possa me ajudar. Muito obrigado antecipadamente!

Responder1

Pessoalmente, não acho que essas posições sejam muito úteis, mas veja como você pode obtê-las.

A maneira mais simples é o "método de força bruta": definido ytick = {7.5e6, 8.75e6, 1e7, 1.125e7, 1.25e7, 1.375e7, 1.5e7, 1.625e7, 1.75e7}para especificar manualmente todas as posições dos ticks.

Mas como isso não é muito flexível, você pode querer usar a foreachsintaxe de ytick = {7.5e6, 8.75e6, ..., 1.75e7}. No entanto, isso falhará com um dimension too largeerro porque esse mecanismo usa aritmética básica do TeX, que não consegue lidar com números tão grandes. Portanto, teremos que usar algumas etapas intermediárias:

  • Ao contrário do que eu disse antes, especifique os limites dos eixos em unidades escalonadas:

    point meta min=7.5,
    point meta max=17.5
    
  • Isso permite que você especifique as posições dos ticks usando a foreachsintaxe:

    ytick = {7.5, 8.75, ..., 17.5}
    
  • Dentro dos rótulos dos ticks, você pode reduzir os valores dos ticks:

    yticklabel={
    \pgfkeys{/pgf/fpu=true, /pgf/fpu/output format=fixed} % Necessary for handling large values
    \pgfmathparse{\tick*1e6} % Scale the tick values
        \num[
            scientific-notation = true,
            exponent-product=\cdot,
            round-integer-to-decimal = true,
            round-mode = places,
            round-precision = 3,
        ]{\pgfmathresult}
    

\documentclass[12pt,a4paper,oneside]{report}
\usepackage{tikz}
\usepackage{pgfplots, siunitx}

\begin{document}

\begin{tikzpicture}
\begin{axis}[
    hide axis,
    scale only axis,                % 
    height=0pt,                     % Grafik auf größe null
    width=0pt,                      % Grafik auf größe null
    colorbar sampled,               % Diskrete Stufung
    colormap={mymap}{[1pt] rgb(0pt)=(0.68235,0,1);
            rgb(9pt)=(0,0.1216, 1);
            rgb(17pt)=(0, 0.69412, 1); 
            rgb(26pt)=(0, 1, 0.6863); 
            rgb(34pt)=(0, 1, 0.098); 
            rgb(43pt)=(0.557,1,0); 
            rgb(51pt)=(1, 0.8353, 0); 
            rgb(60pt)=(1, 0.2275, 0);  
            rgb(63pt)=(1,0.02745,0)},
    colorbar style={
        title={$J$ in $\frac{A}{\si{\square\m}}$},     % Titel über Colorbar gedreht si unit m^2
        %title={$J$ in $\frac{A}{m^{2}}$},              % Titel über Colorbar gedreht
        samples=75,                  % Anzahl diskreter Schritte, so viele wie yticks
        width=15,                   % Breite der Colorbar (des farbigen Bereichs)
        height=220,                 % Höhe der Colorbar
        point meta min=7.5, %neu     % Beginn Colorbar, beachte yticks min
        point meta max=17.5, %neu      % Ende Colorbar, beachte yticks max
        scaled y ticks = false,
       ytick = {7.5, 8.75, ..., 17.5},
        yticklabel={
    \pgfkeys{/pgf/fpu=true, /pgf/fpu/output format=fixed}
    \pgfmathparse{\tick*1e6}
            \num[
                %scientific-notation = fixed,
                scientific-notation = true,
                %fixed-exponent = 5,
                exponent-product=\cdot,
                %output-exponent-marker = \text{e},
                round-integer-to-decimal = true,
                round-mode = places,
                round-precision = 3,
            ]{\pgfmathresult}
        },
        yticklabel style={
            text width=4em,       % Abstand yticks zu colorbar
            align=right,            %          
        }
    }
]
\end{axis}
\end{tikzpicture}

\end{document}

Caso você precise lidar com números enormes (maiores que 1E10), siunitxirá engasgar ao tentar exibir os números usando formato científico. Nesse caso, você pode recorrer ao analisador de números PGF, que, embora não seja tão poderoso quanto o siunitx, também permite uma quantidade razoável de personalização:

\pgfmathparse{\tick*1e6}
\pgfmathprintnumber{\pgfmathresult}

informação relacionada