我使用以下代码来创建类似簇状的范围图,如下所建议:带有 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}