pgfplots에서 레이블이 있는 눈금에 대해서만 그리드 선을 그리는 방법은 무엇입니까?

pgfplots에서 레이블이 있는 눈금에 대해서만 그리드 선을 그리는 방법은 무엇입니까?

나는 동적 사전을 사용하고 있습니다mail-archive.com x축에 대한 데이터를 자동으로 생성합니다.

매 초(또는 매 3분의 1, ...) 틱과 그리드 선만 원합니다. 이미 눈금 레이블을 생략했지만 격자선은 여전히 ​​남아 있습니다.

MWE는 다음과 같습니다.

\documentclass{article}

\usepackage{pgfplots}
\usepackage{ifthen}
\usepackage{intcalc}

\newcount\kencounter
\global\kencounter=0
\global\def\xdata{}

\pgfplotsset{
    dynamic dict fewerticks/.style={
        x coord trafo/.code={%
            \pgfkeysifdefined{/ken/key ##1}{%
                 \pgfkeysgetvalue{/ken/key ##1}\pgfmathresult%
            }{%
                \ifthenelse{\equal{\intcalcMod{\the\kencounter}{#1}}{0}}{
                    \ifthenelse{\equal{\xdata}{}}
                    {\global\edef\xdata{##1}}
                    {\global\edef\xdata{\xdata,##1}}
                }{}
                \edef\pgfmathresult{\the\kencounter}%
                \global\pgfkeyslet{/ken/key ##1}\pgfmathresult
                \global\pgfkeyslet{/ken/key no \pgfmathresult}{##1}%
                \global\advance\kencounter by 1
            }%
        },
        x coord inv trafo/.code={%
            \pgfmathint{##1}%
            \pgfkeysifdefined{/ken/key no \pgfmathresult}{%
                    \pgfkeysgetvalue{/ken/key no \pgfmathresult}\pgfmathresult%
            }{%
                    \PackageError{pgfplots}{Inverse trafo for \pgfmathresult\space failed: no such key!}{}%
            }%
        },
        xticklabel={\ifthenelse{\equal{\intcalcMod{\ticknum}{#1}}{0}}{\tick}{}},
        scaled x ticks=false,
        plot coordinates/math parser=false
    },
}

\begin{document}

My tries:

\begin{tikzpicture}%
    \begin{axis}[width=7cm,dynamic dict fewerticks=2,grid=major, xtick=data,ylabel={\xdata}]%
        \addplot coordinates { (1M,2) (2M,4) (3M,6) };
    \end{axis}%
\end{tikzpicture}
%
\begin{tikzpicture}%
    \begin{axis}[width=7cm,dynamic dict fewerticks=2,grid=major, xtick={1M,3M},ylabel={\xdata}]%
        \addplot coordinates { (1M,2) (2M,4) (3M,6) };
    \end{axis}%
\end{tikzpicture}

\vspace{1cm}How it should look like (ignore the missing M):\vspace{1cm}

\begin{tikzpicture}%
    \begin{axis} [width=7cm,grid=major,xtick={1,3}]%
         \addplot coordinates { (1,2) (2,4) (3,6) };
    \end{axis}%
\end{tikzpicture}%

\end{document}

그리고 왜 오른쪽 상단 사진에 "3M" 라벨이 표시되지 않나요?

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

답변1

이것은 이 질문을 직접적으로 해결하지는 않지만 내 문제를 해결했습니다. 나는 버퍼 크기와 단위(B, KiB, MiB, GiB)가 있는 ax 축을 원했습니다. 이를 위해 동적 축 스타일이 작동했지만 더 나은 솔루션이 있습니다.

\documentclass{article}

\usepackage{pgfplots}
\usepackage{ifthen}
\pgfplotsset{
    byte x achsis log/.style={
                xticklabel={%
                    \pgfkeys{/pgf/fpu,/pgf/fpu/output format=fixed,/pgf/number format/.cd,fixed,fixed zerofill}
                    \pgfmathparse{2^\tick}
                    \sizetobytes{\pgfmathresult}
                    },
                xticklabel style={rotate=90,anchor=east, font=\small},
    },
}


\def\less#1#2#3{%
    \begingroup%
        \pgfkeys{/pgf/fpu,/pgf/fpu/output format=fixed,/pgf/number format/.cd,fixed,fixed zerofill,precision=0}%
        \def\arga{#1}\edef\earga{\arga}%
        \def\argb{#2}\edef\eargb{\argb}%
        \pgfmathparse{\arga < \argb}%
        \pgfmathprintnumberto[verbatim]{\pgfmathresult}{\lessresult}%
        \xdef#3{\lessresult}%
    \endgroup%
}

\def\sizetobytes#1{%
    \begingroup%
    \def\size{#1}%
    \less{\size}{1024}{\result}%
    \ifthenelse{\equal{\result}{1}}%
    {%
        \pgfkeys{/pgf/fpu,/pgf/fpu/output format=fixed,%
        /pgf/number format/.cd,fixed,fixed zerofill,precision=0,set thousands separator={}}%
        \pgfmathprintnumber{\size}$\;$B%
    }%
    {%
        \pgfkeys{/pgf/fpu,/pgf/fpu/output format=fixed,%
        /pgf/number format/.cd,fixed,fixed zerofill,precision=1,set thousands separator={}}%
        \less{\size}{1048576}{\result}%
        \ifthenelse{\equal{\result}{1}}{%
            \pgfmathparse{divide(\size,1024)}%
            \pgfmathprintnumber{\pgfmathresult}$\;$KiB%
        }%
        {%
            \less{\size}{1073741824}{\result}%
            \ifthenelse{\equal{\result}{1}}{%
                \pgfmathparse{divide(\size,1048576)}%
                \pgfmathprintnumber{\pgfmathresult}$\;$MiB%
            }%
            {%
                \pgfmathparse{divide(\size,1073741824)}%
                \pgfmathprintnumber{\pgfmathresult}$\;$GiB%
            }%
        }%
    }%
    \endgroup%
}%

\begin{document}

\begin{tikzpicture}%
    \begin{axis} [width=7cm,
                grid=major,
                xmode=log,
                log basis x=2,
                byte x achsis log,
                xminorticks=true,
                try min ticks log=13
                ]%
         \addplot coordinates { (1,2) (2048,4) (3000,6) (3000000,7)};
    \end{axis}%
\end{tikzpicture}%

\end{document}

결과 이미지

관련 정보