
Я делаю групповой график связанных кривых. Поскольку они связаны параметром, я хочу раскрасить их в соответствии с (функцией) этого параметра. Для этой цели я использовал опцию сетки, а затем использовал метаданные точки, чтобы указать, какой цвет она должна иметь. Однако легенда тогда представляет собой сетку сетки, и я хочу, чтобы она была цветной линией. Какой самый чистый способ сделать это?
Я нашел соответствующий постЛегенда с маркерами для сетчатого графикано я не смог адаптировать его к своему случаю.
\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 list
s. Эти списки — это то, как pgfplots обычно обрабатывает различные цвета; они просты в использовании и полностью поддерживаются, когда дело доходит до легенд. Если вы считаете, что это cycle lists
лучше (возможно, вам действительно нужна цветовая карта, тогда это не так), вы можете найти больше информации в руководстве pgfplots.