删除 xtick 和 ytick 的第一个和最后一个值

删除 xtick 和 ytick 的第一个和最后一个值

我使用以下代码来创建类似簇状的范围图,如下所建议:带有 pgfplots 的 Tufte 类轴

\documentclass{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}

\makeatletter
\def\pgfplotsdataxmin{\pgfplots@data@xmin}
\def\pgfplotsdataxmax{\pgfplots@data@xmax}
\def\pgfplotsdataymin{\pgfplots@data@ymin}
\def\pgfplotsdataymax{\pgfplots@data@ymax}
\makeatother

\pgfplotsset{
    range frame/.style={
        axis lines*=left,
        enlargelimits=false,        
        axis line shift=10pt,
        xlabel style={yshift=-10pt},
        ylabel style={yshift=10pt},     
    },
    tufte extra ticks/.style={
        extra x ticks={
            \pgfplotsdataxmin,
            \pgfplotsdataxmax
        },
        extra y ticks={
            \pgfplotsdataymin,
            \pgfplotsdataymax
        },
    }       
}

\begin{document}
    \begin{tikzpicture}
    \begin{axis}[
        range frame,
        tufte extra ticks,
    ]
    \addplot +[black, mark options=fill=black] coordinates {(948e-6,1.61981) (1.5e-3,1.02377) (2e-3,0.769047) (2.5e-3,0.614994) (3.2e-3,0.503511)};
    \end{axis}
    \end{tikzpicture}
\end{document}

在此处输入图片描述

从图片中可以明显看出,自动地xtick从每个轴上删除第一个和最后一个刻度(存储在和中的值ytick,而不是extra x ticks和中extra y ticks),以致于没有重叠?

答案1

虽然答案来得很晚,但我最近在使用时遇到了类似的问题extra y ticks = ...

在此处输入图片描述

这为我单独解决了这个问题不是如果不需要的额外标签超过某个指定值,则绘制它们(请注意,我必须使用 \ifdim hack 才能比较两个浮点数):

  yticklabel={
  \pgfmathsetmacro\upBound{0.9*\pgfkeysvalueof{/pgfplots/ymax}+0.1*\pgfkeysvalueof{/pgfplots/ymin}}
  \pgfmathsetmacro\loBound{0.1*\pgfkeysvalueof{/pgfplots/ymax}+0.9*\pgfkeysvalueof{/pgfplots/ymin}}
  \ifdim \tick pt > \upBound pt 
      \ifnum \ticknum = 1
          $\pgfmathprintnumber{\tick}$
      \fi
  \else
      \ifdim \tick pt < \loBound pt
          \ifnum \ticknum = 0
              $\pgfmathprintnumber{\tick}$
          \fi
      \else
          $\pgfmathprintnumber{\tick}$
      \fi
  \fi
}

在此处输入图片描述

很容易看出,这种方法效果很好,可以自动生成合理距离的值,同时避免不必要的重叠刻度标签。但是,这种方法的缺点是会在最大值正下方显示未标记的刻度。因此,另一种解决方案是使用语法ytick={10,15,...,35}。使用此语法,您可以获得

在此处输入图片描述

通常情况下,我更喜欢第二种解决方案。但是,它也有缺点,你必须手动指定刻度之间的距离。否则,\foreach(在后台生成刻度)会生成过多的刻度。手动调整完全没问题,如果你只想生成一些可以手动调整的图。但是,如果你要绘制更多图,你可能会更习惯指定自动阈值 :)

因此,最后,这里有一个包含精简数据集和上面提到的两种解决方案的 MWE:

\documentclass{standalone}
\usepackage[latin1]{inputenc}
\usepackage{pgfplots}
\usepackage{siunitx}

\pgfplotsset{compat=newest}
\usepgfplotslibrary{colormaps,colorbrewer}

\begin{document}
\begin{tikzpicture}
    \begin{axis}[ width=0.8\textwidth, height = 8cm,
                  colorbar,
                  scaled ticks=false,
                  /pgf/number format/.cd, 1000 sep={},
                  colorbar style = {
                      ylabel = {$\Delta t$ [ms]},
                      extra y ticks = { \pgfkeysvalueof{/pgfplots/ymin}, \pgfkeysvalueof{/pgfplots/ymax} },
                      yticklabel={
                          \pgfmathsetmacro\upBound{0.9*\pgfkeysvalueof{/pgfplots/ymax}+0.1*\pgfkeysvalueof{/pgfplots/ymin}}
                          \pgfmathsetmacro\loBound{0.1*\pgfkeysvalueof{/pgfplots/ymax}+0.9*\pgfkeysvalueof{/pgfplots/ymin}}
                          \ifdim \tick pt > \upBound pt 
                              \ifnum \ticknum = 1
                                  $\pgfmathprintnumber{\tick}$
                              \fi
                          \else
                              \ifdim \tick pt < \loBound pt
                                  \ifnum \ticknum = 0
                                      $\pgfmathprintnumber{\tick}$
                                  \fi
                              \else
                                  $\pgfmathprintnumber{\tick}$
                              \fi
                          \fi
                      },
%                      ytick={10,15,...,35},
                      y tick label style = {/pgf/number format/.cd, fixed, zerofill, precision=2, 1000 sep={}}
                  },
                  colormap name={viridis},
                  view={0}{90},
                  xtick=data,
                  xlabel={$k_{\mathrm{p}}$ [\si{kN/m}]},
                  ytick=data,
                  ylabel={$k_{\mathrm{d}}$ [\si{kN.s/m}]},
                  major tick length = 0cm,
                  grid = major,
                  grid style ={color=darkgray},
                  title={$k_{\mathrm{i}}=10$ \si{N/m.s}}
                ]

        \addplot3[ surf, shader=interp ]
            table[x expr=\thisrow{kp}/1000, y expr=\thisrow{kd}/1000, z expr=\thisrow{tStepMax}*1000] {% {../parvar_base/parvar_ki_10.txt};
        iVar  kp      ki      kd      tStepMax              
        16    15000   10      0       0.0269140625        
        17    15000   10      1000    0.02672851563       
        18    15000   10      2500    0.0126953125        
        19    15000   10      4000    0.008140625         
        20    15000   10      5000    0.006546875         

        21    20000   10      0       0.04078125          
        22    20000   10      1000    0.0253515625        
        23    20000   10      2500    0.01251953125       
        24    20000   10      4000    0.00809375          
        25    20000   10      5000    0.00653515625       

        26    25000   10      0       0.0395703125        
        27    25000   10      1000    0.024140625         
        28    25000   10      2500    0.01236328125       
        29    25000   10      4000    0.00803125          
        30    25000   10      5000    0.0065078125          
        };
    \end{axis}

\end{tikzpicture}
\end{document}

相关内容