PGFplots: scatter usando 'colormap access = direct' risulta in PGF Math Error
Vorrei produrre un grafico a dispersione utilizzando pgfplotspunti appartenenti a classi diverse. I colori dei punti devono essere determinati tramite una colonna di classe nei dati, che fa riferimento a un indice in una mappa di colori.
\documentclass[margin=10pt]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.16}
\begin{document}
\begin{tikzpicture}
\pgfplotsset{colormap={mymap}{
rgb=(0.8,0.0,0.0)
rgb=(0.0,0.8,0.0)
rgb=(0.0,0.0,0.8)
}}
\begin{axis}
\addplot [
scatter,
mark=*,
only marks,
point meta=\thisrowno{2},
% colormap access=direct % NB
] table {
0 0 0
1 1 1
2 2 0
};
\end{axis}
\end{tikzpicture}
\end{document}
Finora, la mappatura dei colori funziona come una mappa lineare . Questo significa:
- I punti esterni sono resi rossi (meta valore più basso => valore di colore più basso)
- Il punto interno viene visualizzato in blu (meta valore più alto => valore di colore più alto)
Vorrei utilizzare la mappa dei colori come tavolozza dei colori , in modo da poter specificare direttamente il colore utilizzato, indipendentemente dal meta valore degli altri punti:
- I punti esterni dovrebbero essere resi rossi (meta valore 0 => scegli il colore 0 dalla mappa dei colori)
- Il punto interno dovrebbe essere reso verde (meta valore 1 => scegli il colore 1 dalla mappa dei colori)
La documentazione include un esempio (immagine "Lena"), utilizzando colormap access=direct. Sembra che sia esattamente ciò di cui hai bisogno:
La scelta "diretta" non compie alcuna trasformazione; interpreta il valore di
point metacome indici interi nella mappa dei colori corrente.
Tuttavia, quando attivato, ottengo il seguente errore:
Errore matematico PGF pacchetto: impossibile analizzare l'input "0.8,0.0,0.0" come numero in virgola mobile, mi dispiace. La parte illeggibile era vicina a ', 0.0,0.0' ..
C'è una sfilza di ulteriori errori, inclusi Runaway argument?, ma li considero subordinati all'errore di root.
L'errore non si verifica se colormap access=directè commentato. Il problema si verifica con pdflatex, lualatex su TeX Live 2019; L'ho eseguito anche su Overleaf, che utilizza pdflatex su TeX Live 2020, risultando nello stesso errore.
Posso pensare a una soluzione alternativa: dividere i dati in classi separate e usarne uno \addplotper classe, specificando individualmente il colore corrispondente. Sembra complicato.
Sai perché viene visualizzato l'errore? Sto facendo qualcosa di sbagliato?
Risposte
Non chiedermi troppo perché, ma dopo aver letto il pgfplotsmanuale cercando di scoprire perché il tuo esempio non funziona, ho scoperto che colormap access=directfunziona bene qui se si usa \addplot[point meta=explicit symbolic, ...] table[meta index=2] .... Usare explicitinvece di explicit symbolicriporta lo stesso errore del tuo esempio. Trovo che questo sia un po 'strano, perché matrix plotnell'esempio del manuale usato per illustrare colormap access=direct(vedere la sezione Usare le mappe dei colori come spazio colore indicizzato (tavolozza) a p. 236 nel Revision 1.17 (2020/02/29)manuale), il meta punto viene trattato numericamente con point meta=explicit. Sembrerebbe che scatternon gestisca point metaallo stesso modo di matrix plot.
\documentclass[tikz,border=2mm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.16}
\begin{document}
\begin{tikzpicture}
\pgfplotsset{colormap={mymap}{
rgb=(0.8,0.0,0.0)
rgb=(0.0,0.8,0.0)
rgb=(0.0,0.0,0.8)
}}
\begin{axis}
\addplot [
scatter,
mark=*,
only marks,
point meta=explicit symbolic,
colormap access=direct,
] table[meta index=2] {
0 0 0
1 1 1
2 2 0
};
\end{axis}
\end{tikzpicture}
\end{document}
Si noti che non è necessario fornire indici nella definizione della mappa di colori con questa soluzione: produce
0 0,8 0 rg
per il punto centrale nel flusso PDF, senza alcuna necessità di utilizzare la seguente sintassi dalla risposta :
rgb(0)=(0.8,0.0,0.0)
rgb(1)=(0.0,0.8,0.0)
rgb(2)=(0.0,0.0,0.8)
Non è necessario fornire point meta mino point meta maxnessuno dei due. La tavolozza sembra essere utilizzata in modo semplice.
Usando i tasti point meta mine point meta max, possiamo diffondere la gamma di indici di colore utilizzati, fornendoci una mappatura indipendente da quali meta valori si trovano effettivamente nei dati. Ciò significa che il punto centrale è infatti reso verde:
\documentclass[margin=10pt]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.16}
\begin{document}
\begin{tikzpicture}
\pgfplotsset{colormap={mymap}{
rgb=(0.8,0.0,0.0)
rgb=(0.0,0.8,0.0)
rgb=(0.0,0.0,0.8)
}}
\begin{axis}
\addplot [
scatter,
mark=*,
only marks,
point meta=\thisrowno{2},
point meta min=0,
point meta max=2, % the max color of the colormap
] table {
0 0 0
1 1 1
2 2 0
};
\end{axis}
\end{tikzpicture}
\end{document}
Potremmo lasciarlo qui, ma l'ispezione del PDF generato mostra un verde leggermente sbagliato per il punto centrale:
0,00004 0,79995 0 rg
L'utilizzo delle coordinate della mappa dei colori aiuta qui:
\pgfplotsset{colormap={mymap}{
rgb(0)=(0.8,0.0,0.0)
rgb(1)=(0.0,0.8,0.0)
rgb(2)=(0.0,0.0,0.8)
}}
Dandoci:
0 0,8 0 rg
Si noti che quest'ultima aggiunta di per sé (utilizzando le coordinate della mappa di colori) non è una soluzione al problema originale, anche se combinata con colormap access=direct.