评论

评论

我想改变pgfplots放置的行为刻度标签单位

我希望的位置是或位于最后两个刻度之间或位于倒数第二个刻度的位置。对于单位,此功能尚不存在,但至少可以将单位单独定义为 的一部分\usepgfplotslibrary{units}。也许将来可以定义它们的位置。

对于刻度标签,可以使用every tick scale label/.style={}(手册第 277 页)进行放置。

对此,我有两个问题。

  • 是否有可能找到最后两个刻度之间的坐标(例如 样式(xticklabel cs:...))?
  • 如何防止重叠?如果要缩小,刻度标签应位于倒数第二个刻度标签的位置。为此,必须禁用此刻度标签。

还讨论了单位的放置这里无解。


编辑

这是解决方法的 MWE。\cdot 10^{-2}应该在 1.3 和 1.2 之间。我更喜欢用\timesin 而不是\cdot

\documentclass{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage[sticky-per]{siunitx}

\usepackage{tikz}
\usepackage{pgfplots}
\SendSettingsToPgf %follow localization
\usepgfplotslibrary{units}
\pgfplotsset{
            compat=1.8, 
            unit marking pre={\!\!/}, 
            unit marking post={},
            y label style={rotate=-90},
            %scale ticks above exponent = 1, %choose between scaling to one number before comma or to multiples of 3
            %scaled ticks=engineering, https://tex.stackexchange.com/a/124268/32245
            }

\begin{document}
\begin{figure}
\centering
\begin{tikzpicture}
  \begin{axis}[
    yticklabel=$\pgfmathprintnumber{\tick}$,%follow localization
    xticklabel=$\pgfmathprintnumber{\tick}$,%follow localization
        %Problem here: for `scaled ticks=false` and big numbers, the numbers overlap
        xlabel=$\vartheta$, ylabel=$P$,
        x unit= \si{\kelvin}, y unit= \si{\watt},
        %scaled x ticks=false, %or {base 10:-3}, local manipulation of scaling
        %scaled y ticks={base 10:-2}, %or false, local manipulation of scaling
                ]
    \addplot coordinates {
        (1000,.01)
        (2000,.011)
        (3000,.012)
        (4000,.013)
    };
  \end{axis}
\end{tikzpicture}
\caption{Loss $P$ over temperature $\vartheta$}
\end{figure}
\end{document}

看到我的结果后,出现了一些额外内容:

  • 10^3为什么x 轴上没有?
  • 这个 x 刻度标签将成为定位的候选3,500 点
  • 可以将单位移动到我在本文中搜索的坐标。例如\si{\kelvin}代替 3,500 个刻度
  • 根据siunitx本地化解析刻度中的所有数字

答案1

您可以通过使用计数器命名刻度标签节点来找到最后两个刻度标签之间的位置。

如果空间不足,将刻度标签放置在倒数第二个刻度标签的位置会非常繁琐。更简单的方法是将刻度标签放在刻度标签的顶部,使用白色背景覆盖刻度标签。

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[sticky-per]{siunitx}

\usepackage{tikz}
\usetikzlibrary{calc}
\usepackage{pgfplots}
\SendSettingsToPgf %follow localization
\usepgfplotslibrary{units}
\pgfplotsset{
            compat=1.8, 
            unit marking pre={\!\!/}, 
            unit marking post={},
            y label style={rotate=-90},
            %scale ticks above exponent = 1, %choose between scaling to one number before comma or to multiples of 3
            %scaled ticks=engineering, http://tex.stackexchange.com/a/124268/32245
            }

\newcounter{yticklabel}
\newcounter{xticklabel}
\pgfplotsset{
    larifaris yticklabel/.style={
         yticklabel style={
            name=yticklabel-\theyticklabel,
            execute at end node={\stepcounter{yticklabel}}
         },
        every y tick scale label/.style={
            at={
                ($(yticklabel-\the\numexpr\theyticklabel-2\relax.east)!0.5!(yticklabel-\the\numexpr\theyticklabel-1\relax.east)$)
            },
            anchor=east
        },      
    },
    larifaris xticklabel/.style={
         xticklabel style={
            name=xticklabel-\thexticklabel,
            execute at end node={\stepcounter{xticklabel}}
         },
        every x tick scale label/.style={
            at={(xticklabel-\the\numexpr\thexticklabel-2\relax)},
            anchor=center,
            fill=white, inner ysep=1pt
        },      
    }
}

\begin{document}
\begin{figure}
\centering

\begin{tikzpicture}
  \begin{axis}[
        larifaris yticklabel,
        scale ticks above exponent=2,
        larifaris xticklabel,
        xlabel=$\vartheta$, ylabel=$P$,
        x unit= \si{\kelvin}, y unit= \si{\watt}
                ]
    \addplot coordinates {
        (1000,.01)
        (2000,.011)
        (3000,.012)
        (4000,.013)
    };
  \end{axis}

\end{tikzpicture}

\caption{Loss $P$ over temperature $\vartheta$}
\end{figure}
\end{document}

答案2

评论

我没有找到所有问题的解决方案,尤其是根据任何选定的刻度设置数量级(这需要几个let ... in ...操作,这在坐标规范内是不可能的)。

另外,根据纸张尺寸用其他标签替换刻度标签似乎也不可能。

我希望我的实施是一个好的起点。

执行

\documentclass[tikz,border=3pt]{standalone}
\usepackage[sticky-per]{siunitx}
\usepackage{pgfplots}
\usepgfplotslibrary{units}
\pgfplotsset{
    compat=1.8, 
    unit marking pre={\!\!/}, 
    unit marking post={},
    y label style={rotate=-90},
    every x tick scale label/.style={
        at={(xticklabel cs:0.8,5pt)},
        anchor=near xticklabel,
        inner sep=0pt
    }, % change position of order of magnitude on x axis
    tick scale binop=\times, % Use \times instead of \cdot for order of magnitude
    ticklabel style={/pgf/number format/use comma}, % use comma as decimal separator in ticklabels
}
\begin{document}
\begin{tikzpicture}
    \begin{axis}[
        xlabel=$\vartheta$,
        ylabel=$P$,
        x unit=\si{\kelvin},
        y unit=\si{\watt},
        scaled x ticks={base 10:-3}, % scale x axis to 10^3
    ]
        \addplot coordinates {
            (1000,.01)
            (2000,.011)
            (3000,.012)
            (4000,.013)
        };
    \end{axis}
\end{tikzpicture}
\end{document}

输出

在此处输入图片描述

相关内容