Легенда линий для сетчатых графиков

Легенда линий для сетчатых графиков

Я делаю групповой график связанных кривых. Поскольку они связаны параметром, я хочу раскрасить их в соответствии с (функцией) этого параметра. Для этой цели я использовал опцию сетки, а затем использовал метаданные точки, чтобы указать, какой цвет она должна иметь. Однако легенда тогда представляет собой сетку сетки, и я хочу, чтобы она была цветной линией. Какой самый чистый способ сделать это?

Я нашел соответствующий постЛегенда с маркерами для сетчатого графикано я не смог адаптировать его к своему случаю.

 \begin{tikzpicture}
    \begin{groupplot}[group style={group size={2 by 1},
                      xlabels at=edge bottom,
                      xticklabels at=edge bottom},
                    axis lines=left, domain=-5:5,
                    xlabel=$x$,
                    width=0.5\textwidth,colormap/hot,
                    legend columns=-1,
                    legend entries={ $\beta=0.1$, $\beta=0.5$,
                    $\beta=0.8$, $\beta=1.0$, $\beta=2.0$, $\beta=5.0$},
                    legend to name={fig:mm_temp_legend}]
                    ]
      \nextgroupplot[ylabel={$p(x)$}]
      \pgfplotsforeachungrouped \be/\zedd in {
                0.1/12.4595,
                0.5/18.3263,
                0.8/29.6888,
                1.0/43.0372,
                2.0/403.539,
                5.0/1.07923e6 } {
        \addplot+[line legend,samples=200,no marks,solid,mesh,point meta={ln(\be)}]
        gnuplot {exp(\be*(0.4*(x-0.3)**2-0.02*x**4))/\zedd};
      }
      %
      \nextgroupplot[ylabel={$-\log p(x)$},ymin=0]
      \pgfplotsforeachungrouped \be/\zedd in {
                0.1/12.4595,
                0.5/18.3263,
                0.8/29.6888,
                1.0/43.0372,
                2.0/403.539,
                5.0/1.07923e6 } {
        \addplot+[samples=200,no marks,solid,mesh,point meta={ln(\be)}]
        gnuplot {\be*(-0.4*(x-0.3)**2+0.02*x**4)+log(\zedd)};
      }
    \end{groupplot}
  \end{tikzpicture}

вот как это выглядит

решение1

То, чего вы пытаетесь достичь, возможно. Однако, на самом деле, это скорее запрос на функцию (что объясняет, почему это вызывает трудности).

Проблема возникает из-за того, что легенда не...нетимеют те же значения цветовых данных (т. н. "мета-точки"), что и связанный с ним график. И с моей точки зрения, это на самом деле то, чего можно ожидать. В вашем примере вы использовали point metaдля определения цвета, и я вижу, что это полезно для вас. Однако легенда не может знать результирующий цвет.

Отсутствие цветового отображения в легенде является неотъемлемой проблемой подхода здесь. Однако вы можете разместить line legendпосле meshдля генерации легенды линии (с неправильным цветом по причине, описанной выше).

Обратите внимание, что ваш пример на самом деле генерируетдвалегенды, потому что параметры после \begin{groupplot}применяются кобаследующие оси.

Тем не менее, можно выполнить ваш запрос на функцию с помощью относительно простого вызова API. Поскольку pgfplots поставляется без общедоступного базового уровня API, эта команда недокументирована. Она отображает скалярное значение в некоторую цветовую карту.

Идея состоит в том, чтобы определить один цвет для каждого возможного значенияln(\be) заранееи использовать эти предопределенные цвета в дальнейшем:

\documentclass{article}

\usepackage{pgfplots}
\pgfplotsset{compat=1.7}
\usepgfplotslibrary{groupplots}


\begin{document}
\thispagestyle{empty}

\pgfplotsset{
    colormap/hot,
}%
\pgfmathparse{ln(0.1)}%
\let\BEMIN=\pgfmathresult

\pgfmathparse{ln(5)}%
\let\BEMAX=\pgfmathresult

