4

I would like to use the hobby package to plot smooth drawn curves through points. pgfs' smooth function is not working properly. My code is a follows,

\documentclass{standalone}
\usepackage{pgfplots}
\usepackage{filecontents}
\pgfplotsset{compat=1.9, every tick label/.append style={font=\normalsize}}


\pgfplotscreateplotcyclelist{my black white}{%
    solid,smooth, every mark/.append style={solid, fill=white}, mark=triangle*\\%
    solid, every mark/.append style={solid, fill=black}, mark=triangle*\\%
    densely dashed, every mark/.append style={solid, fill=white},mark=diamond*\\%
    densely dashed, every mark/.append style={solid, fill=black}, mark=diamond*\\%
}

\begin{filecontents}{p2.dat}
SAT ETCY-5  ETCX-5  ETCY-10 ETCX-10 AR-5    AR-10
100 0.46    0.50    0.54    0.61    0.17    0.25
90  0.45    0.48    0.53    0.59    0.18    0.25
80  0.43    0.47    0.51    0.58    0.19    0.27
70  0.41    0.45    0.49    0.57    0.21    0.30
60  0.39    0.44    0.48    0.55    0.25    0.35
50  0.37    0.42    0.46    0.54    0.30    0.44
40  0.35    0.40    0.44    0.52    0.38    0.57
30  0.33    0.37    0.42    0.51    0.50    0.71
20  0.29    0.34    0.39    0.48    0.63    0.87
10  0.24    0.29    0.34    0.45    0.78    1.04
0   0.18    0.23    0.29    0.41    0.92    1.22
\end{filecontents}

\begin{document}

\pgfplotstableread{p2.dat}{\2}

\begin{tikzpicture}
\begin{axis}[
cycle list name=my black white,
title={Compressing Pressure: 0.2 MPa},
enlarge x limits=-1,
xmin=0, xmax=100,
xlabel={Water Saturation($S_w$)},
xtick={0,10,20,30,40,50,60,70,80,90,100},
xticklabels={0,10,20,30,40,50,60,70,80,90,100},
scaled ticks=true,
ymin=0, ymax=0.7,
ylabel={Avg. ETC \quad $\frac{K_{eff}}{K_s}$ $(Dimensionless)$},
legend style ={ at={(0.25,0.4)},
    anchor=north west, draw=none, font=\normalsize,
    fill=white,align=left},
smooth
]

`
\addplot  table [x={SAT}, y={ETCX-5}] {\2};
\addlegendentry{$K_{eff(x)}-Overlap \quad 5\% $};

\addplot  table [x={SAT}, y={ETCY-5}] {\2};
\addlegendentry{$K_{eff(y)}-Overlap \quad5\% $};

\addplot  table [x={SAT}, y={ETCX-10}] {\2};
\addlegendentry{$K_{eff(x)}-Overlap \quad10\% $};

\addplot  table [x={SAT}, y={ETCY-10}] {\2};
\addlegendentry{$K_{eff(y)}-Overlap \quad10\% $};

\end{axis}
\end{tikzpicture}%
\end{document}

The smoothness of the curves is not consistent. I was wondering if there is a way to use the hobby package and use the data in .dat file to produce smooth curves. The way I see it hobby uses absolute coordinates for drawing and not data points

migrated from tex.meta.stackexchange.com Apr 13 '17 at 6:44

This question came from our discussion, support, and feature requests site for users of TeX, LaTeX, ConTeXt, and related typesetting systems.

  • I don't quite see why you need smoothing here at all, to be honest. Would it represent your data better to add (artificial) curvature to the plots? Unrelated note: Your legend entries should probably be of the form $K_{\mathrm{eff}(x)}$ -- Overlap 5\% , and in the ylabel, you don't want Dimensionless in math mode, so remove the dollar signs around that. – Torbjørn T. Apr 13 '17 at 7:43
1

As mentioned in the manual for the hobby library, it supports use with pgfplots. It's just a matter of adding \usetikzlibrary{hobby} to the preamble, and saying e.g.

\addplot +[hobby] {rnd};

Hence, replacing smooth in your code with hobby works.

That said, I wouldn't do this myself, there is hardly any change from the default linear interpolation.

Note the changes I made to legend entries and ylabel as well.

enter image description here

\documentclass[border=5mm]{standalone}
\usepackage{pgfplots}
\usetikzlibrary{hobby}
\usepackage{filecontents}
\pgfplotsset{compat=1.9, every tick label/.append style={font=\normalsize}}


\pgfplotscreateplotcyclelist{my black white}{%
    solid,smooth, every mark/.append style={solid, fill=white}, mark=triangle*\\%
    solid, every mark/.append style={solid, fill=black}, mark=triangle*\\%
    densely dashed, every mark/.append style={solid, fill=white},mark=diamond*\\%
    densely dashed, every mark/.append style={solid, fill=black}, mark=diamond*\\%
}

\begin{filecontents}{p2.dat}
SAT ETCY-5  ETCX-5  ETCY-10 ETCX-10 AR-5    AR-10
100 0.46    0.50    0.54    0.61    0.17    0.25
90  0.45    0.48    0.53    0.59    0.18    0.25
80  0.43    0.47    0.51    0.58    0.19    0.27
70  0.41    0.45    0.49    0.57    0.21    0.30
60  0.39    0.44    0.48    0.55    0.25    0.35
50  0.37    0.42    0.46    0.54    0.30    0.44
40  0.35    0.40    0.44    0.52    0.38    0.57
30  0.33    0.37    0.42    0.51    0.50    0.71
20  0.29    0.34    0.39    0.48    0.63    0.87
10  0.24    0.29    0.34    0.45    0.78    1.04
0   0.18    0.23    0.29    0.41    0.92    1.22
\end{filecontents}

\begin{document}

\pgfplotstableread{p2.dat}{\2}

\begin{tikzpicture}
\begin{axis}[
cycle list name=my black white,
title={Compressing Pressure: 0.2 MPa},
xmin=0, xmax=100,
xlabel={Water Saturation($S_w$)},
xtick distance=10,
ymin=0, ymax=0.7,
ylabel={Avg. ETC \quad $\frac{K_{\mathrm{eff}}}{K_s}$ (Dimensionless)},
legend style ={ at={(0.25,0.4)},
    anchor=north west, draw=none, font=\normalsize,
    fill=white,align=left,
    cells={anchor=west} %% <-- added
},
hobby
]


\addplot  table [x={SAT}, y={ETCX-5}] {\2};
\addlegendentry{$K_{\mathrm{eff}(x)}$ -- Overlap 5\% };

\addplot  table [x={SAT}, y={ETCY-5}] {\2};
\addlegendentry{$K_{\mathrm{eff}(y)}$ -- Overlap 5\% };

\addplot  table [x={SAT}, y={ETCX-10}] {\2};
\addlegendentry{$K_{\mathrm{eff}(x)}$ -- Overlap 10\% };

\addplot  table [x={SAT}, y={ETCY-10}] {\2};
\addlegendentry{$K_{\mathrm{eff}(y)}$ -- Overlap 10\% };

\end{axis}
\end{tikzpicture}%
\end{document}

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.