Исключить определенные точки графика из сглаживания

Исключить определенные точки графика из сглаживания
  1. Как исключить определенные координаты из сглаживания с помощью опции «сглаживание» на графике PGF?
  2. Как избежать \closedcycleскачков до нуля?

Вот мой пример:

\documentclass{minimal}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage[utf8]{inputenc}
\usepackage{pgfplots}
\pgfplotsset{compat=1.9}

\begin{document}
\begin{tikzpicture} 
\begin{axis}[
axis lines=center,
xtick=\empty,
ytick=\empty,
plot a/.style={semithick,red,smooth},
plot b/.style={semithick,blue,smooth},
plot error/.style={thick,orange,smooth},
]

\addplot[plot a] coordinates {
(1.400,0.484) (1.450,0.464) (1.500,0.442) (1.550,0.419) (1.600,0.395) (1.650,0.370)
(1.700,0.346) (1.750,0.321) (1.800,0.297) (1.850,0.273) (1.900,0.249) (1.950,0.227)
(2.000,0.205) (2.050,0.185) (2.100,0.166) (2.150,0.148) (2.200,0.131) (2.250,0.116)
(2.300,0.102) (2.350,0.089) (2.400,0.077) (2.450,0.067) (2.500,0.057) };

\addplot[plot b] coordinates {
(1.400,0.111) (1.450,0.120) (1.500,0.130) (1.550,0.139) (1.600,0.150) (1.650,0.160)
(1.700,0.171) (1.750,0.183) (1.800,0.194) (1.850,0.206) (1.900,0.218) (1.950,0.230)
(2.000,0.242) (2.050,0.254) (2.100,0.266) (2.150,0.278) (2.200,0.290) (2.250,0.301)
(2.300,0.312) (2.350,0.323) (2.400,0.333) (2.450,0.343) (2.500,0.352) };

\addplot[plot error] coordinates{
(2.300,0.312) (2.250,0.301) (2.200,0.290) (2.150,0.278) (2.100,0.266) (2.050,0.254)
(2.000,0.242) (1.950,0.230) (1.946,0.2287) (1.950,0.227) (2.000,0.205) (2.050,0.185)
(2.100,0.166) (2.150,0.148) (2.200,0.131) (2.250,0.116) (2.300,0.102) } \closedcycle;

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

Результирующий участок

Проблемы двоякие:

  1. Левый угол оранжевого треугольника нанесен неправильно из-за сглаживания. (Это можно увидеть более наглядно, если увеличить полученный PDF-файл.) Мне нужна опция, smoothчтобы оранжевый график правильно следовал синему графику (первая половина) и красному графику (вторая половина). Но точка, в которой оранжевый график перестает следовать синему графику и начинает следовать красному графику, не должна быть сглажена, поскольку это недифференцируемая точка. Есть ли возможность исключить отдельные точки графика из сглаживания?
  2. Оранжевый график прерывается, \closedcycleпотому что я хочу использовать эту fillопцию позже. Но это заставляет график сначала перейти к нулю, как можно увидеть на рисунке. Есть ли возможность закрыть график прямой линией от конца до начальной точки?

решение1

Если вы можете использовать самые последниеpgfplotsверсия (1.10) включает новую fillbewteenбиблиотеку, которая может заполнить любую область между двумя кривыми.

Вам необходимо присвоить имя каждому пути ( name path=), а затем использовать эти имена для заполнения областей между ними.

При таком решении не возникает проблем с «гладкими orнедифференцируемыми точками».

\documentclass[border=3mm]{standalone}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage[utf8]{inputenc}
\usepackage{pgfplots}
%\pgfplotsset{compat=1.9}
\usepgfplotslibrary{fillbetween}

\begin{document}
\begin{tikzpicture} 
\begin{axis}[
axis lines=center,
xtick=\empty,
ytick=\empty,
plot a/.style={semithick,red,smooth},
plot b/.style={semithick,blue,smooth},
plot error/.style={thick,orange,smooth},
]

\addplot[plot a, name path=A] coordinates {
(1.400,0.484) (1.450,0.464) (1.500,0.442) (1.550,0.419) (1.600,0.395) (1.650,0.370)
(1.700,0.346) (1.750,0.321) (1.800,0.297) (1.850,0.273) (1.900,0.249) (1.950,0.227)
(2.000,0.205) (2.050,0.185) (2.100,0.166) (2.150,0.148) (2.200,0.131) (2.250,0.116)
(2.300,0.102) (2.350,0.089) (2.400,0.077) (2.450,0.067) (2.500,0.057) };

\addplot[plot b, name path=B] coordinates {
(1.400,0.111) (1.450,0.120) (1.500,0.130) (1.550,0.139) (1.600,0.150) (1.650,0.160)
(1.700,0.171) (1.750,0.183) (1.800,0.194) (1.850,0.206) (1.900,0.218) (1.950,0.230)
(2.000,0.242) (2.050,0.254) (2.100,0.266) (2.150,0.278) (2.200,0.290) (2.250,0.301)
(2.300,0.312) (2.350,0.323) (2.400,0.333) (2.450,0.343) (2.500,0.352) };

%\addplot[plot error, name path=C] coordinates{
%(2.300,0.312) (2.250,0.301) (2.200,0.290) (2.150,0.278) (2.100,0.266) (2.050,0.254)
%(2.000,0.242) (1.950,0.230) (1.946,0.2287) (1.950,0.227) (2.000,0.205) (2.050,0.185)
%(2.100,0.166) (2.150,0.148) (2.200,0.131) (2.250,0.116) (2.300,0.102) } \closedcycle;

%\draw[name path=vertical] (axis cs:2.3,0)--(axis cs:2.3,5);

\addplot[fill=none] fill between [of=A and B,
    soft clip={domain=1:2.3},
    split,
    every segment no 1/.style={fill=orange}];
\end{axis}
\end{tikzpicture}
\end{document}

введите описание изображения здесь

Связанный контент