% FIRST: define one color for every value of \be :
\pgfplotsforeachungrouped \be in {
        0.1,
        0.5,
        0.8,
        1.0,
        2.0,
        5.0} {
    \pgfmathparse{ln(\be)}
    \let\value=\pgfmathresult
    %
    \pgfplotscolormapaccess
            [\BEMIN:\BEMAX]% IMPORTANT for the mapping.
            {\value}
            {\pgfkeysvalueof{/pgfplots/colormap name}}
    % now, \pgfmathresult contains {<R>,<G>,<B>}
    % 
    \edef\temp{\noexpand\definecolor{be color \be}{rgb}{\pgfmathresult}}%
    %
    % now, \temp contains '\definecolor{be color 0.1}{rgb}{<R>,<G>,<B>}'
    \temp
}

\begin{tikzpicture}
    \begin{groupplot}[group style={group size={2 by 1},
                      xlabels at=edge bottom,
                      xticklabels at=edge bottom},
                    axis lines=left, domain=-5:5,
                    xlabel=$x$,
                    width=0.5\textwidth,%colormap/hot,
                    legend columns=-1,
                    ]
                    ]
      \nextgroupplot[ylabel={$p(x)$},
        % HINT: I added 'legend entries here as opposed to the environment:
        % only ONE sub-plot should have legend, not both
        legend entries={ $\beta=0.1$, $\beta=0.5$,
            $\beta=0.8$, $\beta=1.0$, $\beta=2.0$, $\beta=5.0$},
        legend to name={fig:mm_temp_legend},
    ]

      \pgfplotsforeachungrouped \be/\zedd in {
                0.1/12.4595,
                0.5/18.3263,
                0.8/29.6888,
                1.0/43.0372,
                2.0/403.539,
                5.0/1.07923e6 } {
        % NOTE: I replaced 'no marks' by 'mark=none'. Seems as if 'no
        % marks' does not make it into the legend (!?)
        %
        % this \edef\temp is required to expand 'draw=be color \be' to
        % 'draw=be color 0.1' etc:
        \edef\temp{%
            \noexpand\addplot+[draw=be color \be,id=\be,samples=200,mark=none,solid,]
                gnuplot {exp(\be*(0.4*(x-0.3)**2-0.02*x**4))/\zedd};
        }%
        \temp
      }
      %
      \nextgroupplot[ylabel={$-\log p(x)$},ymin=0]
      \pgfplotsforeachungrouped \be/\zedd in {
                0.1/12.4595,
                0.5/18.3263,
                0.8/29.6888,
                1.0/43.0372,
                2.0/403.539,
                5.0/1.07923e6 } {
        \addplot+[id=2_\be,samples=200,no marks,solid,mesh,point meta={ln(\be)}]
        gnuplot {\be*(-0.4*(x-0.3)**2+0.02*x**4)+log(\zedd)};
      }
    \end{groupplot}
  \end{tikzpicture}

  \ref{fig:mm_temp_legend}
\end{document}

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

Важным шагом является вычисление нижнего и верхнего предела значений ln(\be), в противном случае отображение невозможно. Фактический цикл включает в себя немного базового управления расширением; сравнитеС чего начать программирование LaTeX?для получения подробной информации.

Команду \addplot+также необходимо развернуть; в противном случае \beзначение будет потеряно. Это происходит потому, что draw=...оценивается в «фазе визуализации», которая начинается в \end{groupplot}(не раньше). И draw=...просто запомнит неразвернутое значение, которое зависит от \be.

Я оставил второй участок нетронутым, чтобы обеспечить простое сравнение. Вы можете захотеть принять его, если этот ответ соответствует вашим потребностям.

Обратите внимание, что я добавил это, id=...чтобы избежать повторных вызовов gnuplot на моей машине, и что мне пришлось заменить no marksна mark=none(последнее, похоже, является ошибкой или проблемой удобства использования в pgfplots, я займусь этим).

См. также связанное применение пользовательских подстановок в цветовой карте в Рисование тепловых карт с помощью TikZ


Теперь, когда я реализовал все это; я откинулся назад и понял, что было бы гораздо полезнее перереализовать ваш вариант использования с помощью cycle lists. Эти списки — это то, как pgfplots обычно обрабатывает различные цвета; они просты в использовании и полностью поддерживаются, когда дело доходит до легенд. Если вы считаете, что это cycle listsлучше (возможно, вам действительно нужна цветовая карта, тогда это не так), вы можете найти больше информации в руководстве pgfplots.

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