如何用 pgfplot 实现这种轴?图片取自 Szymon Beczkowski 的精彩博士论文设计(论文链接)
我可能会给你提供一些数据来玩。
\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 lines
和axis ... line*
样式获得的。轴移位是通过axis ... line shift
和...label shift
命令获得的。这些可以作为一个通用命令发出,但我保留了x
和y
变体,以便您需要单独更改它们。刻度样式和颜色的调整来自semithick
和tick style
。
(由于内部算法中的舍入问题,最后一个ytick
值被改为。)1.801
1.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}
结果: