带有 pgfplots 的 Tufte 类轴

带有 pgfplots 的 Tufte 类轴

如何用 pgfplot 实现这种轴?图片取自 Szymon Beczkowski 的精彩博士论文设计(论文链接

致谢 Beczkowski、Szymon

我可能会给你提供一些数据来玩。

\documentclass{standalone}
\usepackage{pgfplots}

\begin{document}
\begin{tikzpicture}
\begin{axis}[xlabel={$L$ [H]},ylabel={$\hat{I}_{DM}$ [A]},axis lines*=left,grid,xtick=data]
  \addplot coordinates {(948e-6,1.61981) (1.5e-3,1.02377) (2e-3,0.769047) (2.5e-3,0.614994) (3e-3,0.503511)};
\end{axis}
\end{tikzpicture}
\end{document}

答案1

您可以移动轴、刻度和标签以获得轴效果。调整图的颜色和标记的大小,使您更接近一般风格。可以通过引用数据坐标系中的点的节点添加标签。

我已经更新了之前的回答,包括了新功能,pgfplots并将大部分代码放在了单一tuftelike风格中。非常感谢 Christian Feuersänger 对该pgfplots软件包的持续工作。

示例输出

\documentclass{article}

\usepackage{pgfplots}
\pgfplotsset{compat=1.13}

\pgfkeys{/pgfplots/tuftelike/.style={
  semithick,
  tick style={major tick length=4pt,semithick,black},
  separate axis lines,
  axis x line*=bottom,
  axis x line shift=10pt,
  xlabel shift=10pt,
  axis y line*=left,
  axis y line shift=10pt,
  ylabel shift=10pt}}

\begin{document}

\begin{tikzpicture}[every pin/.style={red!50!black,font=\small\sffamily}]
  \begin{axis}[tuftelike,
    xlabel={$L$ [H]},
    ylabel={$\hat{I}_{DM}$ [A]},
    enlarge x limits=false,
    xtick=data,
    ytick={0.4,0.6,...,1.801},
    ymin=0.4,ymax=1.8]
    \addplot[black,mark=*,mark size=1.5pt]
    coordinates{(948e-6,1.61981) (1.5e-3,1.02377) (2e-3,0.769047)
    (2.5e-3,0.614994) (3e-3,0.503511)};
    \node[coordinate,pin=above right:{2007}] at (axis cs:1.5e-3,1.02377) {};
  \end{axis}
\end{tikzpicture}

\end{document}

轴的形状是通过使用separate axis linesaxis ... line*样式获得的。轴移位是通过axis ... line shift...label shift命令获得的。这些可以作为一个通用命令发出,但我保留了xy变体,以便您需要单独更改它们。刻度样式和颜色的调整来自semithicktick style

(由于内部算法中的舍入问题,最后一个ytick值被改为。)1.8011.8

代码

[every pin/.style={red!50!black,font=\small\sffamily}]

为图表上给定点的标签提供样式。

答案2

除了移动轴之外,您还可以更进一步创建 Tufte 所称的“范围框架”,其中轴线仅覆盖数据的范围。其中一种方法在使用 PGFPlots 创建 Tufte 风格的条形图和散点图TUGBoat 第 34 期

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

\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={
        tick align=outside,
        axis line style={opacity=0},
        after end axis/.code={
            \draw ({rel axis cs:0,0}-|{axis cs:\pgfplotsdataxmin,0}) -- ({rel axis cs:0,0}-|{axis cs:\pgfplotsdataxmax,0});
            \draw ({rel axis cs:0,0}|-{axis cs:0,\pgfplotsdataymin}) -- ({rel axis cs:0,0}|-{axis cs:0,\pgfplotsdataymax});
        }
    }
}

\begin{tikzpicture}
\begin{axis}[
    range frame,
    xlabel={$L$ [H]},
    ylabel={$\hat{I}_{DM}$ [A]},
    axis lines*=left,
    xtick=data, ymin=0.41
]
  \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) (3e-3,0.503511)};
\end{axis}
\end{tikzpicture}
\end{document}

答案3

Pgfplots 允许非常精细的轴自定义,这得益于以下选项:

  • x/y/z axis line style
  • x/y/ztick style
  • x/yt/zticklabel style

基本上,如果你以适当的方式转移元素,你就可以实现类似的效果。一个旨在证明概念的谦虚尝试:

\documentclass[border=10pt]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.9}

\begin{document}
\begin{tikzpicture}[font=\sffamily]
\begin{axis}[extra description/.code={% to place xlabel and ylabel more arbitrarily
  \node[below=7pt] at ([xshift=1.5cm]xticklabel* cs:1){$L$ [H]};
  \node at ([xshift=-1.5cm]yticklabel* cs:0.5){$\hat{I}_{DM}$ [A]};
  },
  axis x line=left,
  axis y line=left,
  y axis line style={xshift=-6pt,-},
  x axis line style={yshift=-6pt,-},
  xtick style={yshift=-4pt,black}, % black to override the default style
  ytick style={xshift=-4pt,black}, % black to override the default style
  xticklabel style={yshift=-5pt},
  yticklabel style={xshift=-5pt},  
  scaled ticks=false,
  ymin=0.5,
  ymax=1.75,
  ytick={0.5,0.75,1,1.25,1.5,1.75},
  yticklabels={0.5,0.75,1,1.25,1.5,1.75},
  xmin=0.9e-3,
  xmax=3.2e-3,
  xtick={0.9e-3,1.4e-3,2e-3,2.6e-3,3.2e-3},
  xticklabels={0.9e-3,1.4e-3,2e-3,2.6e-3,3.2e-3}]
  \addplot coordinates {(948e-6,1.61981) (1.5e-3,1.02377) (2e-3,0.769047) (2.5e-3,0.614994) (3e-3,0.503511)};
\end{axis}
\end{tikzpicture}
\end{document}

结果:

在此处输入图片描述

相关内容