
Estoy haciendo un gráfico grupal de curvas relacionadas. Dado que están relacionados por un parámetro, quiero colorearlos según (una función de) ese parámetro. Para ello, utilicé la opción de malla y luego utilicé el punto meta para indicar qué color debería tener. Sin embargo, la leyenda es una cuadrícula y quiero que sea una línea de color. ¿Cuál es la forma más limpia de hacer esto?
Encontré la publicación relacionadaLeyenda con marcadores para trazado de mallapero no pude adaptarlo a mi caso.
\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}
Respuesta1
Lo que intentas lograr es posible. Sin embargo, en realidad se trata más bien de una solicitud de función (lo que explica por qué plantea dificultades).
El problema surge porque una leyenda nonotener los mismos valores de datos de color (también conocidos como "meta de puntos") que su gráfico asociado. Y desde mi punto de vista, esto es realmente lo que uno espera. En tu ejemplo has utilizado point meta
para definir un color, y veo que te resulta útil. Sin embargo, la leyenda no puede saber el color resultante.
La falta de asignación de colores en una leyenda es un problema inherente al enfoque aquí. Sin embargo, puede colocar line legend
después mesh
para generar una leyenda de línea (con el color incorrecto por el motivo explicado anteriormente).
Tenga en cuenta que su ejemplo realmente generadosleyendas porque las opciones posteriores \begin{groupplot}
se aplican aambossiguientes ejes.
Dicho esto, uno puede cumplir con su solicitud de función con una llamada API relativamente simple. Debido a que pgfplots viene sin una API pública de nivel básico, este comando no está documentado. Asigna un valor escalar a algún mapa de color.
La idea es definir un color para cada valor posible deln(\be)
por adelantadoy usar estos colores predefinidos más adelante:
\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}
Un paso importante es calcular el límite inferior y superior de los ln(\be)
valores; de lo contrario, el mapeo es imposible. El bucle real implica un poco de control de expansión básico; comparar¿Dónde empiezo a programar en LaTeX?para detalles.
El \addplot+
comando también necesita ampliarse; de lo contrario \be
se perdería el valor. Esto se debe a que draw=...
se evalúa en la "fase de visualización" que se inicia en \end{groupplot}
(no antes). Y draw=...
simplemente recordaría el valor no expandido que depende de \be
.
Mantuve intacta la segunda trama para permitir una comparación simple. Es posible que desee adoptarlo si esta respuesta se adapta a sus necesidades.
Tenga en cuenta que agregué id=...
para evitar llamadas repetidas a gnuplot en mi máquina y que tuve que reemplazar no marks
por mark=none
(esto último parece ser un error o un problema de usabilidad en pgfplots, me encargaré de ello).
Vea también una aplicación relacionada de búsquedas personalizadas en el mapa de colores en Dibujar mapas de calor usando TikZ
Ahora que he implementado todo eso; Me incliné hacia atrás y me di cuenta de que podría haber sido mucho más útil volver a implementar su caso de uso mediante cycle list
s. Estas listas son la forma en que pgfplots normalmente maneja diferentes colores; son fáciles de usar y totalmente compatibles cuando se trata de leyendas. Si cree que cycle lists
son mejores (tal vez realmente quiera un mapa de colores, entonces no lo son), puede encontrar más información en el manual de pgfplots.